POJ1142 Smith Numbers 暴力+分解质因子
题意:
题目定义了一个史密斯数,这个数的定义是:
一个合数的各个位置上加起来的和等于它的素因数所有位置上的数字加起来的和。
比如:
题目定义了一个史密斯数,这个数的定义是:
一个合数的各个位置上加起来的和等于它的素因数所有位置上的数字加起来的和。
比如:
4937775=3∗5∗5∗65837
4+9+3+7+7+7+5=3+5+5+6+5+8+3+7=42
4+9+3+7+7+7+5=3+5+5+6+5+8+3+7=42
题目让你找出比n大的数中最小的这个数。另外:素数不是史密斯数
题解:
运用好递归,暴力枚举
代码:
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 }