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 }

 

posted @ 2020-05-13 16:12  kongbursi  阅读(106)  评论(0编辑  收藏  举报