| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1179 人关注过本帖
标题:怎样求两个超长整数的加法?
只看楼主 加入收藏
jj369258
Rank: 4
等 级:业余侠客
帖 子:116
专家分:226
注 册:2010-12-2
结帖率:69.57%
收藏
已结贴  问题点数:10 回复次数:2 
怎样求两个超长整数的加法?
怎样求大整数加法?
搜索更多相关主题的帖子: 加法 整数 
2010-12-22 00:08
heartnheart
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
帖 子:335
专家分:1096
注 册:2009-7-10
收藏
得分:7 
最简单的方法是用数组保留整数的每一位,然后从数的最低位向最高位做加法,就像笔算一样。注意进位
2010-12-22 07:44
周天帝
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2016-1-3
收藏
得分:0 
回复 楼主 jj369258
#include<stdio.h>
#include<string.h>
void main()
{
    char a[1000],b[1000],c[1001]={0},flag;   //flag用来判断结果的正负,c用来保存结果
    int i,j,k,m,n,len;
    printf("输入的a,b的位数在10位以上1000位以下\n");
    printf("请输入第一个字符串a:\n");
    scanf("%s",a);
    printf("请输入第二个字符串b:\n");
    scanf("%s",b);
    //计算并比较两个字符串的长度,将长度大的作为减数,长度小的作为被减数。
    m=strlen(a);
    n=strlen(b);
    len=(m>n)?m:n;    //相减时,先将右边对齐,即将i指向a的右端,j指向b的右端,然后i,j对齐,同时向左边移动,知道一个到头为止
    for(i=m-1,j=n-1,k=len-1;i>=0&&j>=0;i--,j--,k--)
    {
        c[k]=(a[i]-'0'-b[j]-'0'+flag)%10+'0';
        flag=(a[i]-'0'-b[j]-'0'+flag)/10;
    }
    for(;i>=0;i--,k--)           //若a更长,则处理a
    {
        c[k]=(a[i]-'0'+flag)%10+'0';
        flag=(a[i]-'0'+flag)/10;
    }
    for(;j>=0;j--,k--)     //若b更长,则处理b
    {
        c[k]=(b[j]-'0'+flag)%10+'0';
        flag=(b[j]-'0'+flag)/10;
    }
    if(flag!=0)
    {
        for(k=len-1;k>0;k--)
            c[k]=c[k-1];
        c[0]=flag+'0';
    }
    printf("%s",c);
}
void addition(char *numa, char *numb,char *result) // 计算两大数之和
{
  char *pna = findend(numa); // 指向numa的一个指针。point numa pna 指向乘数的最低位,
  char *pnb = findend(numb); //指向numb的一个指针 //pnb 指向被乘数的最低位,
  int along=(int)strlen(numa); //标记数字a的长度;
  int blong=(int)strlen(numb); //标记数字b的长度;
  int times = 0; // 标致要计算多少次。
  int carry=0,temp_result; //存贮进位 和临时结果的
  Node *head, // 用于存贮头指针
    *pstart, // 用于存贮计算时的首指针
    *pnew; //作于申请新结点
  head = pstart =new Node; //初始化首结点和头结点。
  pstart -> data = 0;
  pstart -> next = NULL;
  pstart -> ahead = NULL;
  if (abigerb(numa ,numb)>=1)
  times = (int)strlen(numa); //比较两个字符串长度,以大的作为循环次数
  else
    {
      times = (int)strlen(numb);
      pna = findend(numb); //交换指针
      pnb = findend(numa);
    along=(int)strlen(numb); //标记数字a的长度;
    blong=(int)strlen(numa); //标记数字b的长度;
    }
    while ((times-- && (times>=0))|| carry != 0)
    {
      if(!pstart->next) //如果当前为空结点,则申请新结点
      {
        pnew = new Node;
        pnew -> data = 0;
        pnew -> next = NULL;
        pnew -> ahead = pstart;
        pstart -> next = pnew;
      }
      else temp_result =(pstart->data +(*pna-48)+(*pnb-48)+carry) ; //自身的值+新值+进位 作为当前的新值
      pstart -> data = temp_result%10; //存贮个位
      carry = temp_result/10; //存贮进位
      pstart = pstart -> next; //结点移动
    blong--;
      if(blong>0)pnb--; //指针移向被加数高位
      else *pnb=48; //之后相减就变为了0不作任何运算;
      pna--; //加数指针移动,
    }
  pstart =head; //寻找链表的结尾点
  while(pstart->next != 0)
  {
  pstart->data += 48; //!!<<<因为我们的输出是字符。所以再此加上48>>>> 逆顺输出
  pstart = pstart->next ;
  }
  int tip = 0; //转为字符串用
    pstart = pstart->ahead ; //找有效字
     //cout<<"n结果是 : ";
    while(pstart != 0) //输出正序的结果;
    {
    result[tip++] = pstart->data;
     //cout< data;
    pstart = pstart->ahead ;
    }
    result[tip] = '';
  pstart =head; //释放空间
  while(pstart->next != 0)
  {
  pnew = pstart->next ;delete pstart;
  pstart =pnew;
  }
  return ;
}
2016-01-03 20:07
快速回复:怎样求两个超长整数的加法?
数据加载中...
 
   



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

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