zoj3336 模拟
来源:互联网 发布:网络使人更疏远的数据 编辑:程序博客网 时间:2024/05/21 08:39
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;}
- zoj3336 模拟
- 模拟
- 模拟
- 模拟
- 模拟
- 模拟
- 模拟
- 模拟
- 模拟
- 模拟
- 模拟:
- 模拟
- 模拟
- 模拟
- 模拟
- 模拟
- 模拟
- 模拟
- Java 定时器使用
- STL之查找
- TCP协议三次握手过程分析
- hdu4939 Stupid Tower Defense(Dp)
- 每天学一点C#
- zoj3336 模拟
- w3c sql
- String能变化吗?和StringBuffer的区别是什么?
- LeetCode Balanced Binary Tree
- UVA - 10690 Expression Again
- zoj 2112 主席树+树状数组求动态第k大
- hdu 4939 Stupid Tower Defense dp
- poj--2478
- UDP和TCP的比较