Smith Number

Description

1982年,Lehigh大学的数学家Albert Wilansky在查看电话簿的时候,突然发现他的姐夫H.Smith的电话号码有一个很特别的性质:该数字的所有位数之和,等于该数所有质因子的位数之和
4937775 = 3 * 5 * 5* 65837
4937775的位数和为:
4+9+3+7+7+7+5 = 42
而该数所有质因子的位数之和为:
3+5+5+(6+5+8+3+7) = 42
于是Albert Wilansky将有这种性质的数叫做Smith number。很显然,质数都有这种性质,所以他把质数排除在外。
而你所要做的,是判断所给的数是否为Smith number。


此题意思很清楚,输入一个数,求出其质因子的位数之和,然后判断是否和原数的位数之和相等,质数排除在外,因为任何一个数(大于2的数)除了质数都可以写成一系列的从小的大的质数的乘的形式,所以对于每一个数都做这样的计算,从i(i>=2)开始遍历,如果这个数对i取摸等于0,那么将这个数除以i,直到取摸i不等于0,纪录i的个数,然后在计算一个i的位数之和,总的位数和为(个数*一个的位数之和),然后i++,i的上界为sqrt(n+0.0),当然最后还要做一个判断,这个数是否是质数,这可以在循环中加一个标记来判断是否有因子;如果是质数,最后n是否是1,如果不是加上这个数的位数之和,否则跳过。

my code:

#include
#include
int main(){
    int n;
    while(scanf("%d",&n)&&n!=0){
        if(n==1||n==2){
            puts("No");
            continue;
        }
        int ws=0,zws=0,t,i;
        t=n;
        while(t>0){
            ws+=t%10;
            t/=10;
        }
        int f=0;
        for(i=2;i<=(int)sqrt(n+0.0);i++){
            int ic=0,iws=0;
            if(n%i==0){
                f=1;
                while(n%i==0&&n>0){
                    ic++;
                    n/=i;
                }
                t=i;
                while(t>0){
                    iws+=t%10;
                    t/=10;
                }
                zws+=ic*iws;
            }
        }
        if(f){
            if(n!=1){
                while(n>0){
                    zws+=n%10;
                    n/=10;
                }
            }
        }
        else{
            puts("No");
            continue;
        }
        if(zws==ws)
            puts("Yes");
        else
            puts("No");
    }
}

转载于:https://www.cnblogs.com/saintqdd/archive/2007/08/07/846390.html

你可能感兴趣的:(人工智能)