题意:
Sample Input
6
123456789 1
888888888 1
888888888 2
888888888 999999999
98640 12345
1000000000 0
Sample Output
5
18
2
0
0
1000000000
大概意思就是给出f(n)和gk(n)的通项公式,让你求gk(n)。
思路:
由于n的范围是1e9,每一位累加和肯定不会超过100,只需要几次递归就可以得到10以内的f(n),至于10以内的递归,我们可以一眼看出它们的循环结和规律
代码:
#include <stdio.h>
int a[10] = {1, 0, 0, 0, 1, 0, 1, 0, 2, 1};
int dfs (int x, int k) {
if (k == 0) return x;
if (x < 10) {
if (x == 8) {
if (k == 1) return a[8];
else if(k == 2) return a[2];
if(k % 2 == 1) return a[0];
else return a[1];
} else if(x == 0) {
if(k % 2 == 1) return a[0];
else return a[1];
} else if(x == 1) {
if(k % 2 == 1) return a[1];
else return a[0];
} else if(x == 2 || x == 3 || x== 5 || x == 7) {
if (k == 1) return a[x];
else if (k % 2 == 0) {
return a[0];
} else {
return a[1];
}
} else if (x == 4 || x == 6 || x == 9) {
if (k == 1) return a[x];
else if (k % 2 == 0) {
return a[1];
} else {
return a[0];
}
}
}
int sum = 0;
while (x) {
sum += a[x % 10];
x /= 10;
}
return dfs(sum, k - 1);
}
int main () {
int T, x, k;
scanf("%d", &T);
while(T --) {
scanf("%d%d", &x, &k);
int ans =dfs (x, k);
printf("%d\n", ans);
}
return 0;
}
如果有写的不对或者不全面的地方 可通过主页的联系方式进行指正,谢谢