本文目录一览:
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; } 我的高精度模版。