zoj3336 模拟

来源:互联网 发布:网络使人更疏远的数据 编辑:程序博客网 时间:2024/05/21 08:39

Friend Number II

Time Limit: 1 Second Memory Limit: 32768 KB

Given a positive integer x, let S(x) denotes the sum of all x's digits. Two integersx and y are friend numbers if S(x)=S(y). Here comes the problem: Given a positive integerx, of course it has a lot of friend numbers, find the smallest one which is greater thanx,please.

Input

There are multiple test cases. The first line of input is an integer T (0<T<230) indicating the number of test cases. ThenT test cases follow. Each case is an integer x (0<x<=101000).

Output

For each test case, output the result integer in a single line.

Sample Input

31219222

Sample Output

2128231

题意:给出一个数x,要找到一个各位数之和与x相等,且是比它大中最小的数

思路:其实很容易就能发现,只要从后往前边累加边找,当找到某一位不为9且这一位后面那些数的和不为0便可以开始处理。

首先,把该位+1存到另一个字符串中,然后从最后一位开始处理,当和大于9时,依次往前补9,补到和小于9时,剩下那位就补剩下的和,接着从这位开始到刚才+1的那一位之间补0。这样就保证一定最优。剩下+1那一位前面的那一段直接原封不动地保留下来。

例如:871299300 ,3虽不等于9但后面和为0,无法直接处理。直到找到2不等于9,且后面99300又不等于0。所以2变成3,99300和为12,从后往前补两个9,再补3,再补0,就是300399,然后前面保留下来,最终答案就是871300399

注意全部为9的情况就好了

#include<cstdio>#include<cstring>char fu[1250];char zi[1250]={0};int tp;int main(void){int t,sum,len,ok;scanf("%d",&t);while(t--){scanf("%s",fu);len=strlen(fu);tp=1200;sum=ok=0;for(int i=len-1;i>=0;i--,tp--){if(ok) {zi[tp]=fu[i];continue;}sum+=fu[i]-'0';if(fu[i]=='9'||sum-(fu[i]-'0')==0) continue;else {zi[tp]=fu[i]+1;sum-=zi[tp]-'0';int now=1200;while(sum/9){zi[now--]='9';sum-=9;}if(sum) zi[now--]=sum+'0';for(;now>tp;now--)zi[now]='0';ok=1;}}if(ok==0){zi[tp]='1';sum--;int now=1200;while(sum/9){zi[now--]='9';sum-=9;}if(sum) zi[now--]=sum+'0';for(;now>tp;now--)zi[now]='0';tp--;}printf("%s\n",&zi[tp+1]);}return 0;}




0 0
原创粉丝点击