本文目錄一覽:
c語言大數除法算法
#include stdio.h
#include string.h
#define MAXSIZE 1025
void Div(char *str1, char *str2, char *str3)
{
int i1, i2, i, j, jj, tag, carry, cf, c[MAXSIZE];
int len1 = strlen(str1), len2 = strlen(str2), lend;
char d[MAXSIZE];
memset(c, 0, sizeof(c));
memcpy(d, str1, len2);
lend = len2; j = 0;
for( i1=len2-1; i1 len1; ++i1 )
{
if( lend len2 )
{
d[lend] = str1[i1+1]; c[j] = 0;
++j; ++lend;
}
else
if( lend == len2 )
{
jj = 1;
for( i=0; i lend; ++i )
{
if( d[i] str2[i] ) break;
else if( d[i] str2[i] )
{
jj = 0; break;
}
}
if( jj == 0 )
{
d[lend] = str1[i1+1]; c[j] = 0;
++j; ++lend;
continue;
}
}
if( jj==1 || lend len2 )
{
cf = jj=0;
while( d[jj] = ‘0’ jj lend ) ++jj;
if( lend-jj len2 ) cf = 1;
else
if( lend-jj len2 ) cf = 0;
else
{
i2 = 0; cf = 1;
for( i=jj; i lend; ++i )
{
if( d[i] str2[i2] )
{
cf = 0; break;
}
else if( d[i] str2[i2] )
{
break;
}
++i2;
}
}//else
while( cf )
{
i2 = len2-1; cf = 0;
for( i=lend-1; i = lend-len2; –i )
{
d[i] = d[i]-str2[i2]+’0′;
if( d[i] ‘0’ )
{
d[i] = d[i]+10; carry = 1;
–d[i-1];
}
else carry = 0;
–i2;
}
++c[j]; jj=0;
while( d[jj] = ‘0’ jj lend ) ++jj;
if( lend-jj len2 ) cf = 1;
else
if( lend-jj len2 ) cf = 0;
else
{
i2 = 0; cf = 1;
for( i=jj; i lend; ++i )
{
if( d[i] str2[i2] )
{
cf = 0; break;
}
else if( d[i] str2[i2] )
{
break;
}
++i2;
}
}//else
}//while
jj = 0;
while( d[jj] = ‘0’ jj lend ) ++jj;
for( i=0;i lend-jj; ++i ) d[i] = d[i+jj];
d[i] = str1[i1+1]; lend = i+1;
++j;
}//else
}//for
i = tag = 0;
while( c[i] == 0 ) ++i;
for( ; i j; ++i, ++tag ) str3[tag] = c[i]+’0′;
str3[tag] = ‘\0’;
}
int main()
{
char a[110], b[110], c[110];
scanf( “%s%s”, a, b );
Div( a, b, c );
printf( “%s\n”, c );
return 0;
}
//只得到商的整數部分,小數部分沒有
怎樣勇C語言編一個大數除法程序
在超高精度算法中,最難的就是除法了。(乘法,加法,減法,都要會)
模擬人工算法吧(大數都採用字符數組!)
做除法運算,首先至少要會乘法。
123456789*5
運算如下:
9*5=5進4,5*8=0 加個位進位4 進4,以此類推
大數之間的比較,也要會,這個簡單就不說了,如果這個也不會,那我沒辦法說下去了!
除法如下:
把數字當放入字符數組….
假設:17346777412563/2365489
2365489(7位)
1734677(7位)
使用字符數組比較,如果是小於,那麼採用17346777(8位)
一.然後2365489*9=的結果跟17346777,如果大於就2365489*8….依次類推直到小於。求得結果的第一位了。
然後17346777-2365489*x=餘數跟(17346777後一位)4組合,看是否大於2365489,大於就
進入一步驟方式運算。小於的話,結果的第二位就是0。
大致思路講了,只要中間思路分析清楚,基本上不會有多大問題。總之,模擬人工。
這樣的話,不管多大的數字之間的除法都OK的!
思路不懂可以來問我,如果,要我寫代碼,就別找我了
用c語言 數組 做大數 加減乘除 急
參考代碼:
#include stdio.h
#define MAXINT 1000
int compare(int a[],int b[]);
int bigplus(int a[],int b[],int c[]);
int bigsub(int a[],int b[],int c[]);
int bigmult(int a[],unsigned int b,int c[]);
int bigmult2(int a[],int b[],int c[]);
int bigdiv(int a[],unsigned int b,int c[],int *d);
int bigdiv2(int a[],int b[],int c[],int d[]);
int main(int argc, char *argv[])
{
int a[MAXINT]={10,5,4,6,5,4,3,2,1,1,1}; //被乘數或被除數
int b[MAXINT]={7,7,6,5,4,3,2,1}; //乘數或除數
int c[MAXINT],d[MAXINT]; //c[]存放商,d[]存放餘數
int div=1234; //小乘數或小除數
int k=0;
int *res=k; //小餘數整數指針
bigplus(a,b,c);
bigsub(a,b,c);
bigmult2(a,b,c);
bigdiv2(a,b,c,d);
getchar();
return 0;
}
int bigplus(int a[],int b[],int c[]) //大整數加法
{
int i,len;
len=(a[0]b[0]?a[0]:b[0]); //a[0] b[0]保存數組長度,len為較長的一個
for(i=0;iMAXINT;i++) //將數組清0
c[i]=0;
for (i=1;i=len;i++) //計算每一位的值
{
c[i]+=(a[i]+b[i]);
if (c[i]=10)
{
c[i]-=10; //大於10的取個位
c[i+1]++; //高位加1
}
}
if (c[i+1]0) len++;
c[0]=len; //c[0]保存結果數組實際長度
printf(“Big integers add: “;
for (i=len;i=1;i–)
printf(“%d”,c[i]); //打印結果
printf(“\n”;
return 0;
}
int bigsub(int a[],int b[],int c[]) //大整數減法
{
int i,len;
len=(a[0]b[0]?a[0]:b[0]); //a[0]保存數字長度,len為較長的一個
for(i=0;iMAXINT;i++) //將數組清0
c[i]=0;
if (compare(a,b)==0) //比較a,b大小
{
printf(“Result:0”;
return 0;
}
else if (compare(a,b)0)
for (i=1;i=len;i++) //計算每一位的值
{
c[i]+=(a[i]-b[i]);
if (c[i]0)
{
c[i]+=10; //小於0的原位加10
c[i+1]–; //高位減1
}
}
else
for (i=1;i=len;i++) //計算每一位的值
{
c[i]+=(b[i]-a[i]);
if (c[i]0)
{
c[i]+=10; //小於0原位加10
c[i+1]–; //高位減1
}
}
while (len1 c[len]==0) //去掉高位的0
len–;
c[0]=len;
printf(“Big integers sub= “;
if (a[0]b[0]) printf(“-“;
for(i=len;i=1;i–) //打印結果
printf(“%d”,c[i]);
printf(“\n”;
return 0;
}
int bigmult2(int a[],int b[],int c[]) //高精度乘以高精度
{
int i,j,len;
for (i=0;iMAXINT;i++) //數組清0
c[i]=0;
for (i=1;i=a[0];i++) //被乘數循環
for (j=1;j=b[0];j++) //乘數循環
{
c[i+j-1]+=a[i]*b[j]; //將每一位計算累加
c[i+j]+=c[i+j-1]/10; //將每一次結果累加到高一位
c[i+j-1]%=10; //計算每一次的個位
}
len=a[0]+b[0]; //取最大長度
while (len1 c[len]==0) //去掉高位0
len–;
c[0]=len;
printf(“Big integers multi: “;
for (i=len;i=1;i–) //打印結果
printf(“%d”,c[i]);
printf(“\n”;
}
int bigdiv2(int a[],int b[],int c[],int d[]) //高精度除以高精度
{
int i,j,len;
if (compare(a,b)0) //被除數較小直接打印結果
{
printf(“Result:0”;
printf(“Arithmetic compliment:”;
for (i=a[0];i=1;i–) printf(“%d”,a[i]);
printf(“\n”;
return -1;
}
for (i=0;iMAXINT;i++) //商和餘數清0
{
c[i]=0;
d[i]=0;
}
len=a[0];d[0]=0;
for (i=len;i=1;i–) //逐位相除
{
for (j=d[0];j=1;j–)
d[j+1]=d[j];
d[1]=a[i]; //高位*10+各位
d[0]++; //數組d長度增1
while (compare(d,b)=0) //比較d,b大小
{
for (j=1;j=d[0];j++) //做減法d-b
{
d[j]-=b[j];
if (d[j]0)
{
d[j]+=10;
d[j+1]–;
}
}
while (j0 d[j]==0) //去掉高位0
j–;
d[0]=j;
c[i]++; //商所在位值加1
}
}
j=b[0];
while (c[j]==0 j0) j–; //求商數組c長度
c[0]=j;
printf(“Big integers div result: “;
for (i=c[0];i=1;i–) //打印商
printf(“%d”,c[i]);
printf(“\tArithmetic compliment: “; //打印餘數
for (i=d[0];i=1;i–)
printf(“%d”,d[i]);
printf(“\n”);
}
c語言大數相除和大數求摸怎麼實現?
1、大數就是位數多,數值大的意思。通常來說c語言里的基本數據類型範圍是有限的,如long型的最大只能表示幾十億,幾十億也就11位數字長度而已。如果用100長的數組表示,假設數組一個元素存數字的一位,那麼總位數可以達到100位,這是基本數據類型無法表示的。
2、例程:
#include”stdio.h”
int getlength(char a[]){
int i=0;
while(a[i])
i++;
return i;
}/*返回字符串的長度*/
int chartoint(char a){
return a-48;
}/*將字符編程整形*/
void creatarray(char a[],char b[]){
printf(“請輸入第一個數:”);
scanf(“%s”,a);
printf(“請輸入第二個數:”);
scanf(“%s”,b);
}/*創建數組*/
void go(char a[],char b[],int s[]){
int alength=getlength(a);
int blength=getlength(b);
int i=alength-1;
int j=blength-1;
int k;/*s數組下標*/
int slength;
if(alengthblength)
slength=alength;
else
slength=blength;
k=slength;
while(i=0j=0)
s[k–]=chartoint(a[i–])+chartoint(b[j–]);
while(i=0)
s[k–]=chartoint(a[i–]);
while(j=0)
s[k–]=chartoint(b[j–]);
k=slength;
while(k=2){
if(s[k]=10){
s[k-1]++;
s[k]-=10;
}
k–;
}
printf(“兩數之和為:”);
if(s[1]=10){
s[0]=1;
s[1]-=10;
for(i=0;i=slength;i++)
printf(“%d”,s[i]);
}
else{
for(i=1;i=slength;i++)
printf(“%d”,s[i]);
}
printf(“\n”);
}
void main(){
char a[1000],b[1000];
int s[1000];
int lab;
lab1: creatarray(a,b);
go(a,b,s);
printf(“請輸入1繼續(想退出按其他數字鍵):”);
scanf(“%d”,lab);
if(lab==1)
goto lab1;
}
C語言課程設計大數乘法和除法
#include stdio.h #include string.h #define MAXCHAR 20000 void Add (char *ch1 , char *ch2 , char *ch3) {// ch3 = ch1 + ch2; int len1 = strlen (ch1) , len2 = strlen (ch2) , len3 , i , tmp , num1[MAXCHAR] , num2[MAXCHAR] , num3[MAXCHAR]; memset (num1 , 0 , sizeof(num1)); memset (num2 , 0 , sizeof(num2)); memset (num3 , 0 , sizeof(num3)); for (i=len1-1;i=0;i–) num1[len1-1-i] = ch1[i] – 48; for (i=len2-1;i=0;i–) num2[len2-1-i] = ch2[i] – 48; i = 0 , tmp = 0 , len3 = len1 len2 ? len1 : len2; while (i len3) { num3[i] = num1[i] + num2[i] + tmp; tmp = 0; if (num3[i] = 10) { tmp = num3[i]/10; num3[i] %= 10; } i ++; } if (tmp != 0) { num3[i] = tmp; i ++; } len3 = i; for (i=len3-1;i=0;i–) ch3[len3-1-i] = num3[i] + 48; ch3[len3] = ‘\0’; return ; } void Minus (char *ch1 , char *ch2 , char *ch3) { // 保證 ch1 ch2 : ch3 = ch1 – ch2 int i , tmp , len1 = strlen (ch1) , len2 = strlen (ch2) , len3 , num1[MAXCHAR] , num2[MAXCHAR] , num3[MAXCHAR]; memset (num1 , 0 , sizeof(num1)); memset (num2 , 0 , sizeof(num2)); memset (num3 , 0 , sizeof(num3)); for (i=0;ilen1;i++) num1[len1-1-i] = ch1[i] – 48; for (i=0;ilen2;i++) num2[len2-1-i] = ch2[i] – 48; i = 0 , tmp = 0 , len3 = len1 len2 ? len1 : len2; while (i len3) { num3[i] = num1[i] – num2[i] – tmp; if (num3[i] 0) { num3[i] += 10 , tmp = 1; } else tmp = 0; i ++; } while (len3 1 num3[len3-1] == 0) len3 –; for (i=0;ilen3;i++) ch3[i] = num3[len3-1-i] + 48; ch3[len3] = ‘\0’; return ; } void MUL (char *ch1 , char *ch2 , char *ch3) {// ch3 = ch1*ch2; int i , j , len1 = strlen (ch1) , len2 = strlen (ch2) , len3 , tmp , num1[MAXCHAR] , num2[MAXCHAR] , num3[MAXCHAR]; memset (num1 , 0 , sizeof(num1)); memset (num2 , 0 , sizeof(num2)); memset (num3 , 0 , sizeof(num3)); for (i=len1-1;i=0;i–) num1[len1-1-i] = ch1[i] – 48; for (i=len2-1;i=0;i–) num2[len2-1-i] = ch2[i] – 48; for (i=0;ilen1;i++) { tmp = 0; for (j=0;jlen2;j++) { num3[i+j] += num1[i]*num2[j] + tmp; tmp = 0; if (num3[i+j] = 10) { tmp = num3[i+j]/10; num3[i+j] %= 10; } } while (tmp != 0) { num3[i+j] += tmp; tmp = num3[i+j]/10; j ++; } } len3 = len1+len2; while (len3 1 num3[len3-1] == 0) len3 –; for (i=0;ilen3;i++) ch3[len3-1-i] = num3[i] + 48; ch3[len3] = ‘\0’; return ; } int cmp (char *ch1 , char *ch2) {// ch1 ch2 return 1; ch1 ch2 return -1; ch1 == ch2 return 0; int i , len1 = strlen (ch1) , len2 = strlen (ch2); if (len1 len2) return 1; if (len2 len1) return -1; for (i=0;ilen1;i++) { if (ch1[i] ch2[i]) return 1; if (ch1[i] ch2[i]) return -1; } return 0; } void Div (char *ch1 , char *ch2 , char *ch3) {//保證ch1ch2 ch2 != 0 : ch3 = ch1/ch2 , ch1 = ch1%ch2 , 需要支持函數:cmp () , Minus (); int i , len1 , len2 , tmp; char ch4[MAXCHAR] , ch5[MAXCHAR]; ch3[0] = ‘0’ , ch3[1] = ‘\0’; while (cmp (ch1 , ch2) = 0) { len1 = strlen (ch1) , len2 = strlen (ch2); tmp = len1-len2-1 0 ? len1-len2-1 : 0; ch4[0] = ‘1’; memcpy (ch5 , ch2 , (len2+1)*sizeof(char)); for (i=0;itmp;i++) { ch4[1+i] = ‘0’ , ch5[len2+i] = ‘0’; } ch4[1+i] = ‘\0’; ch5[len2+i] = ‘\0’; Add (ch3 , ch4 , ch3); // ch3 += ch4; Minus (ch1 , ch5 , ch1); // ch1 -= ch5; } return ;} void Mod (char *ch1 , char *ch2) {// 保證ch1 = ch2 : ch1 %= ch2 , 需要支持函數:Minus () , cmp (); int i , len1 , len2 , tmp; char ch3[MAXCHAR]; while (cmp (ch1 , ch2) = 0) { len1 = strlen (ch1) , len2 = strlen (ch2); tmp = len1-len2-1 0 ? len1-len2-1 : 0; memcpy (ch3 , ch2 , (len2+1)*sizeof(char)); for (i=0;itmp;i++) ch3[len2 + i] = ‘0’; ch3[len2 + i] = ‘\0’; Minus (ch1 , ch3 , ch1); } return ; } int main () { char ch1[MAXCHAR] , ch2[MAXCHAR] , ch3[MAXCHAR]; while (scanf (“\n%s %s” , ch1 , ch2) != EOF) { Add(ch1,ch2,ch3); printf (“兩數之和:%s\n” , ch3); Minus(ch1,ch2,ch3); printf (“兩數之差:%s\n” , ch3); MUL(ch1,ch2,ch3); printf (“兩數之積:%s\n” , ch3); Div(ch1,ch2,ch3); printf (“兩數之商:%s\n” , ch3); } return 0; } 我的高精度模版。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/190600.html