In this problem, we should solve an interesting game. At first, we have an integer n, then we begin to make some funny change. We sum up every digit of the n, then insert it to the tail of the number n, then let the new number be the interesting number n. repeat it for t times. When n=123 and t=3 then we can get 123->1236->123612->12361215.
Multiple input. We have two integer n (0<=n<= 104 ) , t(0<=t<= 105 ) in each row. When n==-1 and t==-1 mean the end of input.
For each input , if the final number are divisible by 11, output “Yes”, else output ”No”. without quote.
35 2 35 1 -1 -1
Case #1: Yes Case #2: No
题意:给你一个数n和操作次数t,每次操作将n的各位数之和求出来放在n的末尾形成新的n,问t次操作后得到的n是否可以被11整除。蓝色部分如果不理解,可以举个例子,如题中提到的n=123,第一次操作求得的各位之和为1+2+3=6,放在n的末尾形成新的n=1236;第二次操作各位之和为1+2+3+6=12,形成新的n为123612;以此类推。
首先,有一点要清楚的是,怎么样的数能被11整除,原先知道也好,百度过也好,你会知道,当一个数的奇数位之和与偶数位之和的差的绝对值能被11整除,那么该数就可以被11整除。如35816,奇数位之和为17,偶数位之和是6,差的绝对值为11,所以能被11整除。
既然知道了这一点,那就可以直接做了,每次操作,只要+奇数位,-偶数位,那么最终结果求一下绝对值再看能不能被11整除就行了。
这题总体来说还是比较简单的,刚开始想到没敢写,毕竟总觉得会超时,如此暴力,结果就A了,好吧,是我想太多
上代码,有问题欢迎留下评论,我会尽快回复
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<queue> #include<math.h> #include<vector> #include<map> #include<set> #include<stdlib.h> #include<cmath> #include<string> #include<algorithm> #include<iostream> #define exp 1e-10 using namespace std; const int N = 20; const int inf = 1000000000; int s[N],k; __int64 Abs(__int64 x) { return x<0?-x:x; } __int64 fun(__int64 x) { __int64 tem=0; while(x) { s[k++]=x%10; tem+=x%10; x/=10; } return tem; } int main() { __int64 n,m,ans,tem; int t,v,j=1; while(scanf("%I64d%d",&n,&t)&&(n!=-1||t!=-1)) { ans=k=0; v=1;m=fun(n); while(k--) if(v) ans+=s[k],v=0; else ans-=s[k],v=1; while(t--) { k=0; m+=fun(m); while(k--) if(v) ans+=s[k],v=0; else ans-=s[k],v=1; } printf("Case #%d: ",j++); if(Abs(ans)%11) puts("No"); else puts("Yes"); } }菜鸟成长记