| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5342 人关注过本帖, 1 人收藏
标题:如何实现用数组实现长整数的加法(不超过1000位)
只看楼主 加入收藏
编程Samuel
Rank: 1
等 级:新手上路
帖 子:24
专家分:0
注 册:2015-1-6
结帖率:50%
收藏(1)
已结贴  问题点数:5 回复次数:9 
如何实现用数组实现长整数的加法(不超过1000位)
#include<stdio.h>
#include<string.h>
int main(void)
{   
    int n,q;
    scanf("%d",&n);
    for(q=1;q<=n;q++)
    {

    char s1[1001],s2[1001];
    int a[1001]={0},b[1001]={0},c[1001]={0},m,n,i,j,d;
    gets(s1);
    gets(s2);
    m=strlen(s1);
    n=strlen(s2);
    if(m<n)
        j=n;
    else
        j=m;
    d=j;
    for(i=1;i<=m;d--,i++)
        a[d]=s1[m-i-1]-'0';
    d=j;
    for(i=1;i<=n;d--,i++)
        b[d]=s2[n-1-i]-'0';
    d=j;
    for(i=d-1;i>=0;i--)
        c[i]=a[i]+b[i];
    for(i=d-1;i>=0;i--)
    {   
        if(c[i]>=10)
        {
            c[i]-=10;
            c[i-1]++;
        }
    }
    for(i=0;i<=d;i++)
        printf("%d",&c[i]);
    }
return 0;
    }
搜索更多相关主题的帖子: include 如何 
2015-01-16 21:13
编程Samuel
Rank: 1
等 级:新手上路
帖 子:24
专家分:0
注 册:2015-1-6
收藏
得分:0 
这一段是我在看了一段代码后试着编写的,可是结果驴头不对马嘴,可能在理解和细节方面存在欠缺,请大家指教
2015-01-16 21:14
编程Samuel
Rank: 1
等 级:新手上路
帖 子:24
专家分:0
注 册:2015-1-6
收藏
得分:0 
这一段是我在看了一段代码后试着编写的,可是结果驴头不对马嘴,可能在理解和细节方面存在欠缺,请大家指教
2015-01-16 21:14
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:2 
实际编程中用大数库 方便 高效 比自己写强多了
2015-01-16 21:27
longwu9t
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:6
帖 子:732
专家分:2468
注 册:2014-10-9
收藏
得分:2 
程序代码:
#include <stdio.h>
#include <windows.h>
#include <time.h>
#define N 1000

int main(int agrc, char **argv) {
    int i, s[N + 1] = {0}, a[N] = {0}, b[N] = {0};
    srand((unsigned int)time(NULL));

    for(i = 0; i < N; i++) {
        a[i] = (int)(10.0 * rand() / (RAND_MAX + 1.0));
        b[i] = (int)(10.0 * rand() / (RAND_MAX + 1.0));

        if(a[i] + b[i] >= 10) {
            s[i + 1] = (a[i] + b[i]) / 10;
            s[i] = (a[i] + b[i]) % 10;

        } else s[i] = a[i] + b[i];
    }

    puts("a:");
    for(i = N - 1; i >= 0; i--) {
        printf("%d", a[i]);
    }

    printf("\n%s\n", "b:");
     for(i = N - 1; i >= 0; i--) {
        printf("%d", b[i]);
    }

    printf("\n%s\n", "s:");
    if(s[N] != 0) printf("%d", s[N]);

    for(i = N - 1; i >= 0; i--) {
        printf("%d", s[i]);
    }

    puts("");
    return 0;
}

Only the Code Tells the Truth             K.I.S.S
2015-01-16 22:11
yahwei
Rank: 7Rank: 7Rank: 7
来 自:湖~
等 级:黑侠
威 望:3
帖 子:145
专家分:644
注 册:2011-11-10
收藏
得分:2 
回复 5楼 longwu9t
if(a[i] + b[i] >= 10) {
            s[i + 1] = (a[i] + b[i]) / 10;
            s[i] = (a[i] + b[i]) % 10;

        } else s[i] = a[i] + b[i];


这一段应该改为:
if(a[i] + b[i] >= 10) {
            s[i + 1] = 1;
        }
        s[i] += (a[i] + b[i]) % 10;


另外,这段代码好像没有考虑两个整数位数不一样的情况……

[ 本帖最后由 yahwei 于 2015-1-17 14:43 编辑 ]

[qq]949654600[/qq]
2015-01-17 14:39
longwu9t
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:6
帖 子:732
专家分:2468
注 册:2014-10-9
收藏
得分:0 
回复 6楼 yahwei
是我考虑不周
谢谢你的指点

不过你的代码有问题
我这里修正了一下

程序代码:
if(s[i] + a[i] + b[i] >= 10) {
            s[i + 1] = 1;
        }

        s[i] = (s[i] + a[i] + b[i]) % 10;


原代码处我就不再修正了

Only the Code Tells the Truth             K.I.S.S
2015-01-17 15:13
longwu9t
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:6
帖 子:732
专家分:2468
注 册:2014-10-9
收藏
得分:0 
回复 6楼 yahwei
另外,这段代码好像没有考虑两个整数位数不一样的情况……


对于位数不一样的情况 修正代码如下:
程序代码:
#include <stdio.h>
#include <windows.h>
#include <time.h>
#define N 1000

int main(int agrc, char **argv) {
    int i, t, j, k, s[N + 1] = {0}, a[N] = {0}, b[N] = {0};
    srand((unsigned int)time(NULL));
    puts("输入需要相加的两个大数的位长(不超过1000):");
    scanf("%d%d", &j, &k);

    for(i = 0; i < j; i++) {
        a[i] = (int)(10.0 * rand() / (RAND_MAX + 1.0));
    }

    for(i = 0; i < k; i++) {
        b[i] = (int)(10.0 * rand() / (RAND_MAX + 1.0));
    }

    for(i = 0; i < N; i++) {
        t = s[i] + a[i] + b[i];

        if(t >= 10) {
            s[i + 1] = 1;
        }

        s[i] = t % 10;
    }

    puts("a:");

    for(i = j - 1; i >= 0; i--) {
        printf("%d", a[i]);
    }

    printf("\n%s\n", "b:");

    for(i = k - 1; i >= 0; i--) {
        printf("%d", b[i]);
    }

    printf("\n%s\n", "s:");
    t = ((j >= k) ? j : k);

    if(s[t] != 0) printf("%d", s[t]);

    for(i = t - 1; i >= 0; i--) {
        printf("%d", s[i]);
    }

    puts("");
    return 0;
}

Only the Code Tells the Truth             K.I.S.S
2015-01-17 15:27
yahwei
Rank: 7Rank: 7Rank: 7
来 自:湖~
等 级:黑侠
威 望:3
帖 子:145
专家分:644
注 册:2011-11-10
收藏
得分:0 
回复 楼主 编程Samuel
其实只需要字符数组就可以了,不用声明整形数组,将两个加数分别存入两个字符数组,再申请一个比加数多一位的字符数组用来存储两数之和。数字字符转化为整数可以简单的减去'0'就行了。

[qq]949654600[/qq]
2015-01-17 15:27
砖家的谎言
Rank: 12Rank: 12Rank: 12
等 级:禁止访问
威 望:30
帖 子:693
专家分:3898
注 册:2013-12-6
收藏
得分:2 
赞同楼上的说法

我不是砖家,要努力成为砖家。
2015-01-17 15:48
快速回复:如何实现用数组实现长整数的加法(不超过1000位)
数据加载中...
 
   



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

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