双十一补题——大数加法

题目描述

给定一个数X,注意X是个大数,X的长度不超过1e5。

让你求出一个Y,满足三个条件,Y>X && (Y这个数的每一个数字总和)%10==0 还有就是满足以上两个条件最小的。

输入

在输入的第一行中存在整数T(T<=100),指示测试用例的数目。
下面的T行描述所有查询,每个查询都有正整数x。x的长度不超过1e5。

输出

为每组数据输出满足条件的那个数。

样例输入

1
202

样例输出

208

思路:

就是一个正数的大数加法问题,其中Y需要满足的条件:

1、Y>X-----------(从X开始往上加,找Y

2、sum(Y这个数的每一个数字总和)%10==0 还有就是满足以上两个条件最小的--------

从X加1到X加10之间找,即10为一个周期,在这之间一定能找到sum%10==0的数

代码

#include<stdio.h>//大数加法 
#include<string.h>
#include<math.h>
#include<algorithm> 
using namespace std;
const int maxn = 1e5+7;
#define Max(a,b) a>b?a:b
char str1[maxn],str2[10];
int a[maxn],b[maxn];
void strv(char str[],int a[],int n)//用数组逆序存储 
{
	for(int i=0,j=n-1;i<n;i++,j--)
	{
		a[j]=str[i]-'0';
	}
}
int main()
{
	    int t; 
	    scanf("%d",&t);
		while(t--)
		{
	    scanf("%s",str1);
	    int y=strlen(str1);
		if(y==1)
		printf("19\n");
		else
		{
			for(int i=1;i<=10;i++)//从1加到10,在这之间一定有一个数使Y%10==0 
	    {
	   	memset(a,0,sizeof(a));
		memset(b,0,sizeof(b));
		int n1=strlen(str1);
		int n2; 
		if(i<10)
		{
		   n2=1;
		   b[0]=i; 
		}
		else
		{
			n2=2;
			b[0]=0;
			b[1]=1;
		}
		strv(str1,a,n1);
		int j,w;
		int k=Max(n1,n2);
		for(j=0,w=0;j<k;j++)
		{
			a[j]=a[j]+b[j]+w;
			w=a[j]/10;
			a[j]%=10;
		}
			if(w) 
			a[k]+=w;
			int sum=0;
		for(int i=k;i>=0;i--)//计算相加后每一位数字之和 
		{
			sum+=a[i];
		}
		if(sum%10==0)
		{
			for(int i=k;i>=0;i--)//相加后的和,可能比最大的数还要多一位 
		{
			if(i==k&&a[k]==0)
			 continue;
			printf("%d",a[i]);
		}
		printf("\n");
			break;
		}
		}
		 } 
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_42804678/article/details/84072878