solution
- 判斷現有數字是否全為個位數
- 全為個位數,找出出現次數最多的數字,并首行輸出最多出現次數,第二行輸出所有出現該次數的數值
- 不全為個位數
- 若當前位數值為0,無需處理
- 若當前位數值非0,則每位立方相乘,并把結果個位和相加更新為當前位新數值
#include<iostream>
using namespace std;
int n1, n2, flag[10] = {0}, a[1001], maxn = -1, judge = 0, first = 1, d;
int main(){scanf("%d%d", &n1, &n2);for(int i = n1; i <= n2; i++){a[i] = i;}if(n2 > 9) judge = 1;while(judge){judge = 0;for(int i = n1; i <= n2; i++){int t1 = 1, t2 = 0, t = a[i];if(t == 0) continue;while(t){d = t % 10;t /= 10;t1 *= d * d * d;}while(t1){d = t1 % 10;t1 /= 10;t2 += d;}a[i] = t2;if(t2 > 9) judge = 1;}}for(int i = n1; i <= n2; i++){flag[a[i]]++;}for(int i = 0; i < 10; i++){if(flag[i] > maxn) maxn = flag[i];}printf("%d\n", maxn);for(int i = 0; i < 10; i++){if(flag[i] == maxn){if(first) first = 0;else printf(" ");printf("%d", i);}}return 0;
}
or
#include<iostream>
using namespace std;
int n1, n2, flag[10] = {0}, a[1001], maxn = -1, judge = 0, first = 1, d;
int main(){scanf("%d%d", &n1, &n2);for(int i = n1; i <= n2; i++) a[i] = i;if(n2 > 9) judge = 1;while(judge){judge = 0;for(int i = n1; i <= n2; i++){int t1 = 1, t2 = 0, t = a[i];if(t == 0) continue;while(t){d = t % 10;t /= 10;t1 *= d * d * d;}while(t1){d = t1 % 10;t1 /= 10;t2 += d;}a[i] = t2;if(t2 > 9) judge = 1;}}for(int i = n1; i <= n2; i++){flag[a[i]]++;if(flag[a[i]] > maxn) maxn = flag[a[i]];}printf("%d\n", maxn);for(int i = 0; i < 10; i++){if(flag[i] == maxn){if(first) first = 0;else printf(" ");printf("%d", i);}}return 0;
}