| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 725 人关注过本帖
标题:杭电1002
只看楼主 加入收藏
Magic_July
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:102
专家分:109
注 册:2012-9-25
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:10 
杭电1002
A + B问题II

时间限制:2000/1000 MS(Java /其他)内存限制:三万二千七百六十八分之六万五千五百三十六K(Java /其他的)
总提交(S):141254接受提交的文件:26797


问题描述
我有一个非常简单的问题。由于两个整数A和B,你的任务是计算A + B的总和
 

输入
在输入的第一行包含一个整数T(1 <= T <= 20),这意味着测试用例的数量。那么T线跟随,每行包含两个正整数,A和B请注意,这个整数是非常大的,这意味着你不应该使用32位的整数处理。你可以假设每个整数的长度不会超过1000。
 

产量
对于每个测试案例,你应该输出两行。第一行是“案例#:”#指的测试用例的数量。第二行是一个公式“A + B = SUM”,总和是指A + B.注意的结果有一定的空间int的方程。两个测试用例之间输出一个空行。
 

样例输入
2
1 2
112233445566778899 998877665544332211
 

样本输出
案例1://Case 1:
1 + 2 = 3

案例2://这里应该是Case 2:
112233445566778899 + 998877665544332211 = 1111111111111111110
以上是翻译过来的
我的代码
程序代码:
#include"stdio.h"
#include"string.h"
#include"stddef.h"
int main()
{
    char a[1001],b[1001];
    int n,i,j,mi,k,l;
    scanf("%d",&n);
    getchar();
    for(i=0;i<n;i++)
    {
        int x[1001]={0};
        for(j=0;j<1001;j++)
        {
            scanf("%c",&a[j]);
            if(a[j]==' ')
            {
                a[j]='\0';break;
            }
        }
        gets(b);
        //printf("%s%s\n",b,a);
        //printf("%d,%d\n",strlen(a),strlen(b));
        for(j=strlen(a)-1,k=strlen(b)-1,l=0;j>=0&&k>=0;j--,k--,l++)
        {
            x[l]+=a[j]+b[k]-48*2;//printf("x[%d]=%d\n",j,x[j]);
            if(x[l]>=10)
            {
                x[l+1]+=x[l]/10;
                x[l]=x[l]%10;
                if(j-1<0&&k-1<0&&strlen(a)==strlen(b))
                {
                    l++;
                }
            }
        }
        if(strlen(a)<strlen(b))
        {
            for(j=strlen(a);j<strlen(b);j++,l++)
            {x[l]+=b[j]-48;
            if(x[l]>=10)
            {x[l+1]+=x[l]/10;x[l]=x[l]%10;
            if(j+1>=strlen(b))
            {l+=2;break;}
            }}
        }
        else if(strlen(a)>strlen(b))
        {
            for(j=strlen(b);j<strlen(a);j++,l++)
            {x[l]+=a[j]-48;
            if(x[l]>=10)
            {x[l+1]+=x[l]/10;x[l]=x[l]%10;
            if(j+1>=strlen(a))
            {l+=2;break;}
            }}
        }
        printf("Case %d:\n%s + %s = ",i+1,a,b);
        for(j=l-1;j>=0;j--)
        printf("%d",x[j]);
        printf("\n");
        if(i+1<n)
        printf("\n");
    }
    return 0;
}

这道是在论坛里看到有人求助,自己去写了下
测试时答案应该没有错
个人觉得是格式错误
但交了后是WA
求解释
搜索更多相关主题的帖子: 正整数 测试 Java 
2013-02-21 14:25
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:20 
你的代码好复杂呀,……
“可以假设每个整数的长度不会超过1000”,又看到你代码中有'\0',那么得1001才能存得下A/B,那么得1002才一定能存得下A+B

有没有提交链接,我想试试
2013-02-21 15:03
Magic_July
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:102
专家分:109
注 册:2012-9-25
收藏
得分:0 
回复 2楼 rjsp
http://acm.hdu.
这是链接
这几天有事情
没上
回复晚了
2013-02-24 16:17
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
rjsp说的问题是致命的,但不排除还有其它的问题,呵呵,这数据读取方式实在是很。。。

航电的题数据描述及测试用例还是很精确的,比北大的好很多。但读取时还是多少留有一定余地的好。

程序代码:
#include<stdio.h>
#include<string.h>
#define LEN    1024
char * add(char * a, char * b)
{
    static char c[LEN];
    int na, nb, f, i;
   
    na = strlen(a) - 1;
    nb = strlen(b) - 1;
    for(f = 0, i = LEN - 1; na >= 0 || nb >= 0 || f; na--, nb--)
    {
        c[--i] = f;
        c[i] += na >= 0 ? a[na] : '0';
        c[i] += nb >= 0 ? b[nb] - '0' : 0;
        f = c[i] > '9' ? (c[i] -= 10, 1) : 0;
    }
    return c + i;
}
int main()
{
    char a[LEN], b[LEN];
    int t, i;
    for(scanf("%d", &t), i = 1; i <= t; i++)
    {
        if(i > 1) puts("");
        scanf("%s%s", a, b);
        printf("Case %d:\n%s + %s = %s\n", i, a, b, add(a, b));
    }
    return 0;
}

重剑无锋,大巧不工
2013-02-24 19:00
Susake
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:女儿国的隔壁
等 级:贵宾
威 望:23
帖 子:2288
专家分:6481
注 册:2012-12-14
收藏
得分:0 
我题的....3Q

仰望星空...........不忘初心!
2013-02-24 19:07
Susake
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:女儿国的隔壁
等 级:贵宾
威 望:23
帖 子:2288
专家分:6481
注 册:2012-12-14
收藏
得分:0 
能否详细解析一下,想了好久了

仰望星空...........不忘初心!
2013-02-24 19:10
Susake
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:女儿国的隔壁
等 级:贵宾
威 望:23
帖 子:2288
专家分:6481
注 册:2012-12-14
收藏
得分:0 
只要112233445566778899 和 998877665544332211这两个关键的

仰望星空...........不忘初心!
2013-02-24 19:19
Magic_July
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:102
专家分:109
注 册:2012-9-25
收藏
得分:0 
回复 4楼 beyondyf
不解
return c + i;

类型不一样
c是地址,+i后是什么意识 ?
2013-02-24 19:41
Susake
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:女儿国的隔壁
等 级:贵宾
威 望:23
帖 子:2288
专家分:6481
注 册:2012-12-14
收藏
得分:0 
啊....不是吧,你没看到那c是数组?  c代表数组的首地址,然后+i相当于数组的地址移动了
然后返回去的时候确实是地址,但是%s根据地址开始的地方开始读取....

仰望星空...........不忘初心!
2013-02-24 19:49
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
这个题目在算法上没有太多好解释的。无非是将a、b两个数对齐后从低位向高位按位相加再加上进位位。这与我们小学列竖式算数是一样的。

需要注意的地方就是别忘了最后的进位位别忘了加到结果里。这点楼主倒是没忘,也没细看楼主的代码,多数就是数组的尺寸不够,楼主有没有修改数组大小后提交试试?

c + i就是个指针,指向计算后结果的最高位所在位置。

我的代码中容易被忽略的一点是——我没有初始化数组c。或者说,c的作用是保存计算结果的字符串形式,但我并没有显式地在字符串末尾加'\0',为什么?

这不是我的疏忽,而是我确信我的代码不需要这一步。有兴趣的各位可以想想这是为什么?或者查查资料看看静态数据是怎么存储的。

重剑无锋,大巧不工
2013-02-24 20:04
快速回复:杭电1002
数据加载中...
 
   



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

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