杭电ACM HDOJ 1002 高精度加法 我的程序哪里错了?请测试下.

作者&投稿:端木宣 (若有异议请与网页底部的电邮联系)
HDOJ币什么用??。杭电的论坛币。。~

升级用的。

题意: 给t组数据a,b,输出这两个大数的和
具体思路: 模拟加法的笔算过程
出错提醒: 1、最多1000位,基本数据类型范围不够,所以用字符串
2、此外,格式要特别注意一下,复制过来再修改
两个测试数据之间是有一行空白行的,但是最后一个测试数据后面没有空白行
代码效率: 0MS 212K 1009 B GCC
BY feng [2010/5/26]
*/
#include
#include
#define MAX 1002
char a[MAX],b[MAX],c[MAX];
int len_c; //和的位数
void CaculateAB() //计算a和b
{
int i, len_a,len_b,len_add, digit_sum,carry; //digit_sum对应位数的和,carry进位
len_a =strlen(a);
len_b =strlen(b);
len_add = (len_a<=len_b)? len_a:len_b;
carry =0;
for(i=0;i<len_add;i++)
{
digit_sum=a[len_a-i-1]-48+b[len_b-i-1]-48+carry;
c[i] =digit_sum%10+48;
carry =digit_sum/10;
}
if(len_a>len_b)
{
for(;i<len_a;i++)
{
digit_sum=a[len_a-i-1]-48+carry;
c[i] =digit_sum%10+48;
carry =digit_sum/10;
}
}
else
{
for(;i<len_b;i++)
{
digit_sum=b[len_b-i-1]-48+carry;
c[i] =digit_sum%10+48;
carry =digit_sum/10;
}
}
if(carry>0) c[i++] =carry+48;
len_c = i;
}
int main(void)
{
int t,i,k;
scanf("%d",&t);
for(k=0;k<t;k++)
{
scanf("%s%s",a,b);
CaculateAB();
printf("Case %d:
%s + %s = ",k+1,a,b);
//c保存的是和的逆序排列,要逆序输出
for(i=0;i<len_c;i++)
{
printf("%c",c[len_c-i-1]);
}
printf("
");
if(k<t-1) printf("
"); //***,这里注意一下不然会Presentation Error
}
return 0;
}

Case输出的顺序不对。。。

我AC代码,仅供参考。。

#include<stdio.h>

#include<string.h>

int main()

{

    int t;

    int i,j,k;

    int len1,len2;

    char a[100000],b[100000],c[100000];

    scanf("%d",&t);

    for(k=1;k<=t;k++)

    {

        scanf("%s %s",a,b);

        printf("Case %d:
",k);

        printf("%s + %s = ",a,b);

        len1=strlen(a);

        len2=strlen(b);

        if(len1==len2)

        {

            for(i=len1-1;i>=0;i--)

                c[i]=a[i]+b[i]-'0';

            for(i=len1-1;i>0;i--)

            {

                if(c[i]>'9')

                {

                    c[i]-=10;

                    c[i-1]+=1;

                }

            }

            if(c[0]>'9')

            {

                printf("1");

                c[0]-=10;

            }

            for(i=0;i<len1;i++)

                printf("%c",c[i]);

            printf("
");

        }

        else if(len1>len2)

        {

            for(i=0;i<len1-len2;i++)

                c[i]=a[i];

            for(i=len1-len2,j=0;i<len1;i++,j++)

                c[i]=a[i]+b[j]-'0';

            for(i=len1-1;i>0;i--)

            {

                if(c[i]>'9')

                {

                    c[i]-=10;

                    c[i-1]+=1;

                }

            }

            if(c[0]>'9')

            {

                printf("1");

                c[0]-=10;

            }

            for(i=0;i<len1;i++)

                printf("%c",c[i]);

            printf("
");

        }

        else

        {

            for(i=0;i<len2-len1;i++)

                c[i]=b[i];

            for(i=len2-len1,j=0;i<len2;i++,j++)

                c[i]=a[j]+b[i]-'0';

            for(i=len2-1;i>0;i--)

            {

                if(c[i]>'9')

                {

                    c[i]-=10;

                    c[i-1]+=1;

                }

            }

            if(c[0]>'9')

            {

                printf("1");

                c[0]-=10;

            }

            for(i=0;i<len2;i++)

                printf("%c",c[i]);

            printf("
");

        }

        if(k<t)

            printf("
");

    }

    return 0;

}



你这个代码真的很乱。。。这是高精度加法运算,你应该形成自己的高精度运算模板,不要临时写的很乱,自己都看不懂,而且错误频出,还难以调试。
我觉得大家都没什么耐心把你这个程序完整的读一遍并且运行调试一遍。。。

我提供我自己写的代码,里面的高精度加法是我高精度库的一部分,希望你形成自己风格,正确而且高效的算法库,这才是ACM的正确道路。
#include <string>
#include<iostream>
#include <algorithm>
using namespace std;

string operator+(string x, string y)
{
if(x.size() < y.size()) // 预处理,保证x的实际长度>=y
x.swap(y);
y.insert(y.begin(), x.size()-y.size(), '0'); // y开头补0到和x一样长

string sum(x.size(), -1); // 初始大小:x.size()

int carry=0;
for(int i=x.size()-1; i >= 0; --i)
{
carry += x[i]+y[i]-2*'0';
sum[i] = carry%10+'0';
carry /= 10;
}

if(carry > 0) // 还有进位1
return string("1") += sum; // 给开头添加一个“1”
return sum;
}

int main()
{
string s1,s2,s3;
int t,n;
cin>>n;
t=1;
while(n--)
{
cin>>s1>>s2;
cout<<"Case "<<t++<<":"<<endl<<s1<<" + "<<s2<<" = "<<s1+s2<<endl;
if(n!=0) cout<<endl;
}
return 0;
}
-----------------------------------------------------
突然发现你还是我空间好友。。。

你的答案是完全正确的,只是你不能先把“Case”打出来再输入。
所以你要把这句printf("Case %d:\n",k);放到scanf("%s",a);后面,printf("%s + ",a);的前面,修改后就能AC了。


马村区18640368772: 杭电acm1002 -
偶滕和血: 服了你了...那个input和output是仅供参考的 其中21 2112233445566778899 998877665544332211 是你从键盘输入而不是系统输出的 你要输出的内容应该是 Case 1:1 + 2 = 3 Case 2:112233445566778899 + 998877665544332211 = ...

马村区18640368772: 杭电ACM1002 C语言,提交时运行错误.代码如下 -
偶滕和血: for(i=0;i<max;i++){ sum[i]=numa[i]+numb[i];//这里改成+=试试. 可能有进位,如果直接用=,进位会被忽略掉. if(sum[i]>=10){ //到10进位 sum[i]=sum[i]-10; sum[i+1]=1; numa[i+1]++; } }

马村区18640368772: 问下,杭电的acm今天怎么一天都进不去,你们呢? -
偶滕和血: 明天就可以弄好了!详见:杭电OJ人人公共主页上发布的通知:各位HDOJ的朋友:因为HDOJ被攻击了,系统需要重装,因为寒假期间都不上班,所以今天才联系到一位网管老师,找到钥匙,明天会重装系统,抱歉了~

马村区18640368772: 我也在杭电ACM 了 1002题,参考了你的回答,但是还是有问题,能帮我看看吗? -
偶滕和血: 你的程序风格很不错,很值得我学习,就是变量用得太多了点.习惯上,一般使用i,j,k表示循环,l或lenth表示字符串长度.当然,这只是我个人的观点,仅供参考,别介意.另外,推荐使用int main()而不是void main().你的程序问题很小...

马村区18640368772: c语言 acm求助 杭电 1002 满意再+50分 -
偶滕和血: 你的进位处理到最前面的时候出错了 9+1=0你可以在一开始读num1 n...

马村区18640368772: HDOJ1002 大数加法 ACM C语言 -
偶滕和血: #include#include void fun(char a[]) { int i=strlen(a),p; char c; for(p=0;p { c=a[p];a[p]=a[i-1-p];a[i-1-p]=c; } } void plus(char a[],char b[]) { char e[1002],f[1002]; strcpy(e,a); strcpy(f,b); int i,j,k; char c[1002],n[1002]; fun(a); fun(b); c[0]='0'; for(i=0;;i++) { n[i]=a[i]...

马村区18640368772: 杭电acm1002题 -
偶滕和血: 这道题是大数相加,long long int 不够格,如100个1 和100 个2相加就会发生溢出情况, 应该用数组去做通过数组完成加减

马村区18640368772: 杭电 acm 我这个代码为什么一直提示 Presentation Error http://acm.hdu.edu.cn/showproblem.php?pid=1002 -
偶滕和血: 这个错误说明你的程序是对的,只是输出的格式是有误.你没看到题目,每2个测试数据才空一行,故最后那个是只要一个回车就行了.把main函数里面的:printf("%s\n\n",ch[i]); 改为:printf("%s\n",ch[i]); if(i!=count-1) printf("\n"); 这样就能AC了~~

马村区18640368772: 杭电acm1002 不能被ac 求指导 谢谢请别复制别的代码 -
偶滕和血: //输入999 1 输出是 9100 说明是进位出现了问题,改了一下,现在已经AC了 #include <stdio.h> #include <string.h> int add(char a[],char b[],int c[]) { int lena,lenb,i,na[1000]={0},nb[1000]={0}; lena=strlen(a);lenb=strlen(b); for(i=0;i<lena;i++) na[i]=a[...

马村区18640368772: 杭电acm 1002这样做为什么不对啊?????? -
偶滕和血: 这题的输入可能会达到1000位,看见这个要求了么?2^64也才1.9E19,就20位数而已.所以这题实际上是要求你用一个字符串来表示长整数,然后模拟列竖式进行加法的过程.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网