-
给定正整数N,函数F(N)表示小于等于N的自然数中1和2的个数之和,例如:1,2,3,4,5,6,7,8,9,10序列中1和2的个数之和为3,因此F(10)=3。输入N,求F(N)的值,1=<N<=10^100(10的100次方)若F(N)很大,则求F(N)mod20123的值。
找规律,注意边界
题目描述:
-
输入:
-
输入包含多组测试数据,每组仅输入一个整数N。
-
输出:
-
对于每组测试数据,输出小于等于N的自然数中1和2的个数之和,且对20123取模。
-
样例输入:
-
10 11
-
样例输出:
-
3 5
-
提示:
-
建议用scanf ("%s")输入,而不建议用gets()!
-
-
写得很乱。。。。
-
#include <stdio.h> #include <string> using namespace std; const int MOD = 20123; int mod(string a) // 对20123取余 { int res = 0; for(int i = 0; i < a.length(); i++) { res = (res*10 + (a[i] - '0')) % MOD; } return res; } int count(string a, int n, int k) //计算字符串第n位出现k的次数 { string l; if(n != 0) { l = a.substr(0,a.length()-1); for(int i = n; i < a.length()-1; i++) l[i] = '0'; } else { l = a.substr(0,a.length()); for(int i = 0; i < a.length(); i++) { if(i == 0) l[i] = '1'; else l[i] = '0'; } } string r; if(n != a.length()-1) r = a.substr(n+1); int res; if(a[n] - '0' < k) { if(n == 0) res = 0; else res = mod(l); } else if(a[n] - '0' == k) { if(n == 0) res = mod(r) + 1; else if(n == a.length()-1) res = mod(l) + 1; else res = mod(r) + mod(l) + 1; } else if(a[n] - '0' > k) { if(n == 0) res = mod(l); else if(n == a.length()-1) res = mod(l) + 1; else { l[n-1] += 1; res = mod(l); } } return res; } int main() { char a[110]; while(scanf("%s",a) != EOF) { string buf; buf = a; int tmp1, tmp2, ans = 0; for(int i = 0; i < buf.length(); i++) { tmp1 = count(buf,i,1) % MOD; tmp2 = count(buf,i,2) % MOD; //printf("%d %d\n",tmp1,tmp2); ans = (ans + tmp1 + tmp2) % MOD; } printf("%d\n",ans); } return 0; }