标签:std while 数字游戏 大脑 数列 字符 cst continue 随机
好玩的数字游戏
TK在虐题的同时,也喜欢玩游戏。
现在,有这样的一个游戏,规则是这样的:
先随机给出一个数字N,然后你在操场上把1到N的所有数字写成一排,就像这样:
123456789101112131415….
接着你在每个数字前面添上加减号,每逢排在奇数位上的数字,就写上加号;每逢排在偶数位上的数字,就写上减号。恩…最后你得到一个超级长的式子。并且可以算出这个式子的结果。
TK觉得这个游戏很有意思,于是他没日没夜地玩啊玩啊玩啊…
或许你觉得这个游戏没有意思…恩…但是,如果你是TK,对于给定的N,你能够算出来最后的结果应该是多少么?
1 #include<cstdio> 2 #define ll long long 3 using namespace std; 4 ll ans,n,pows[19]; 5 int main() 6 { 7 pows[0]=1; for(int i=1;i<=18;i++) 8 pows[i]=pows[i-1]*10; 9 while(1) 10 { 11 scanf("%lld",&n); if(n==0) return 0; 12 for(int i=1;i<=9;i++)for(int j=0;j<=15;j++)for(int k=j;k<=15;k++) 13 { 14 ll start,end,fr; 15 if(pows[j]*i+(k>j)*pows[k]>n) continue; 16 start=j==k?0:pows[k-1]; 17 if(n>=pows[j]-1+pows[j]*i+pows[k+1]-pows[j+1]) end=pows[k]-1; 18 else if(n%pows[j+1]/pows[j]<i) 19 end=n/pows[j+1]*pows[j]-1; 20 else if(n%pows[j+1]/pows[j]==i) 21 end=n/pows[j+1]*pows[j]+n%pows[j]; 22 else end=n/pows[j+1]*pows[j]+pows[j]-1; 23 fr=(((i&1&&j==0&&(k&1)==0)^(k&1)^(j&1))*2-1)*i; 24 if((k&1)==0&&j) 25 { 26 if(((start^end)&1)==0) ans+=fr; 27 } 28 else ans+=(end-start+1)*fr; 29 } 30 printf("%lld\n",ans);ans=0; 31 } 32 }
标签:std while 数字游戏 大脑 数列 字符 cst continue 随机
原文地址:http://www.cnblogs.com/wcz112/p/6341407.html