| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 9455 人关注过本帖
标题:C语言中怎么实现两个超大整数的相加减乘除?
只看楼主 加入收藏
andyzt406
Rank: 2
等 级:论坛游民
帖 子:43
专家分:37
注 册:2009-11-24
结帖率:0
收藏
已结贴  问题点数:20 回复次数:7 
C语言中怎么实现两个超大整数的相加减乘除?
C语言中怎么实现两个超大整数的相加减乘除?
搜索更多相关主题的帖子: C语言 整数 加减乘除 
2010-12-17 20:15
freedgun
Rank: 5Rank: 5
等 级:职业侠客
帖 子:147
专家分:302
注 册:2010-11-11
收藏
得分:5 
#include<stdio.h>
main()
{
    double a=9E100,b=1E100,sum;    //9*10的100次方够不够
    sum=a*b;
    printf("%.1lf\n",sum);
}

有什么样的付出,就有什么样的收获!!
2010-12-17 21:26
qhxxbc
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:163
专家分:174
注 册:2010-9-14
收藏
得分:5 
回复 2楼 freedgun
这个运行结果正确吗?

非计算机专业自学新手向大家请教
2010-12-17 21:31
andyzt406
Rank: 2
等 级:论坛游民
帖 子:43
专家分:37
注 册:2009-11-24
收藏
得分:0 
期待正确的解答
2010-12-17 21:36
xiaomarn
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:5
帖 子:348
专家分:2026
注 册:2009-3-18
收藏
得分:5 
字符串
unsigned int 数组
考虑下进位
2010-12-17 21:43
qhxxbc
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:163
专家分:174
注 册:2010-9-14
收藏
得分:0 
运行一下这个
main()
{
    double a=10E100,b=10E100,sum;   
    sum=a*b;
    printf("%.1lf\n",sum);
}

可以看出得出的结果是错误的

非计算机专业自学新手向大家请教
2010-12-17 21:45
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
收藏
得分:5 
以下是引用freedgun在2010-12-17 21:26:04的发言:

#include<stdio.h>
main()
{
    double a=9E100,b=1E100,sum;    //9*10的100次方够不够
    sum=a*b;
    printf("%.1lf\n",sum);
}



傻不傻??
2010-12-18 13:20
liufashuai
Rank: 9Rank: 9Rank: 9
来 自:冥界-魔域-魂殿
等 级:蜘蛛侠
威 望:1
帖 子:370
专家分:1374
注 册:2012-6-22
收藏
得分:0 
程序代码:
#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;i<MAXINT;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;i<MAXINT;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 (len>1 && 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;i<MAXINT;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;i<MAXINT;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 (len>1 && 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 (len>1 && 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;i<MAXINT;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 (j>0 && d[j]==0)        //去掉高位0
                      j--;
                d[0]=j;
            c[i]++;                           //商所在位值加1
      }
   }
   j=b[0];
   while (c[j]==0 && j>0) 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");
}

有一种落差是,你配不上自己的野心,也辜负了所受的苦难。






2013-08-08 13:53
快速回复:C语言中怎么实现两个超大整数的相加减乘除?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.023834 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved