Smith Numbers POJ - 1142 暴力递归枚举
题意:
给你一个数x,把这个分解成素数之积(假设是x1*x2*x3),如果 x的每一数位的和 等于 x1每一数位的和加上x2每一数位的和加上x3每一数位的和,那么他就是题目要找的数
示例:
4937775 = 3 * 5 * 5 * 65837
电话号码的所有数字的和为4+9+3+7+7+7+5= 42,其质因数的数字的和为3+5+5+6+5+ 5+8+3+7=42。
题解:
暴力,具体见代码
代码:
1 #include<stdio.h> 2 #include<string.h> 3 #include<iostream> 4 #include<algorithm> 5 #include<math.h> 6 using namespace std; 7 typedef long long ll; 8 const int maxn=100005; 9 bool isprim(int x) 10 { 11 for(int i=2;i<=sqrt(x);++i) 12 { 13 if(x%i==0) return 0; 14 } 15 return 1; 16 } 17 int get_sum(int x) 18 { 19 int ans=0; 20 while(x) 21 { 22 ans+=x%10; 23 x/=10; 24 } 25 return ans; 26 } 27 int digui(int x) 28 { 29 int temp=sqrt(x); 30 if(isprim(x)) 31 return get_sum(x); 32 else 33 { 34 for(int i=2;i<=temp;++i) //这个for循环作用就是找一个x的因子 35 { 36 if(x%i==0) 37 return digui(i)+digui(x/i); 38 } 39 } 40 } 41 int main() 42 { 43 int n; 44 while(~scanf("%d",&n) && n) 45 { 46 while(n++) 47 { 48 if(!isprim(n) && digui(n)==get_sum(n)) 49 break; 50 } 51 printf("%d\n",n); 52 } 53 return 0; 54 }