杭电OJ

一个爱健身的程序员 2016-03-10 04:03:10
求大神指导,杭电OJ的1002题,求两个数的和,我的代码运行结果对的,但是提交总是出错,题目简单,可能漏了哪些细节,还望指点,代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
using namespace std;

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char *argv[]) {

int num,l,c[1001];
char a[1001],b[1001];
scanf("%d",&num);
for(int i=0;i<num;i++) //i代表计算组数
{
int sum=0,temp=0,j=0; //temp代表进位
scanf("%s%s",a,b);
l=strlen(a);
while(l!=0)
{
sum=(a[l-1]-48)+(b[l-1]-48)+temp;
c[j++]=sum%10;
temp=sum/10;
l--;
}
printf("Case %d:\n",i+1);
printf("%s + %s = ",a,b);
for(int m=j-1;m>=0;m--)
printf("%d",c[m]);
if(i!=num-1)
printf("\n\n");
}
return 0;
}

...全文
497 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2016-03-11
  • 打赏
  • 举报
回复
仅供参考:
#include <stdio.h>
#include <string.h>
#define MAXLEN 1000
char a1[MAXLEN];
char a2[MAXLEN];
static int v1[MAXLEN];
static int v2[MAXLEN];
static int v3[MAXLEN];
int i,j,n,L,z;
void main(void) {
    scanf("%d",&n);
    for (j=0;j<n;j++) {
        scanf("%s%s",a1,a2);

        L=strlen(a1);
        for (i=0;i<L;i++) v1[i]=a1[L-1-i]-'0';

        L=strlen(a2);
        for (i=0;i<L;i++) v2[i]=a2[L-1-i]-'0';

        for (i=0;i<MAXLEN;i++) v3[i]=v1[i]+v2[i];

        for (i=0;i<MAXLEN;i++) {
            if (v3[i]>=10) {
                v3[i+1]+=v3[i]/10;
                v3[i]=v3[i]%10;
            }
        }

        printf("Case %d:\n", j+1);
        printf("%s + %s = ", a1, a2);

        z=0;
        for (i=MAXLEN-1;i>=0;i--) {
            if (z==0) {
                if (v3[i]!=0) {
                    printf("%d",v3[i]);
                    z=1;
                }
            } else {
                printf("%d",v3[i]);
            }
        }
        if (z==0) printf("0");

        printf("\n");
    }
}
//Sample Input
//3
//0 0
//1 2
//112233445566778899 998877665544332211
//
//Sample Output
//Case 1:
//0 + 0 = 0
//Case 2:
//1 + 2 = 3
//Case 3:
//112233445566778899 + 998877665544332211 = 1111111111111111110
  • 打赏
  • 举报
回复
我终于懂了,它的题目给的输出事例太坑了,最后根本看不出来还有回车换行,其实最后还需要光标换一行的,就用之前你给的代码,终于AC啦,多谢啦,你之前给的代码比你后来给的说AC的要简洁些。 修改后的代码如下:
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
using namespace std;
int main()
{
	int num,la,lb,c[20][1001],flag[20];
	char a[20][1001],b[20][1001];
	scanf("%d",&num);
	for(int i=0;i<num;i++)   //i代表计算组数 
	{
		int sum=0,temp=0,j=0,la=0,lb=0;   //temp代表进位 
		scanf("%s%s",a[i],b[i]);
		la=strlen(a[i])-1;
		lb=strlen(b[i])-1;
		while(la >=0|| lb>=0)
		{
			sum = 0;
			if(la>=0)
				sum+=(a[i][la]-48);
			if(lb>=0)
				sum+=(b[i][lb]-48);
			sum += temp;
			c[i][j++]=sum%10;
			temp=sum/10;
			la--;
			lb--;
		}
		flag[i]=j-1; 
		
	}
	for(int i=0;i<num;i++)
	{
		printf("Case %d:\n",i+1);
		printf("%s + %s = ",a[i],b[i]);
		for(int m=flag[i];m>=0;m--)
			printf("%d",c[i][m]);
		if(i!=num-1)
			printf("\n\n");
		else
			printf("\n");
	}
	return 0;
}
小灸舞 2016-03-10
  • 打赏
  • 举报
回复
给LZ一段代码吧,已经AC

#include<stdio.h>
#include<string.h>
int main()
{
    int n,i,len1,len2,j,k,pi,t,flag;
    char str1[1010],str2[1010];
    scanf("%d",&n);
    for(i=1;i<=n;i++)
    {
        int a[1200]={0};
        flag=0;
        printf("Case %d:\n",i);
        scanf("%s%s",str1,str2);//以字符串形式读入
        len1=strlen(str1);
        len2=strlen(str2);
        printf("%s + %s = ",str1,str2);
        j=len1-1;
        k=len2-1;
        pi=0;
        while(j>=0&&k>=0)//开始相加
        {
            if(a[pi]+(str1[j]-'0')+(str2[k]-'0')>=10)//相加后大于10的
            {
                a[pi]=a[pi]+(str1[j]-'0')+(str2[k]-'0')-10;
                a[pi+1]++;
            }
            else
                a[pi]=a[pi]+(str1[j]-'0')+(str2[k]-'0');
            pi++;
            k--;
            j--;
        }
        if(j>=0)
        {
            for(t=j;t>=0;t--)
            {
                a[pi]=a[pi]+(str1[t]-'0');
                pi++;
            }
        }
        else if(k>=0)
        {
            for(t=k;t>=0;t--)
            {
                a[pi]=a[pi]+str2[t]-'0';
                pi++;
            }
        }
        else if(a[pi]!=0)//对于位数相同2个数加后最高位大于10的
            pi++;
        for(t=pi-1;t>=0;t--)
        {
            if(a[t]==0&&flag==0)//处理一次啊前导0,估计属于无用的一步
                continue;
            else
            {
                flag=1;
                printf("%d",a[t]);
            }
           
        }
        printf("\n");
        if(i!=n)//对于2组之间加空行的情况
            printf("\n");
    }
    return 0;   
}
感觉输入和输出的位置和LZ不同,LZ可以跑一下看
小灸舞 2016-03-10
  • 打赏
  • 举报
回复
引用 5 楼 chunyemener01 的回复:
用了个二维数组,最后才输出,还是wrong answer,没招l,只是不甘心,这题具体意思懂了

看了LZ给的链接,感觉LZ都应该满足条件,除了这句:
The first line of the input contains an integer T(1<=T<=20) which means the number of test cases.
LZ是不是要在这里加个判断,判断输入的num是否在1到20
  • 打赏
  • 举报
回复
用了个二维数组,最后才输出,还是wrong answer,没招l,只是不甘心,这题具体意思懂了
  • 打赏
  • 举报
回复

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
using namespace std;
int main()
{
int num,la,lb,c[20][1005],flag[20];
char a[1001],b[1001];
scanf("%d",&num);
for(int i=0;i<num;i++) //i代表计算组数
{
int sum=0,temp=0,j=0,la=0,lb=0; //temp代表进位
scanf("%s%s",a,b);
la=strlen(a);
lb=strlen(b);
while(la > 0 || lb > 0)
{
sum = 0;
if(la-- > 0)
sum+=(a[la]-48);
if(lb-- > 0)
sum+=(b[lb]-48);
sum += temp;
c[i][j++]=sum%10;
temp=sum/10;
}
flag[i]=j-1;

}
for(int i=0;i<num;i++)
{
printf("Case %d:\n",i+1);
printf("%s + %s = ",a,b);
for(int m=flag[i];m>=0;m--)
printf("%d",c[i][m]);
if(i!=num-1)
printf("\n\n");
}
return 0;
}

  • 打赏
  • 举报
回复
或许应该这样,定义sum为数组。保存n个test 数据,最后一并输出。
  • 打赏
  • 举报
回复
首先很感谢你的回答,本来我也是想如果长度不一样呢,但是看到题目给的都是一样长的,就删了,不过,这次结果是对了,提交还是显示“wrong answer",这是那道题目的连接http://acm.hdu.edu.cn/showproblem.php?pid=1002,麻烦你帮看一下,还有什么没考虑到
小灸舞 2016-03-10
  • 打赏
  • 举报
回复
LZ之前的代码只要两个数字的字符长度不一致就会计算错误,如下:

必须分开统计a和b的长度,修改如下:

#include <stdlib.h>
#include <string.h>
using namespace std;
int main()
{
int num,la,lb,c[1001];
char a[1001],b[1001];
scanf("%d",&num);
for(int i=0;i<num;i++) //i代表计算组数
{
int sum=0,temp=0,j=0; //temp代表进位
scanf("%s%s",a,b);
la=strlen(a);
lb=strlen(b);
while(la > 0 || lb > 0)
{
sum = 0;
if(la-- > 0)
sum+=(a[la]-48);
if(lb-- > 0)
sum+=(b[lb]-48);
sum += temp;
c[j++]=sum%10;
temp=sum/10;
}
printf("Case %d:\n",i+1);
printf("%s + %s = ",a,b);
for(int m=j-1;m>=0;m--)
printf("%d",c[m]);
if(i!=num-1)
printf("\n\n");
}
system("pause");
}

运行结果:

64,683

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧