久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標(biāo)題:
大整數(shù)(25000位)的四則運(yùn)算C語(yǔ)言源程序
[打印本頁(yè)]
作者:
no1xijin
時(shí)間:
2018-7-2 10:43
標(biāo)題:
大整數(shù)(25000位)的四則運(yùn)算C語(yǔ)言源程序
研究密碼學(xué)過(guò)程中,遇到數(shù)據(jù)位比較長(zhǎng),c語(yǔ)言本身具有的數(shù)據(jù)類型無(wú)法滿足超長(zhǎng)位數(shù)的整數(shù)進(jìn)行四則運(yùn)算,因此特意寫了這個(gè)程序。
參考了網(wǎng)上部分類似代碼,目前網(wǎng)上能找到的類似代碼,基本都有部分瑕疵,本文將我發(fā)現(xiàn)的瑕疵全部改進(jìn)。
本文能實(shí)現(xiàn)25000位整數(shù)的加減乘除運(yùn)算,經(jīng)過(guò)本人的測(cè)試,基本正常。最大位數(shù)只驗(yàn)證了4位,25000位未驗(yàn)證。希望有興趣的黑友,幫忙下載測(cè)試,若發(fā)現(xiàn)問(wèn)題,希望能在評(píng)論中提出,我將會(huì)及時(shí)改進(jìn),謝謝。
以下代碼在vc6.0中編譯運(yùn)行通過(guò),將下列代碼全部放于一個(gè).c文件中即可。
關(guān)于程序細(xì)節(jié)方面,見(jiàn)下文的程序注釋。
/**************************************************************
*功能:實(shí)現(xiàn)大整數(shù)的加減乘除四則運(yùn)算,最大位長(zhǎng)為MAX-1,1為符號(hào)位
*思路:利用數(shù)組實(shí)現(xiàn),盡量將四則運(yùn)算封裝成函數(shù);
* 1.開(kāi)始菜單;數(shù)組初始化,避免影響第二次運(yùn)算結(jié)果接收數(shù)據(jù);提示信息
* 2.接收數(shù)據(jù)
* 3.先判斷進(jìn)行哪種運(yùn)算(加減乘除退出),再判斷輸入的兩個(gè)數(shù)據(jù)是否為0
* (加減時(shí),若ab都為0,則直接輸出結(jié)果0;乘時(shí),則ab任一為0,則直接輸出結(jié)果0;
* 除時(shí),b為0,則輸出提示“輸入錯(cuò)誤”,b不為0a為0,則直接輸出結(jié)果0);
* 4.再判斷a和b的符號(hào)
* 加時(shí):同號(hào)相加則調(diào)加;+-相加則將-變+再調(diào)減;-+相加,將-變+,再調(diào)換成+-,再調(diào)減
* 減時(shí):++相減則調(diào)減;+-相減則將-變+再調(diào)加;-+相減則將+變-再調(diào)加;--相減,將-變+再交換ab值,再調(diào)減
* 乘時(shí):異號(hào)相乘結(jié)果添'-'號(hào),同號(hào)相乘不處理;ab符號(hào)皆調(diào)正,子函數(shù)不處理符號(hào)位
* 除時(shí):異號(hào)相除結(jié)果添'-'號(hào),同號(hào)相乘不處理;ab符號(hào)皆調(diào)正,子函數(shù)不處理符號(hào)位;若有小數(shù)則,則用余數(shù)形式顯示。
* 5.調(diào)用子函數(shù)處理數(shù)據(jù)
* 5.輸出結(jié)果
*注意!!:數(shù)組定義大小要注意,計(jì)算結(jié)果有的比最大位數(shù)大1,有的大2倍+1;
* 因內(nèi)存限制了數(shù)組下標(biāo),MAX最大值為25001,本程序運(yùn)行正常;超出此值,程序運(yùn)行將出現(xiàn)問(wèn)題!!!
*測(cè)試數(shù)據(jù):加法:0+0=0;0+5=5;5+0=5;5+5=10;5+(-8)=-3;(-8)+5=-3;(-5)+(-5)=-10
* 11+12=23;11+123=134;123+11=134; -11+12=1;-11+123=112;-123+11=-112
* 80848+36678623=36759471;-2998602+(-44953)=-3043555;-8+39639213=39639205
* 減法:0-0=0;0-5=-5;5-0=5;5-5=0;5-(-8)=13;(-8)-5=-13;(-5)-(-5)=0
* 11-12=-1;11-123=-112;123-11=112; -11-12=-23;-11-123=-134;-123-11=-134;
* -5429891960-(5838364)=-5435730324;5039-(-41490954)=41495993
* 乘法:0*0=0;0*5=0;5*0=0;5*5=25;5*(-8)=-40;(-8)*5=-40;(-5)*(-5)=25
* 11*12=132;11*123=1353;123*11=1353; -11*12=-132;-11*123=-1353;-123*11=-1353;
* -49*(-128)=6272 4268*13197386=56326443448
* 除法:0/0=--;0/5=0;5/0=--;5/5=1;5/(-8)=-0……5;(-8)/5=-1……3;(-5)/(-5)=1
* 11/12=0……11;11/123=0……11;123/11=11……2; -11/12=-0……11;-11/123=-0……11;-123/11=-11……2;
* 043714/956540=0(輸入數(shù)據(jù)不規(guī)范)默認(rèn)數(shù)據(jù)最高位非0
* 7425776/338=21969……254
* 8784015415/3545=2477860……1715
* 將#define MAX 25001 改為 #define MAX 5;再將a=b=9999,分別進(jìn)行加減乘除,結(jié)果分別為19998、0、99980001、1
* 驗(yàn)證最大位數(shù)計(jì)算正確與否 再將a=b=-9999,分別進(jìn)行加減乘除,結(jié)果分別為-19998、0、99980001、1
* 驗(yàn)證結(jié)束后,根據(jù)實(shí)際情況,改其值 再將a=9999,b=-9999,分別進(jìn)行加減乘除,結(jié)果分別為0、19998、-99980001、-1
* 再將a=-9999,b=9999,分別進(jìn)行加減乘除,結(jié)果分別為0、-19998、-99980001、-1
**************************************************************/
#include <stdio.h>
#define MAX 25001 // 大數(shù)的最大位數(shù),包括一位符號(hào)位,實(shí)際數(shù)字位數(shù)為MAX-1
/*****************************************
*功能說(shuō)明:打印菜單函數(shù)
* 僅提示用戶選擇何種運(yùn)算
* 不接收不判斷數(shù)據(jù)
*****************************************/
void menu() //菜單
{
printf("===============大整數(shù)(最大數(shù)字位數(shù)25000位)計(jì)算器==================\n");
printf("1.加法 2.減法 3.乘法 4.除法 0.退出\n");
printf("請(qǐng)從0~4中選擇:");
}
/*****************************************
*功能說(shuō)明: 讀入所要計(jì)算的數(shù)值,數(shù)據(jù)初始化
*參數(shù)說(shuō)明: a[]第一個(gè)數(shù)值, b[]第二個(gè)數(shù)值
* *p1第一個(gè)數(shù)值長(zhǎng)度(包括符號(hào)位)
* *p2第二個(gè)數(shù)值長(zhǎng)度(包括符號(hào)位)
*其他說(shuō)明: 參數(shù)傳遞都采用傳地址的方式,
* 調(diào)用本函數(shù)前,需要提前定義好相關(guān)變量
* 數(shù)組存儲(chǔ)數(shù)據(jù)為大端方式:
* 即:數(shù)值-12在數(shù)組中的下標(biāo)依次為0,1,2
* 數(shù)組第0位為符號(hào)位,0為正,非0為負(fù)
*****************************************/
void init(int a[], int b[], int *p1, int *p2) // 輸入
{
int i,j;
char r,s;
for(i=0;i<MAX;i++) // 數(shù)組清零,以確保第二次之后的運(yùn)行結(jié)果不受影響
{
a[i]=0;
b[i]=0;
}
printf("請(qǐng)輸入(0123456789+-)中的任意字符\n請(qǐng)輸入第一個(gè)(a)數(shù)值:"); // 默認(rèn)輸入正確,不進(jìn)行判斷
r=getchar();
if(r=='-') // "-" 輸入負(fù)數(shù)
{
a[0]=r;
for(i=1;(r=getchar())!='\n';i++)
a[i]=r-48;
}
else // 輸入正數(shù)
{
a[1]=r-48;
for(i=2;(r=getchar())!='\n';i++)
a[i]=r-48;
}
*p1=i;
printf("請(qǐng)輸入第二個(gè)(b)數(shù)值:"); // 默認(rèn)輸入正確,不進(jìn)行判斷
s=getchar();
if(s=='-')
{
b[0]=s;
for(j=1;(s=getchar())!='\n';j++)
b[j]=s-48;
}
else
{
b[1]=s-48;
for(j=2;(s=getchar())!='\n';j++)
b[j]=s-48;
}
*p2=j;
}
/*****************************************
*功能說(shuō)明: 兩個(gè)同號(hào)整數(shù)相加(++、--)
*參數(shù)說(shuō)明: a[]第一個(gè)數(shù)值, b[]第二個(gè)數(shù)值
* c[]第一二數(shù)值相加的結(jié)果
* 返回值i為c[]數(shù)組的長(zhǎng)度,即結(jié)果的實(shí)際長(zhǎng)度
* m第一個(gè)數(shù)值長(zhǎng)度(包括符號(hào)位)
* n第二個(gè)數(shù)值長(zhǎng)度(包括符號(hào)位)
*其他說(shuō)明: 數(shù)組參數(shù)傳遞采用傳地址的方式,
* 調(diào)用本函數(shù)前,需要提前定義好相關(guān)變量
* a[],b[],c[]數(shù)組存儲(chǔ)數(shù)據(jù)為大端方式:
* 即:數(shù)值-12在數(shù)組中的下標(biāo)依次為0,1,2
* d[]數(shù)組存儲(chǔ)數(shù)據(jù)為小端方式:
* 即:數(shù)值-12在數(shù)組中的下標(biāo)依次為2,1,0
*****************************************/
int plus(int a[], int b[], int c[], int m, int n) //加法運(yùn)算
{
int d[MAX+1]={0},i,j,k; // 和比最大位數(shù)可能長(zhǎng)1位
if(a[1]==0) // 處理a+b時(shí),有a為0的情況
{
for(i=0;i<n;i++)
c[i]=b[i];
return(i);
}
if(b[1]==0) // 處理a+b時(shí),有b為0的情況
{
for(i=0;i<m;i++)
c[i]=a[i];
return(i);
}
for(i=m-1,j=n-1,k=1;i>0&&j>0;i--,j--,k++) // 處理a+b時(shí),有a,b都不為0的情況
{
d[k]=a[i]+b[j]+d[k];
if(d[k]>9) // 處理和進(jìn)位的情況
{
d[k+1]=1;
d[k]=d[k]-10;
}
}
while(i>0) // 處理a+b時(shí), a長(zhǎng)度>b長(zhǎng)度的情況
{
d[k]=d[k]+a[i];
if(d[k]>9)
{
d[k+1]=1;
d[k]=d[k]-10;
}
k++;
i--;
}
while(j>0) // 處理a+b時(shí), a長(zhǎng)度<b長(zhǎng)度的情況
{
d[k]=d[k]+b[j];
if(d[k]>9)
{
d[k+1]=1;
d[k]=d[k]-10;
}
k++;
j--;
}
d[0]=a[0]+b[0];
c[0]=d[0];
if(d[k]==0) // 數(shù)值和最高位沒(méi)有進(jìn)位
k--;
for(i=1;k>0;i++,k--)
c[i]=d[k];
return(i);
}
/*****************************************
*功能說(shuō)明: 兩個(gè)正整數(shù)相減 (++)
*參數(shù)說(shuō)明: a[]第一個(gè)數(shù)值, b[]第二個(gè)數(shù)值
* c[]第一二數(shù)值相減的結(jié)果
* 返回值i為d[]數(shù)組的長(zhǎng)度,即結(jié)果的實(shí)際長(zhǎng)度
* m第一個(gè)數(shù)值長(zhǎng)度(包括符號(hào)位)
* n第二個(gè)數(shù)值長(zhǎng)度(包括符號(hào)位)
*其他說(shuō)明: 數(shù)組參數(shù)傳遞采用傳地址的方式,
* 調(diào)用本函數(shù)前,需要提前定義好相關(guān)變量
* a[],b[],c[]數(shù)組存儲(chǔ)數(shù)據(jù)為大端方式:
* 即:數(shù)值-12在數(shù)組中的下標(biāo)依次為0,1,2
* d[]數(shù)組存儲(chǔ)數(shù)據(jù)為小端方式:
* 即:數(shù)值-12在數(shù)組中的下標(biāo)依次為2,1,0
*****************************************/
int minus(int a[], int b[], int c[], int m, int n) //減法運(yùn)算
{
int d[MAX+1]={0},i,j,k,T; // 多一位可能存在的借位位
if (m<n) // a<b 位
{
a: T=m;
m=n;
n=T;
for(i=m-1,j=n-1,k=1;i>0&&j>0;i--,j--,k++)
{
if(d[k]<0||b[i]<a[j]) // 有借位情況
{
d[k]=d[k]+b[i]-a[j];
if(d[k]<0)
{
d[k]+=10;
d[k+1]=-1;
}
}
else // 無(wú)借位情況
d[k]=b[i]-a[j];
}
while(i>0)
{
d[k]=d[k]+b[i];
if(d[k]<0)
{
d[k]+=10;
d[k+1]--;
}
k++;
i--;
}
d[k]=b[i]+d[k];
while(d[k]<=0&&k>0)
k--;
for(i=1;k>0;i++)
c[i]=d[k--];
c[0]=45;
return(i);
}
if(m>n) // a>b 位
{
b: for(i=m-1,j=n-1,k=1;i>0&&j>0;i--,j--,k++)
{
if(d[k]<0||a[i]<b[j]) // 有借位情況
{
d[k]=d[k]+a[i]-b[j];
if(d[k]<0)
{
d[k]+=10;
d[k+1]=-1;
}
}
else // 無(wú)借位情況
d[k]=a[i]-b[j];
}
while(i>0)
{
d[k]=d[k]+a[i];
if(d[k]<0)
{
d[k]+=10;
d[k+1]--;
}
k++;
i--;
}
d[k]=a[i]+d[k];
while(d[k]<=0&&k>0)
k--;
for(i=1;k>0;i++)
c[i]=d[k--];
return(i);
}
// a==b 位數(shù)
{
for(i=1; i<m; i++)
{
if(a[i]>b[i]) // a>b 數(shù)值
goto b;
else if(a[i]<b[i]) // a<b 數(shù)值
goto a;
}
c[0]=0; //a=b
c[1]=0;
return 2;
}
}
/*****************************************
*功能說(shuō)明: 兩個(gè)整數(shù)相乘
*注:函數(shù)運(yùn)算過(guò)程中未處理符號(hào)
*參數(shù)說(shuō)明: a[]第一個(gè)數(shù)值, b[]第二個(gè)數(shù)值
* c[]第一二數(shù)值相乘的結(jié)果
* 返回值k為c[]數(shù)組的長(zhǎng)度,即結(jié)果的實(shí)際長(zhǎng)度(包括符號(hào)位)
* m第一個(gè)數(shù)值長(zhǎng)度(包括符號(hào)位)
* n第二個(gè)數(shù)值長(zhǎng)度(包括符號(hào)位)
*其他說(shuō)明: 數(shù)組參數(shù)傳遞采用傳地址的方式,
* 調(diào)用本函數(shù)前,需要提前定義好相關(guān)變量
* a[],b[],c[]數(shù)組存儲(chǔ)數(shù)據(jù)為大端方式:
* 即:數(shù)值-12在數(shù)組中的下標(biāo)依次為0,1,2
* d[]數(shù)組存儲(chǔ)數(shù)據(jù)為小端方式:
* 即:數(shù)值-12在數(shù)組中的下標(biāo)依次為2,1,0
*★ Comba 乘法 (Comba Multiplication)原理實(shí)現(xiàn)
* Comba 乘法以(在密碼學(xué)方面)不太出名的 Paul G. Comba 得名。
* 和普通的筆算乘法很類似,只是每一次單精度乘法只是單純計(jì)算乘法,不計(jì)算進(jìn)位,進(jìn)位留到每一列累加后進(jìn)行。
* Comba 乘法無(wú)需進(jìn)行嵌套進(jìn)位來(lái)計(jì)算乘法,時(shí)間復(fù)雜度和基線乘法一樣
* Comba 乘法則按列計(jì)算,先累加,然后傳遞進(jìn)位,減少了計(jì)算量,所以速度快。
************************************************************/
int multi(int a[], int b[], int c[], int m, int n) //正整數(shù)乘法運(yùn)算
{
int d[2*MAX+1]={0},i,j,k,s;
for(i=0;i<MAX;i++)
c[i]=0;
if(m<=n) // a位數(shù)大于等于b位數(shù)
{
for(i=m-1,s=1;i>0;i--,s++) // 單純計(jì)算乘法,不計(jì)算進(jìn)位
{
for(j=n-1,k=1*s;j>0;j--,k++)
{
d[k]=a[i]*b[j]+d[k];
}
}
for(i=1;i<k;i++) // 處理進(jìn)位
{
if(d[i]>9)
{
d[i+1]=d[i+1]+d[i]/10;
d[i] = d[i]%10;
}
}
if(d[i]==0) // 數(shù)值和最高位沒(méi)有進(jìn)位
i--;
for(k=1;i>0;k++,i--)
c[k]=d[i];
return k;
}
else // a位數(shù)大于b位數(shù)
{
for(i=n-1,s=1;i>0;i--,s++) // 單純計(jì)算乘法,不計(jì)算進(jìn)位
{
for(j=m-1,k=1*s;j>0;j--,k++)
{
d[k]=b[i]*a[j]+d[k];
}
}
// 處理進(jìn)位
for(i=1;i<k;i++)
{
if(d[i]>9)
{
d[i+1]=d[i+1]+d[i]/10;
d[i] = d[i]%10;
}
}
if(d[i]==0) // 數(shù)值和最高位沒(méi)有進(jìn)位
i--;
for(k=1;i>0;k++,i--)
c[k]=d[i];
return k;
}
}
/*****************************************
*功能說(shuō)明: 用長(zhǎng)度為len1的大整數(shù)p1減去長(zhǎng)度為len2的大整數(shù)p2
* 結(jié)果存在p1中,返回值代表結(jié)果的長(zhǎng)度
* 不夠減:返回-1 , 正好夠:返回0
*數(shù)組數(shù)值為:p1,p2小端
*其他說(shuō)明: 數(shù)組參數(shù)傳遞采用傳地址的方式,
* 調(diào)用本函數(shù)前,需要提前定義好相關(guān)變量
* 本函數(shù)的作用僅與Division函數(shù)結(jié)合實(shí)現(xiàn)除法
*****************************************/
int SubStract(int *p1, int len1, int *p2, int len2)
{
int i;
if(len1 < len2)
return -1;
if(len1 == len2 )
{ // 判斷p1 > p2
for(i = len1-1; i >= 0; i--)
{
if(p1[i] > p2[i]) // 若大,則滿足條件,可做減法
break;
else if(p1[i] < p2[i]) // 否則返回-1
return -1;
}
}
for(i = 0; i <= len1-1; i++) // 從低位開(kāi)始做減法
{
p1[i] -= p2[i]; // 相減
if(p1[i] < 0) // 若是否需要借位
{ // 借位
p1[i] += 10;
p1[i+1]--;
}
}
for(i = len1-1; i >= 0; i--) // 查找結(jié)果的最高位
{
if( p1[i] ) //最高位第一個(gè)不為0
return (i+1); //得到位數(shù)并返回
}
return 0; //兩數(shù)相等的時(shí)候返回0
}
/*****************************************
*功能說(shuō)明: 大數(shù)除法---結(jié)果不包括小數(shù)點(diǎn)
**注:函數(shù)運(yùn)算過(guò)程中未處理符號(hào)
*參數(shù)說(shuō)明: a[]被除數(shù) b[]除數(shù)
* c[]第一二數(shù)值相除的結(jié)果即:a/b=c
* 返回值len為c[]數(shù)組的長(zhǎng)度,即結(jié)果的實(shí)際長(zhǎng)度
* m第一個(gè)數(shù)值長(zhǎng)度(包括符號(hào)位)
* n第二個(gè)數(shù)值長(zhǎng)度(包括符號(hào)位)
* *p表示余數(shù)的位數(shù),位數(shù)大于0時(shí),表示有余數(shù);否則無(wú)余數(shù)
* num_a[]保存最后余數(shù)的
*其他說(shuō)明: 數(shù)組參數(shù)傳遞采用傳地址的方式,
* 調(diào)用本函數(shù)前,需要提前定義好相關(guān)變量
* a[],b[],c[],num_a[]數(shù)組存儲(chǔ)數(shù)據(jù)為大端方式:
* 即:數(shù)值-12在數(shù)組中的下標(biāo)依次為0,1,2
*****************************************/
int Division(int a[], int b[], int c[] , int m, int n, int *p, int num_a[])
{
int i, j;
int len=0;
int nTimes; //兩大數(shù)相差位數(shù)
int nTemp; //Subtract函數(shù)返回值
int num_b[MAX] = {0}; //除數(shù)
int num_c[MAX+1] = {0}; //商
if( m < n ) //如果被除數(shù)小于除數(shù),直接返回-1,表示結(jié)果為0……a
{
return -1;
}
if(m==n)
{
for(i=1; i<m; i++)
{
if(a[i]>b[i]) // 夠減一次否
break;
}
if(i==m && a[m-1]<b[m-1]) // 包含符號(hào)位
return -1; // 如果被除數(shù)小于除數(shù),直接返回-1,表示結(jié)果為0……a
}
nTimes = m - n; //相差位數(shù)
//翻轉(zhuǎn)保存的數(shù)據(jù)
for( j = 1, i = m-1; i >= 0; j++, i-- )
num_a[j] = a[i];
for( j = 1, i = n-1; i >= 0; j++, i-- )
num_b[j] = b[i];
for ( i=m-1; i>=0; i-- ) //將除數(shù)擴(kuò)大,使得除數(shù)和被除數(shù)位數(shù)相等
{
if ( i>=nTimes )
num_b[i] = num_b[i-nTimes];
else //低位置0
num_b[i] = 0;
}
n=m;
for( j=0; j<=nTimes; j++ ) //重復(fù)調(diào)用,同時(shí)記錄減成功的次數(shù),即為商
{
while((nTemp = SubStract(num_a,m,num_b + j,n - j)) >= 0)
{
m = nTemp; //結(jié)果長(zhǎng)度
num_c[nTimes-j]++;//每成功減一次,將商的相應(yīng)位加1
}
}
if(nTemp<0)
*p=m; // 有余數(shù)
else
*p=0; //無(wú)余數(shù)
// 計(jì)算商的位數(shù),并將商放在c數(shù)組中
for(i = MAX-1; num_c[i] == 0 && i >= 0; i-- ); //跳過(guò)高位0,獲取商的位數(shù)
if(i >= 0)
len = i + 1; // 保存位數(shù)
for(j = 1; i >= 0; i--, j++) // 將結(jié)果復(fù)制到c數(shù)組中
{
c[j] = num_c[i];
}
return len+1; // 返回商的位數(shù)
}
//功能說(shuō)明:主函數(shù),調(diào)用其余函數(shù),計(jì)算相應(yīng)功能的值并輸出
int main()
{
//積的位數(shù)最多是因數(shù)位數(shù)的兩倍
int a[MAX]={0}, b[MAX]={0}, c[2*MAX+1]={0}, Temp[MAX]={0};
int m,n;
int *p1,*p2;
int i, j;
int select;
int len;
int remainder;
p1=&m;
p2=&n;
while(1)
{
for(i=0;i<MAX;i++) // 初始化0,避免影響下一次運(yùn)行
{
a[i]=0;
b[i]=0;
c[i]=0;
Temp[i]=0;
}
for(;i<2*MAX+2;i++) // 初始化0,避免影響下一次運(yùn)行
{
c[i]=0;
}
menu(); // 僅輸出提示信息
select=getchar(); // 獲得四則運(yùn)算中的一個(gè)(1加2減3乘4除0退出)
getchar(); // 處理選擇時(shí)候的回車,避免第二次運(yùn)行無(wú)法重新選擇0~4
if(select =='0')
return 0; // 退出程序
else if(!(select>'0'&&select<'5'))
{
printf("輸入錯(cuò)誤!\n請(qǐng)從0~4中選擇一個(gè)數(shù)輸入!!\n\n");
continue;
}
init(a,b,p1,p2); // 獲取兩個(gè)數(shù)值
switch(select)
{
case '1':
{
if(a[1]==0&&b[1]==0) // 兩0相加
{
printf("a+b=0\n\n");
break;
}
printf("a+b=");
if(a[0]==b[0]) // 同號(hào)相加則調(diào)加
{
j=plus(a, b, c, m, n); //加法運(yùn)算
if(c[0]!=0)
printf("-");
for(i=1;i<j;i++)
printf("%d",c[i]);
printf("\n\n");
break;
}
if(a[0]==0 && b[0]!=0) // +-相加則將-變+再調(diào)減
{
b[0]=0; // 將b的符號(hào)變?yōu)?
j=minus(a, b, c, m, n); //減法運(yùn)算
if(c[0]!=0)
printf("-");
for(i=1;i<j;i++)
printf("%d",c[i]);
printf("\n\n");
break;
}
// -+相加,將-變+,再調(diào)換成+-,再調(diào)減
{
a[0]=0; // 將-變+
// 交換a,b數(shù)值
for(i=1; i<(m>n?m:n); i++)
{
Temp[i]=a[i];
a[i]=b[i];
b[i]=Temp[i];
}
// 交換a,b位數(shù)
i=m;
m=n;
n=i;
j=minus(a, b, c, m, n); //減法運(yùn)算
if(c[0]!=0)
printf("-");
for(i=1;i<j;i++)
printf("%d",c[i]);
printf("\n\n");
break;
}
}
case '2':
{
if(a[1]==0&&b[1]==0) // 兩0相減
{
printf("a-b=0\n\n");
break;
}
printf("a-b=");
if(a[0]==0&&b[0]==0) // ++相減則調(diào)減
{
j=minus(a, b, c, m, n); //減法運(yùn)算
if(c[0]!=0)
printf("-");
for(i=1;i<j;i++)
printf("%d",c[i]);
printf("\n\n");
break;
}
if(a[0]==0&&b[0]!=0) // +-相減則將-變+再調(diào)加
{
b[0]=0; // 將b的符號(hào)變?yōu)?
j=plus(a, b, c, m, n); //加法運(yùn)算
if(c[0]!=0)
printf("-");
for(i=1;i<j;i++)
printf("%d",c[i]);
printf("\n\n");
break;
}
if(a[0]!=0&&b[0]==0) // -+相減則將+變-再調(diào)加
{
b[0]='-'; // 將b的符號(hào)變?yōu)?
j=plus(a, b, c, m, n); //加法運(yùn)算
if(c[0]!=0)
printf("-");
for(i=1;i<j;i++)
printf("%d",c[i]);
printf("\n\n");
break;
}
// --相減,將-變+再交換ab值,再調(diào)減
{
a[0]=0; // 將-變+
b[0]=0;
// 交換a,b數(shù)值
for(i=1; i<(m>n?m:n); i++)
{
Temp[i]=a[i];
a[i]=b[i];
b[i]=Temp[i];
}
// 交換a,b位數(shù)
i=m;
m=n;
n=i;
j=minus(a, b, c, m, n); //減法運(yùn)算
if(c[0]!=0)
printf("-");
for(i=1;i<j;i++)
printf("%d",c[i]);
printf("\n\n");
break;
}
}
case '3':
{
if(a[1]==0||b[1]==0) // 任意個(gè)0相乘
{
printf("a*b=0\n\n");
break;
}
printf("a*b=");
if((a[0]==0&&b[0]!=0)||(a[0]!=0&&b[0]==0)) // 異號(hào)相乘結(jié)果添'-'號(hào),ab符號(hào)設(shè)為+,運(yùn)算中符號(hào)不起作用
printf("-");
a[0]=0;
b[0]=0;
j=multi(a, b, c, m, n); //正整數(shù)乘法運(yùn)算
for(i=1;i<j;i++)
printf("%d",c[i]);
printf("\n\n");
break;
}
case '4':
{
if(b[1]==0) // 除數(shù)為0
{
printf("輸入錯(cuò)誤!!\n除數(shù)不能為0!!!\n\n");
break;
}
else if(a[1]==0) //被除數(shù)為0
{
printf("a÷b=0\n\n");
break;
}
printf("a÷b=");
if((a[0]==0&&b[0]!=0)||(a[0]!=0&&b[0]==0)) // 異號(hào)相除結(jié)果添'-'號(hào),ab符號(hào)設(shè)為+,運(yùn)算中符號(hào)不起作用
printf("-");
len = Division(a, b, c, m, n, &remainder, Temp);
//輸出結(jié)果
if( len>0 )
{
for(i = 1; i < len; i++ )
printf("%d", c[i]);
if(remainder>0) // 有余數(shù),輸出余數(shù)
{
printf("……");
for(i=remainder-1; i>0; i--)
printf("%d", Temp[i]);
}
}
else
{
printf("0……");
for(i = 1; i < m; i++ )
printf("%d", a[i]);
}
printf("\n\n");
break;
}
}
}
return 0;
}
復(fù)制代碼
作者:
admin
時(shí)間:
2018-7-3 03:16
好資料,51黑有你更精彩!!!
作者:
kui1380
時(shí)間:
2018-7-3 18:03
666666
作者:
君任知命
時(shí)間:
2019-6-25 13:39
請(qǐng)問(wèn)單片機(jī)該如何做大數(shù)運(yùn)算?
作者:
君任知命
時(shí)間:
2019-6-25 13:40
請(qǐng)問(wèn)單片機(jī)該怎么進(jìn)行大數(shù)運(yùn)算?
作者:
no1xijin
時(shí)間:
2019-6-26 09:13
君任知命 發(fā)表于 2019-6-25 13:39
請(qǐng)問(wèn)單片機(jī)該如何做大數(shù)運(yùn)算?
你可以試試把這個(gè)程序移植進(jìn)去,把最大位數(shù)先設(shè)置為10以下的進(jìn)行測(cè)試,等該程序移植測(cè)試成功后,再把最大位數(shù)往上調(diào)。這個(gè)程序,除了輸入輸出函數(shù)和最大位數(shù)以外,其他的應(yīng)該是與單片機(jī)內(nèi)的程序無(wú)差別。
歡迎光臨 (http://m.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
欧美亚洲激情
|
国产一级片免费在线观看
|
国产精品久久久久久久久久三级
|
久久精品国产一区二区电影
|
一区二区三区四区不卡视频
|
欧美一区二区三
|
成人不卡视频
|
精品欧美久久
|
操视频网站
|
国产精品日韩欧美一区二区
|
国产农村一级国产农村
|
午夜a区
|
欧美一级片在线
|
国产精品美女久久久久久久网站
|
国产午夜亚洲精品不卡
|
成人av一区
|
国产黄色大片在线免费观看
|
久艹av
|
日韩综合在线播放
|
久操亚洲
|
久久美女网
|
av手机免费在线观看
|
综合久久99
|
女同av亚洲女人天堂
|
久久久久免费精品国产
|
成人午夜在线
|
日韩视频在线播放
|
罗宾被扒开腿做同人网站
|
免费久久网
|
国产精品久久久久久久久图文区
|
久久久久久高潮国产精品视
|
久久亚洲国产
|
一区二区三区四区av
|
国产成人精品网站
|
亚洲精品黄色
|
日韩欧美国产精品
|
九色综合网
|
成人在线免费网站
|
亚洲欧洲精品在线
|
精品三区
|
成人影院一区二区三区
|