杭电oj1002,简单理解,复杂解法

杭电oj这道题的解法是要通过字符数组储存数字在进行运算的,同时涉及到数值进位的问题,以下是代提供码参考。

#include<stdio.h>
#include<string.h>
int main()
{
	char a[1000],b[1000];
	int sum[10000]={0};
	int c,d,e,f,g,i,n,s;
	scanf("%d",&n);
	f=48;
	s=1;
	c=n;
	while(n--)
	{
		scanf("%s",a+1);
		scanf("%s",b+1);
		printf("Case %d:\n",s);
		printf("%s + %s = ",a+1,b+1);
		d=strlen(a+1);
		e=strlen(b+1);
		for(i=1;i<=d;i++)
			a[i]=a[i]-48;
			for(i=1;i<=e;i++)
			b[i]=b[i]-48;
		if(d==e)		  //数字位数相同的情况 
		{
			for(i=1;i<=d;i++)
			{
				
				if(a[i]+b[i]>=10&&i>=2)	
				{
					sum[i-2]=sum[i-2]+1;//向前面的一个sum加一进位,比如10+1
					sum[i-1]=(a[i]+b[i]-10);//进一位后再减去10,比如15-1=5
				}
				else 
				sum[i-1]=a[i]+b[i];
			}
		}
		else if(d>e)      //数字位数不相同的情况 
		{
			for(i=1;i<=d-e;i++)
			sum[i]=a[i];
			f=1;
			for(i=d-e+1;i<=d;i++)
			{
				if(a[i]+b[f]>=10)
				{
					sum[i-1]=sum[i-1]+1;
					sum[i]=a[i]+b[f]-10;
					if(sum[i-1]>=10)
					{
						for(g=i-1;g>=1;g--)//考虑前面位数为10的进位
						{
							if(sum[g]>=10)
							{
								sum[g-1]=sum[g-1]+1;
								sum[g]=sum[g]-10;
							}
						}
					}
				}
				else
				sum[i]=a[i]+b[f];
				f++;
			}
		}
			else if(d<e)      //数字位数不相同的情况 
		{
			for(i=1;i<=e-d;i++)
			sum[i]=b[i];
			f=1;
			for(i=e-d+1;i<=e;i++)
			{
				if(a[f]+b[i]>=10)
				{
					sum[i-1]=sum[i-1]+1;
					sum[i]=a[f]+b[i]-10;
					if(sum[i-1]>=10)
					{
						for(g=i-1;g>=1;g--)
						{
							if(sum[g]>=10)
							{
								sum[g-1]=sum[g-1]+1;
								sum[g]=sum[g]-10;
							}
						}
					}
				}
				else
				sum[i]=a[f]+b[i];
				f++;
			}
		}
		if(d==e)
		{
			for(i=0;i<d;i++)
			printf("%d",sum[i]);
			sum[0]=0;
			s++;
		}
		if(d>e)
		{
			if(sum[0]==0)
			{
				for(i=1;i<=d;i++)
				printf("%d",sum[i]);
			}
			else
			{
				for(i=0;i<=d;i++)
				printf("%d",sum[i]);
				sum[0]=0;
			}
			s++;
		}
		if(d<e)
		{
			if(sum[0]==0)
			{
				for(i=1;i<=e;i++)
				printf("%d",sum[i]);
			}
			else
			{
				for(i=0;i<=e;i++)
				printf("%d",sum[i]);
				sum[0]=0;
			}
			s++;
		}
		if(s!=c+1)
		{
			printf("\n");
			printf("\n");
		}
		else
		printf("\n");
	}
}

注意输出的格式。

其实说复杂也不复杂,有些地方是类似的。


  • 4
    点赞
  • 3
    评论
  • 3
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

来自星星的力力

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值