您的位置:

大数相除c语言,c语言小数除大数

本文目录一览:

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; } 我的高精度模版。