标签:style http color os width art
As this observation is also true for every prime number, Wilansky decided later that a (simple and unsophisticated) prime number is not worth being a Smith number and he excluded them from the definition.
Each test case consists of one line containing a single positive integer smaller than 109.
1 4937774
4937775
题意:如果一个合数的各个数字之和等于该数所有素因子的各个数字之和,则称这个数是Smith数。给出一个n,求大于n的最小的Smith数是多少。
分析:对要判断的数进行素因子分解即可。因为所求数小于 10^9,若一个数是合数,则其素因子至少有一个小于或等于sqrt(10^9),则可先把2 - sqrt(10^9) 之间的素数保存起来。
#include<stdio.h> #include<string.h> const int MAXN = 100005; int vis[MAXN], prime[10000], num; void get_prime() { num = 0; memset(vis, 0, sizeof(vis)); vis[0] = vis[1] = 1; for(int i = 2; i < MAXN; i++) { if(!vis[i]) { prime[num++] = i; for(int j = i + i; j < MAXN; j += i) vis[j] = 1; } } } bool is_prime(int x) { if(x == 0 || x == 1) return false; if(x == 2) return true; if(x % 2 == 0) return false; for(int i = 3; i * i <= x; i += 2) if(x % i == 0) return false; return true; } int sum(int x) { int res = 0; while(x) { res += x % 10; x /= 10; } return res; } int main() { get_prime(); int n, t; scanf("%d",&t); while(t--) { scanf("%d",&n); for(int i = n + 1; ; i++) { if(is_prime(i)) continue; int s = 0, tmp = i, tmpsum = sum(i); for(int j = 0; j < num; j++) { if(tmp % prime[j] == 0) { while(tmp % prime[j] == 0) { s += sum(prime[j]); tmp /= prime[j]; } if(is_prime(tmp)) { s += sum(tmp); break; } } } if(tmpsum == s) { printf("%d\n",i); break; } } } return 0; }
UVA 10042 Smith Numbers(数论),布布扣,bubuko.com
标签:style http color os width art
原文地址:http://blog.csdn.net/lyhvoyage/article/details/37913579