poj 1142 Smith Numbers

来源:互联网 发布:星际穿越知乎 编辑:程序博客网 时间:2024/05/17 01:32

分类:其他 难度:1.5

 

题意:将一个数各个位的和,与因式分解的每个因数各个位的和,如相等,为smith数,4937775= 3*5*5*65837,4+9+3+7+7+7+5= 42, 3+5+5+6+5+8+3+7=42。求大于给出的n的最小smith数。因式分解,map记录因式分解结果,map[因数]=出现次数。

#include<cstdio>#include<map>using namespace std;map<int,int>::iterator it;int numsum(int a){int ans=0;for(;a;a/=10){ans += a%10;}return ans;}int facsum(int a){int i,sum=0;map<int,int> fac;int b=a;for(i=2; i*i<=b; i++){if(b%i==0){while(b%i==0){it=fac.find(i);if(it == fac.end()){fac[i] = 1;}else{fac[i]++;}b /= i;}}}if(b == a)return 0;if(b > 1) fac[b] = 1;for(it=fac.begin(); it!=fac.end(); it++){sum += numsum(it->first) * it->second;}return sum;}bool check(int a){int sum1 = numsum(a);int sum2 = facsum(a);//printf("%d %d %d\n",a,sum1,sum2);if(sum1 == sum2)return true;return false;}int main(){int a;while(scanf("%d",&a) && a>0){while(1){a++;if(check(a)){printf("%d\n",a);break;}}}} 


 

原创粉丝点击