HDU1002 Wrong Answer

样例能输出,不知道错在哪里,写的太冗长了,懒得改~~~日后再调

思路:按照两字符串长短排序,长在前,短在后。然后,先按照短的模拟加法运算,再按照长的多出来的长度继续模拟加法运算,最后计算最高位,需根据字符串长短分别计算次高位是否产生进位(可以用一个三元运算符减少好多行),挖坑,日后想起来,回来填,嘿嘿~~

#define maxn 1005
#include<stdio.h>
#include<string.h>
char a[maxn],b[maxn],up[maxn],temp[maxn],s[maxn];
char first[2]={'1','\0'}; 
int main()						
{							
	int n;
	scanf("%d",&n);
	for(int k=1;k<=n;++k)
	{
		scanf("%s%s",a,b);
		if(strlen(a)<strlen(b))
		{
			strcpy(temp,a);
			strcpy(a,b);
			strcpy(b,temp);
		}
		int len_a=strlen(a);
		int len_b=strlen(b);
		char answer[1005];
		memset(answer,0,sizeof(s));
		memset(up,0,sizeof(up));
		if(k!=n)
		{
			printf("Case %d:\n%s + %s = ",k,a,b);
			for(int i=(len_b-1);i>=(len_a==len_b?1:0);--i)
			{
				int now=a[i+len_a-len_b]-'0'+b[i]-'0'+up[i+len_a-len_b];
				if(now>9)
				{
					up[i+len_a-len_b-1]=1;
					sprintf(s,"%d",now-10);
					strcat(answer,s);
				}
				else
				{
					sprintf(s,"%d",now);
					strcat(answer,s);
				}
			}
			for(int j=len_a-len_b-1;j>0;j--)
			{
				int later=a[j]-'0'+up[j];
				if(later>9)
				{
					up[j-1]=1;
					sprintf(s,"%d",later-10);
					strcat(answer,s);
				}
				else
				{
					sprintf(s,"%d",later);
					strcat(answer,s);
				}	
			}
			if(len_a!=len_b)
			{
				if(a[0]-'0'+up[0]>9)
				{
					sprintf(s,"%d",(a[0]-'0'+up[0]-10));
					strcat(s,first);
					strcat(answer,s);
				}
				else
				{
					sprintf(s,"%d",(a[0]-'0'+up[0]));
					strcat(answer,s);
				}
			}
			else
			{
				if(a[0]-'0'+b[0]-'0'+up[0]>9)
				{
					sprintf(s,"%d",(a[0]-'0'+b[0]-'0'+up[0]-10));
					strcat(s,first);
					strcat(answer,s);
				}
				else
				{
					sprintf(s,"%d",(a[0]-'0'+b[0]-'0'+up[0]));
					strcat(answer,s);
				}
			}
			if(len_a==len_b)
				for(int i=((a[0]-'0'+b[0]-'0'+up[0])>9?len_a:(len_a-1));answer[i]!='\0'&&i>-1;i--)
					printf("%c",answer[i]);
			else
				for(int i=((a[0]-'0'+up[0])>9?len_a:(len_a-1));i>-1;--i)
					printf("%c",answer[i]);
			printf("\n\n");
		}	
		else
		{
			printf("Case %d:\n%s + %s = ",k,a,b);
			for(int i=(len_b-1);i>=(len_a==len_b?1:0);--i)
			{
				int now=a[i+len_a-len_b]-'0'+b[i]-'0'+up[i+len_a-len_b];
				if(now>9)
				{
					up[i+len_a-len_b-1]=1;
					sprintf(s,"%d",now-10);
					strcat(answer,s);
				}
				else
				{
					sprintf(s,"%d",now);
					strcat(answer,s);
				}
			}
			for(int j=len_a-len_b-1;j>0;j--)
			{
				int later=a[j]-'0'+up[j];
				if(later>9)
				{
					up[j-1]=1;
					sprintf(s,"%d",later-10);
					strcat(answer,s);
				}
				else
				{
					sprintf(s,"%d",later);
					strcat(answer,s);
				}	
			}
			if(len_a!=len_b)
			{
				if(a[0]-'0'+up[0]>9)
				{
					sprintf(s,"%d",(a[0]-'0'+up[0]-10));
					strcat(s,first);
					strcat(answer,s);
				}
				else
				{
					sprintf(s,"%d",(a[0]-'0'+up[0]));
					strcat(answer,s);
				}
			}
			else
			{
				if(a[0]-'0'+b[0]-'0'+up[0]>9)
				{
					sprintf(s,"%d",(a[0]-'0'+b[0]-'0'+up[0]-10));
					strcat(s,first);
					strcat(answer,s);
				}
				else
				{
					sprintf(s,"%d",(a[0]-'0'+b[0]-'0'+up[0]));
					strcat(answer,s);
				}
			}
			if(len_a==len_b)
				for(int i=((a[0]-'0'+b[0]-'0'+up[0])>9?len_a:(len_a-1));answer[i]!='\0'&&i>-1;--i)
					printf("%c",answer[i]);
			else
				for(int i=((a[0]-'0'+up[0])>9?len_a:(len_a-1));i>-1;--i)
					printf("%c",answer[i]);
		}	
	}	
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值