大数除法函数c语言 除法运算c语言

c语言大数除法算法

#include stdio.h

创新互联致力于互联网品牌建设与网络营销,包括网站建设、网站制作、SEO优化、网络推广、整站优化营销策划推广、电子商务、移动互联网营销等。创新互联为不同类型的客户提供良好的互联网应用定制及解决方案,创新互联核心团队10年专注互联网开发,积累了丰富的网站经验,为广大企业客户提供一站式企业网站建设服务,在网站建设行业内树立了良好口碑。

#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语言大整数除法

#include "stdio.h"

#include "math.h"

void main(void)

{

int a,b,c,d,e,g;

float f;

printf("int a,b");

scanf("%d %d",a,b);

c=a+b;

d=a-b;

e=a*b;

f=a/(float)b ;

g=a%b;

printf("c=%d\n d=%d\n e=%d\n f=%f\n g=%d\n",c,d,e,f,g);

}

整数除整数得到的一定是整数,这个和c语言中的自动类型转换有关,按照我上面写的,把b强制转换成浮点型,这样得到的结果就是浮点型,还有输出浮点型数时用 %f 。

C语言 100位大整数除法 最好用字符串或者数组

#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);

bigmult(a,div,c);

bigmult2(a,b,c);

bigdiv(a,div,c,res);

bigdiv2(a,b,c,d);

getchar();

return 0;

}

int compare(int a[],int b[]) //比较大整数的大小

{

int i;

if (a[0]b[0]) return 1; //比较a,b的位数确定返回值

else if (a[0]b[0]) return -1;

else //位数相等时的比较

{

i=a[0];

while (a[i]==b[i]) //逐位比较

i--;

if (i==0) return 0;

else if (a[i]b[i]) return 1;

else return -1;

}

}

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 bigmult(int a[],unsigned int b,int c[])//高精度乘以低精度

{

int len,i;

for (i=0;iMAXINT;i++) //数组清0

c[i]=0;

len=a[0];

for(i=1;i=len;i++) //对每一位计算

{

c[i]+=a[i]*b;

c[i+1]+=c[i]/10;

c[i]%=10;

}

while (c[++len]=10) //处理高位

{

c[len+1]=c[len]/10;

c[len]%=10;

}

if (c[len]==0) len--; //处理高进位为0情况

printf("Big integrs multi small integer: ";

for (i=len;i=1;i--)

printf("%d",c[i]);

printf("\n";

}

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 bigdiv(int a[],unsigned int b,int c[],int *d) //高精度除以低精度

{ //a[] 为被乘数,b为除数,c[]为结果,d为余数

int i,len;

len=a[0]; //len为a[0]的数组长度

for (i=len;i=1;i--)

{

(*d)=10*(*d)+a[i]; //计算每一步余数

c[i]=(*d)/b; //计算每一步结果

(*d)=(*d)%b; //求模余数

}

while (len1 c[len]==0) len--; //去高位0

printf("Big integer div small integer: ";

for (i=len;i=1;i--) //打印结果

printf("%d",c[i]);

printf("\tArithmetic compliment:%d",*d);

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语言 除法运算c语言
本文地址:http://scyanting.com/article/ddoppee.html