| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3313 人关注过本帖
标题:一个大整数加法的问题。
只看楼主 加入收藏
Alien_Lee
Rank: 8Rank: 8
来 自:Linux帝国
等 级:蝙蝠侠
威 望:7
帖 子:149
专家分:739
注 册:2016-7-19
结帖率:83.33%
收藏
已结贴  问题点数:20 回复次数:6 
一个大整数加法的问题。
大的整数加法(大于24位,小于100位)。
函数原型为 void H_interger(char *s1,char *s2)
要求输出计算结果:
比如:
111111111111111111111+1234567891234567891234=13456789002345679002345

我编写的时候主要遇到两个困难:
1.字符型转长整形
2.进位的问题(主要是不进位但是结果全为9的问题)
字符型转整形解决了:
程序代码:
void addlong(char*str1, char* str2)//下面的代码主要分割字符成,每8位转成为一个整形存在二维数组中
{
    int q[2],r[2],i,j,k; //q存储商,r存储余数
    int tp1, tp2;
    long a[2][13] = {0};//用来存储分割结果
    char ts[9],*s1;
    i = strlen(str1); j = strlen(str2);
    printf("i=%d, j=%d\n", i, j);
    q[0] = i / 8; q[1] = j / 8;
    r[0] = i % 8; r[1] = j % 8;
    for (k = 0; k < 2; k++)
    {
        if (k == 0) s1 = str1;
        else s1 = str2;
        for (tp1 = 0; tp1 < r[k]; tp1++)
        {
            ts[tp1] = *(s1 + tp1);
        }
        ts[r[k]] = '\0';
       

        a[k][0] = atol(ts);
        for (tp1 = 0; tp1 < q[k]; tp1++)
        {
            for (tp2 = 0; tp2 < 8; tp2++)
                ts[tp2] = *(s1 + r[k] + tp1 * 8 + tp2);
            ts[8] = '\0';
            a[k][tp1+1] = atol(ts);
        }
    }
    for (tp1 = 0; tp1 < 2; tp1++) //输出分割结果
    {
        for (tp2 = 0; tp2 < 13; tp2++)
        {
            if (a[tp1][tp2] == 0) break;
            printf("%d\n", a[tp1][tp2]);
        }
    }

}
但是最后处理,不同位数的整数的进位的问题,不会做了,求各位网友帮帮忙!



[此贴子已经被作者于2016-9-20 14:49编辑过]

2016-09-20 14:48
ehszt
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:40
帖 子:1745
专家分:3216
注 册:2015-12-2
收藏
得分:0 
这个还真有难度,搞了一晚上没搞出来,果断放弃。不知道那个史丰收的速算法能不能拍上用场。
或者有其它什么好的算法,我还不知道。
2016-09-20 23:02
xzlxzlxzl
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖北
等 级:贵宾
威 望:125
帖 子:1091
专家分:5825
注 册:2014-5-3
收藏
得分:7 
这题...也不是那么难吧。用数组(比如100位就定义两个101),把数组右对齐(不需对齐的算法也有),按位加,处理好进位就行了。
2016-09-21 01:22
ehszt
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:40
帖 子:1745
专家分:3216
注 册:2015-12-2
收藏
得分:10 
回复 楼主 Alien_Lee
按楼上的算法已解决。
#include<stdio.h>
 #include<string.h>
 char *add(char *a,char *b)
 {
     int m,n,len,i,cy=0,flag1=0,flag2=0;
     char *p1,*p2,w,c[101]={0};
    m= strlen(a),n=strlen(b);
    if(m>n)len=m;
    else len=n;
    for(p1=a+m-1,p2=b+n-1,i=len;i>=0;i--)
    {
        w=*p1+*p2-'0'+cy;
        if(flag1&&!flag2)w=w-*p1+'0';
        if(flag2&&!flag1)w=w-*p2+'0';
        if(flag1&&flag2);
        if(p1!=a&&!flag1)p1--;
        else flag1=1;
        if(p2!=b&&!flag2)p2--;
        else flag2=1;

         if(w>'9')
        {
            w=w-10;
            cy=1;
        }
        else cy=0;
        *(c+i-1)=w;
    }
    if(cy==1)
    {
     for(i=len-1;i>=0;i--)
    c[i+1]=c[i];
    c[0]='1';
    c[len+1]='\0';   
    }
    else
    c[len]='\0';
    return c;
 }
 int main()
 {
      char a[100],b[100],c[101];
      gets(a);
      gets(b);
      strcpy(c,add(a,b));
      puts(c);
 }
2016-09-21 08:46
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:3 
这样可以吗?(无符号整数)
例:12345 + 6789 = 19134
1、分配 5*sizeof(int) 存放各位对应的和。
    1,8,10,12,14
2、从右至左处理各位(int)满10进一。
    1,9,1,3,4
3、将各位(int)转换为(string)连成串就是输出结果。
    19134
有符号整数运算思路类同,多几个判断。
2016-09-21 11:05
Alien_Lee
Rank: 8Rank: 8
来 自:Linux帝国
等 级:蝙蝠侠
威 望:7
帖 子:149
专家分:739
注 册:2016-7-19
收藏
得分:0 
回复 5楼 吹水佬
这个思路整体上还是楼上的按位加的思路。

  DEBUG的过程就是进步的过程,每一个小错误都是大问题!...
2016-09-21 16:48
Alien_Lee
Rank: 8Rank: 8
来 自:Linux帝国
等 级:蝙蝠侠
威 望:7
帖 子:149
专家分:739
注 册:2016-7-19
收藏
得分:0 
回复 4楼 ehszt
嗯 ,按位加可以免去二次进位的尴尬,我最终也是按照这个算法解决的,谢谢你啊!

  DEBUG的过程就是进步的过程,每一个小错误都是大问题!...
2016-09-21 16:49
快速回复:一个大整数加法的问题。
数据加载中...
 
   



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

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