http://acm.hdu.edu.cn/showproblem.php?pid=1002 杭电上的1002题,求解,我到底错在那了?

#include<stdio.h>#include<string.h>#include<memory.h>voidmain(){charnum1[1000],num2[1... #include<stdio.h>
#include<string.h>
#include<memory.h>
void main()
{
char num1[1000], num2[1000];
int sum[1000];
int m, i, j, k;
int len1, len2;
int flag = 0;
scanf( "%d%*c", &m );
for( i = 0; i < m; i++ )
{
j = 0;
flag = 0;
memset(sum,0,4*1000);
scanf( "%s%s", num1, num2 );

len1 = strlen(num1)-1;
len2 = strlen(num2)-1;

printf("case %d:\n", i+1 );
for( k = 0; k <= len1; k++ )
printf( "%c", num1[k] );
printf("+");
for( k = 0; k <= len2; k++ )
printf( "%c", num2[k] );
printf( "=");

if( len1 > len2 )
{
k = len1;
while( k >= 0 )
{
sum[j++] = num1[k]-'0';
k--;
}
j = 0;
while( len2 >= 0)
{
flag = sum[j] + (num2[len2]-'0') ;
if( flag > 9 )
{
sum[j] = flag % 10;
sum[j+1] += flag / 10;
}
else
{
sum[j] = flag;
flag = 0;
}
j++;

len2--;
}
for( j = len1; j >= 0; j-- )
printf("%d", sum[j] );
printf("\n");
}
else
{
k = len2;
while( k >= 0 )
{
sum[j++] = num2[k]-'0';
k--;
}
j = 0;
while( len1 >= 0)
{
flag = sum[j] + (num1[len1]-'0') ;
if( flag > 9 )
{
sum[j] = flag % 10;
sum[j+1] += flag / 10;
}
else
{
sum[j] = flag;
flag = 0;
}
j++;

len1--;
}
if( flag > 9 && len1 == len2 ) len2++;
for( j = len2 ; j >= 0; j-- )
printf("%d", sum[j] );
if( i != m-1 )
printf("\n\n");
else
printf("\n");
}
}
}
展开
 我来答
Fans_Men
2011-05-26 · TA获得超过417个赞
知道小有建树答主
回答量:65
采纳率:0%
帮助的人:86.1万
展开全部
在你的基础上改的,AC了。

#include<stdio.h>
#include<string.h>
#include<memory.h>
int main()
{
char num1[1000], num2[1000];
int sum[1001]; //num1和num2的和可能超过1000位的,就像两个两位数相加可能是3位数
int m, i, j, k;
int len1, len2;
int flag = 0;
scanf( "%d%*c", &m );
for( i = 0; i < m; i++ )
{
if(i!=0) putchar('\n'); //用于控制格式
j = 0;
flag = 0;
memset(sum,0,sizeof(sum)); //memset可以这样写
scanf( "%s%s", num1, num2 );

len1 = strlen(num1)-1;
len2 = strlen(num2)-1;

printf("Case %d:\n", i+1 ); //'Case'首字母大写
for( k = 0; k <= len1; k++ )
printf( "%c", num1[k] );
printf(" + "); //‘+’和下面‘=’左右都有一个空格
for( k = 0; k <= len2; k++ )
printf( "%c", num2[k] );
printf( " = ");

if( len1 > len2 )
{
k = len1;
while( k >= 0 )
{
sum[j++] = num1[k]-'0';
k--;
}
j = 0;
while( len2 >= 0)
{
flag = sum[j] + (num2[len2]-'0') ;
if( flag > 9 )
{
sum[j] = flag % 10;
sum[j+1] += flag / 10;
}
else
{
sum[j] = flag;
flag = 0;
}
j++;

len2--;
}
if(sum[len1+1]!=0) printf("%d",sum[len1+1]); //如果num1[len1]==9,可能会向前进位,
for( j = len1; j >= 0; j-- ) //比如:989+11=1000;
printf("%d", sum[j] );
printf("\n");
}
else
{
k = len2;
while( k >= 0 )
{
sum[j++] = num2[k]-'0';
k--;
}
j = 0;
while( len1 >= 0)
{
flag = sum[j] + (num1[len1]-'0') ;
if( flag > 9 )
{
sum[j] = flag % 10;
sum[j+1] += flag / 10;
}
else
{
sum[j] = flag;
flag = 0;
}
j++;

len1--;
}
//if( flag > 9 && len1 == len2 ) len2++; 即使len1<len2,当num2[len2]==9时还有可能向前进位
if(sum[len2+1]!=0) printf("%d",sum[len2+1]);
for( j = len2 ; j >= 0; j-- )
printf("%d", sum[j] );
putchar('\n');
/* if( i != m-1 ) //这样写格式是不对的
printf("\n\n");
else
printf("\n");
*/
}
}
return 0;
}

我的代码:
#include<cstdio>
#include<cstring>

void add(char a[ ],char b[ ]) //大数加法模板
{
int sum[1001]={0};
int len_a=strlen(a),len_b=strlen(b),i;
for(i=0;i<len_a/2;i++)
{
char tmp=a[i];
a[i]=a[len_a-1-i];
a[len_a-1-i]=tmp;
}
for(i=0;i<len_b/2;i++)
{
char tmp=b[i];
b[i]=b[len_b-1-i];
b[len_b-1-i]=tmp;
}
int min=len_a<len_b ? len_a : len_b;
for(i=0;i<min;i++)
{
sum[i]+=a[i]-'0'+b[i]-'0';
if(sum[i]>9)
{
sum[i]-=10;
sum[i+1]++;
}
}
if(len_a>len_b)
for(;i<len_a;i++)
{
sum[i]+=a[i]-'0';
if(sum[i]>9)
{
sum[i]-=10;
sum[i+1]++;
}
}
else
for(;i<len_b;i++)
{
sum[i]+=b[i]-'0';
if(sum[i]>9)
{
sum[i]-=10;
sum[i+1]++;
}
}
if(sum[i]) printf("%d",sum[i]);
for(i-=1;i>=0;i--)
printf("%d",sum[i]);
}

int main()
{
int t;
char a[1000],b[1000];
scanf("%d",&t);
for(int i=0;i<t;i++)
{
if(i) putchar('\n');
scanf("%s%s",a,b);
printf("Case %d:\n",i+1);
printf("%s + %s = ",a,b);
add(a,b);
putchar('\n');
}
return 0;
}
魔法失灵了
2011-05-26 · 超过12用户采纳过TA的回答
知道答主
回答量:54
采纳率:0%
帮助的人:26.1万
展开全部
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NUMOF(c) ((c) ? (c) - '0' : 0)
struct node {
char s[1024];
char s1[1024];
char r[1024];
} st = {{0},{0},{0}};
char *strrev(char *s)
{
char *p, *q, c;
p = q = s;
while (*q)
q++;
q--;
while ((p-q) < 0) {
c = *p;
*p = *q;
*q = c;
p++;
q--;
}
return s;
}
int main(void)
{
struct node *p = &st;
int i, ii = 0, n;
scanf("%d", &n);
while (ii < n) {
memset(p->r, 0, 1000);
memset(p->s, 0, 1000);
memset(p->s1, 0, 1000);
scanf("%s%s", p->s, p->s1);
++ii;
strrev(p->s);
strrev(p->s1);
i = 0;
while (p->s[i] || p->s1[i] || p->r[i]) {
p->r[i] += NUMOF(p->s[i]) + NUMOF(p->s1[i]);
if (p->r[i] > 9) {
p->r[i+1] = p->r[i] / 10; p->r[i] %= 10;
}
p->r[i] += '0';
i++;
}
strrev(p->s);
strrev(p->s1);
strrev(p->r);
printf("Case %d:\n%s + %s = %s\n", ii, p->s, p->s1, p->r);
if (ii != n) putchar('\n');
}
return 0;
}
这是我做的答案 已经AC了 希望能帮到你!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式