您的位置:首页 > 理论基础 > 计算机网络

http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2633

2013-08-10 16:39 435 查看
题意描述:输入N组数据,计算每一个比该数大并且每位数字之和可被十整除的最小数字,例如202 2+0+2=4,10-4=6,所以208符合题意;

1:若最后一位数字加上补齐的数字之和依然不大于9,就比如202的例子可直接输出加上6的结果208;

2:若大于9则有分为两种情况(1)从第一位一直进到最后一位就像999998,每位之和44此时结果只有一种情况符合也就是1000009,直接输出之;(2)进位没有进到最后在这里我举例说明比如80998 sum=34 只需再加6 ,然后6+8=14 每进一位这个14必须减一才可以符合题目要求,所以用一个bit 变量记录进了几位 然后减之 后面的公式就出现了用a【len-1】保存14,每进一位就减一最后对10取余就ok了,对于加100000的意思是,此题不会超过十万位,因此进位的bit变量是很大的,这个十万是为了中和其中相减所产生的负值,比如进位bit=74,然后啊a【len-1】不会超过20,这样一减就成负值了。公式:a[len-1]=(a[len-1]+100000-bit)%10;

代码:

#include<stdio.h>
#include<string.h>
int main()
{
int n, i,len,ans;
int sum;
char ch[100050];
int a[100050];
scanf("%d",&n);
while(n--)
{
sum=0;
scanf("%s",ch);
len=strlen(ch);
for(i=0; i<len; i++)
{
a[i]=ch[i]-'0';
sum+=a[i];
}

ans=10-sum%10;
a[len-1]+=ans;
int bit=0;
if(a[len-1]>9)
{
for(i=len-2; i>=0; i--)
{
bit++;
a[i]++;
a[i]%=10;
if(a[i])
break;
}
if(i<0)
{
printf("1");
for(i=0; i<=len-2; i++)
printf("0");
printf("9");
}
else
{
a[len-1]=(a[len-1]+100000-bit)%10;
for(i=0; i<len; i++)
printf("%d",a[i]);
}
}
else
{
for(i=0; i<len; i++)
printf("%d",a[i]);
}
printf("\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐