【ACM】杭电OJ 1002

题目链接:杭电OJ 1002

表面上看是a+b,很简单,其实是大数的相加,所以要考虑的因素有很多;(瞬间觉得要是能用Python多好,哈哈哈)

还有!!!

要特别注意格式的输出!!!真的害死人!!!摸不清输出格式到底是啥,只能多尝试几下!!!

【ACM】杭电OJ 1002_第1张图片

思路:

我是先找处两个字符串中长度较大的那个,(但是也有特殊情况,例如“5”+“7”,需要进一位,所以,在前面需要预留一个空格,如果最后是“0”,则不输出最后一个空格),对所有的元素先赋值为0,从最后面往前推,类似于小学的加法方式,然后如果不需要进位则直接储存,如果需要进位,则在前面一个空间先加1。

#include "stdio.h"
#include "math.h"
#include "string.h"
char a[1000],b[1000];
int f[1001]; 

int shu (char c)
{
	return (c-'0');
}

int main ()
{
	int i,len_max,len1,len2,N,n,k;
	scanf("%d",&N);
	for(n=1;n<=N;n++)
	{
		scanf("%s%s",&a,&b);
		len1=strlen(a);
		len2=strlen(b);
		len1>len2?len_max=len1:len_max=len2;
		k=len_max;
		for(i=0;i<=k;i++)
		{
			f[i]=0;
		}
		len1--;
		len2--;
		for(;len1>=0 && len2>=0;k--)
		{
			f[k]+=(shu(a[len1--])+shu(b[len2--]));
			if(f[k]/10)
			{
				f[k-1]++;
				f[k]%=10;
			}
		}
		while(len1>=0)
		{
			f[k]+=shu(a[len1--]);
			if(f[k]/10)
			{
				f[k]%=10;
				f[k-1]++;
			}
			k--;
		}
		while(len2>=0)
		{
			f[k]+=shu(b[len2--]);
			if(f[k]/10)
			{
				f[k]%=10;
				f[k-1]+=1;
			}
			k--;
		}
		printf("Case %d:\n",n);
		printf("%s + %s = ",a,b);
		for(i=0;i<=len_max;i++)
		{
			if(i==0 && f[i]==0)
				i++;
			printf("%d",f[i]);
		}
		if(n!=N)
		{
			printf("\n\n");
		} 
		else
		{
		 	printf("\n");
		}
	}	
	return 0;
} 

 

你可能感兴趣的:(ACM)