杭电oj 1002题,我vc好几次都对,老是WA,求指导!代码如下:

#include<iostream>usingnamespacestd;#include<stdlib.h>#include<string.h>intmain(){int... #include<iostream>
using namespace std;
#include<stdlib.h>
#include<string.h>
int main()
{
int i,j,T,k;
char a[1002],b[1002];//大整数转换为字符串处理
char *pa=a;
char *pb=b;
char *p;
cin>>T;//测试组数
if(T>=1&&T<=20){
for(k=1;k<=T;k++){
cin>>a>>b;
if(strlen(a)>1000||strlen(b)>1000){//a,b超过一千位,不符题意return 0结束
return 0;}
else{
char c[1002]={"0"};//a,b相加得到的数位数超过a,b时,最前面补0,作为第1位数
if(atof(a)>0&&atof(b)>0){//atof(字符串转换为浮点数函数,包含在<stdlib.h>中,atol无法将较长的字符串转换为长整数)判断测试数据是否为正整数,反之return 0
if(strlen(a)>=strlen(b)){
strcat(c,a);}//将大的数前面补一个0
else{
p=pa;
pa=pb;
pb=p;
strcat(c,pa);}//同上
for(i=strlen(c)-1,j=strlen(pb)-1;i>=0,j>=0;){//从两数最后一位开始加
if((c[i]-'0'+pb[j]-'0')>=10){
c[i]=(c[i]-'0')+pb[j]-10;
i--;j--;
c[i]=c[i]+1;}//相加大于10的前面一位数加1
else{
c[i]=c[i]-'0'+pb[j];
i--;j--;}
}
if(c[0]=='0'){
cout<<"case "<<k<<":"<<endl<<a<<" "<<"+"<<" "<<b<<" "<<"="<<" ";
for(i=0;i<strlen(c)-1;i++){
cout<<c[i+1];}//a,b相加后第一位数不到10的,不需输出第一位,即"0"
cout<<endl; }
else{//如果相加大于10,要把第一位数输出来(肯定是"1")
cout<<"case "<<k<<":"<<endl<<a<<" "<<"+"<<" "<<b<<" "<<"="<<" "<<c<<endl;}
cout<<endl;
}
else
return 0;}
}
return 0;
}
return 0;
}
展开
 我来答
wssznh1999
2012-08-27 · TA获得超过428个赞
知道小有建树答主
回答量:232
采纳率:0%
帮助的人:363万
展开全部
应该是你的输入格式不对,题目要求的输入格式如下:

Sample Input
2
1 2
112233445566778899 998877665544332211

Sample Output
Case 1:
1 + 2 = 3

Case 2:
112233445566778899 + 998877665544332211 = 1111111111111111110
//这里是把所有要算的数一次性输入进去,之后再一次性把结果输出去,你的却是输入一组数据就输出一个结果
追问
网上"AC"的基本上都是输入一组数据就输出一个结果啊
追答
当输入的两个大整数有0时,你的程序就没结果,你试一下是不是这个原因
只为不再后悔
2012-09-14 · TA获得超过334个赞
知道答主
回答量:117
采纳率:0%
帮助的人:175万
展开全部
(真心想不通为什么满意答案没有给我? )
有五个问题
第一: case 首字母大写“Case”
第二: 输入的时候,数据可能有前导0, 会导致你的结果中多输出0
比如这个case 9999 000000001
第三: 指针错误。 你的pa, pb, 没有初始化。 当交换过后, 第二次在使用时,应该重新赋值
pa = a; pb = b; , 否则pa 则不是指向a的,而是指向b的。
第四: 当较短的数字加完后, 最后可能进一位, 而进的这一位有可能使较长的数字进位
如: 19345 655, 千位进一,万位进一;
第五: 格式错误, 每组测试数据之间有一个空行,而不是每个测试数据之后有一个空行。
下面是改好的程序,希望对你有用。
另外说几句:
这个题目把数字串倒过来算更方便。
你的程序中有一些无关紧要的判断,比如T的大小,数据的正负以及长度, 这些题目中都有详细的描述, 会保证符合题意的, 所以不同判断。
#include<iostream>
using namespace std;
#include<stdlib.h>
#include<string.h>
int main()
{
int i,j,T,k;
char a[1002],b[1002];//大整数转换为字符串处理
char *pa;
char *pb;
char *p;
cin>>T;//测试组数
if(T>=1&&T<=20){
for(k=1;k<=T;k++){
cin>>a>>b;
pa = a; // 第二个错误
pb = b;
if(strlen(a)>1000||strlen(b)>1000){//a,b超过一千位,不符题意return 0结束
return 0;}
else{
char c[1002]={"0"};//a,b相加得到的数位数超过a,b时,最前面补0,作为第1位数
if(atof(a)>0&&atof(b)>0){//atof(字符串转换为浮点数函数,包含在<stdlib.h>中,atol无法将较长的字符串转换为长整数)判断测试数据是否为正整数,反之return 0
if(strlen(a)>=strlen(b)){
strcat(c,a);}//将大的数前面补一个0
else{
p=pa;
pa=pb;
pb=p;
strcat(c,pa);}//同上
for(i=strlen(c)-1,j=strlen(pb)-1;i>=0,j>=0;){//从两数最后一位开始加
if((c[i]-'0'+pb[j]-'0')>=10){
c[i]=(c[i]-'0')+pb[j]-10;
i--;j--;
c[i]=c[i]+1;}//相加大于10的前面一位数加1
else{
c[i]=c[i]-'0'+pb[j];
i--;j--;}
}
while (c[i] - '0' >= 10) // 第四个错误
{
c[i] = c[i] - 10;
c[-- i] ++;
}
i = 0;
while (c[i] == '0') // 第三个错误
{
i ++;
}
cout<<"Case "<<k<<":"<<endl<<a<<" "<<"+"<<" "<<b<<" "<<"="<<" ";
for(;i<=strlen(c)-1;i++){
cout<<c[i];}
cout<<endl;
if (k < T) // 第五个错误
{
cout << endl;
}
}
else
return 0;}
}
return 0;
}
return 0;
}

下面是把数字串倒过来的做法, 写的不好, 仅供参考, 如有错误, 不吝赐教。
#include "stdio.h"
#include "string.h"
#include "stdlib.h"

#define MAX 2000
void reverse (char []);
int main()
{
int i, k;
int N, count = 0;
int lenA, lenB, value;
char A[MAX], B[MAX], sum[MAX], *p;
scanf ("%d", &N);
while (N --)
{
scanf ("%s%s", A, B);
reverse (A);
reverse (B);
lenA = strlen(A);
lenB = strlen(B);
memset(sum, '0', MAX);
k = 0;
for (i = 0; i < lenA && i < lenB; i ++)
{
value = A[i] - '0' + B[i] - '0';
if (value >= 10)
{
sum[k] = sum[k] + value - 10;
sum[k + 1] = '1';
}
else
{
value = sum[k] - '0' + value;
if (value >= 10)
{
sum[k] = '0';
sum[k + 1] = '1';
}
else
{
sum[k] = value + '0';
}
}
k ++;
}
p = A;
if (i == lenA)
{
p = B;
}
for (; i < strlen(p); i ++)
{
value = sum[k] - '0' + p[i] - '0';
if (value >= 10)
{
sum[k] = '0';
sum[k + 1] = '1';
}
else
{
sum[k] = value + '0';
}
k ++;
}
if (sum[k] != '0')
{
k ++;
}
sum[k] = '\0';
reverse (A);
reverse (B);
reverse (sum);
printf ("Case %d:\n", ++ count);
printf ("%s + %s = %s\n", A, B, sum);
if (N >= 1)
{
printf ("\n");
}
}
return 0;
}
void reverse (char A[])
{
int len;
int i, temp;
len = strlen(A);
for (i = 0; i < len / 2; i ++)
{
temp = A[i];
A[i] = A[len - i - 1];
A[len - i - 1] = temp;
}
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式