• A


    While skimming his phone directory in 1982, Albert Wilansky, a mathematician of Lehigh University,noticed that the telephone number of his brother-in-law H. Smith had the following peculiar property: The sum of the digits of that number was equal to the sum of the digits of the prime factors of that number. Got it? Smith's telephone number was 493-7775. This number can be written as the product of its prime factors in the following way: 
    4937775= 3*5*5*65837

    The sum of all digits of the telephone number is 4+9+3+7+7+7+5= 42,and the sum of the digits of its prime factors is equally 3+5+5+6+5+8+3+7=42. Wilansky was so amazed by his discovery that he named this kind of numbers after his brother-in-law: Smith numbers. 
    As this observation is also true for every prime number, Wilansky decided later that a (simple and unsophisticated) prime number is not worth being a Smith number, so he excluded them from the definition. 
    Wilansky published an article about Smith numbers in the Two Year College Mathematics Journal and was able to present a whole collection of different Smith numbers: For example, 9985 is a Smith number and so is 6036. However,Wilansky was not able to find a Smith number that was larger than the telephone number of his brother-in-law. It is your task to find Smith numbers that are larger than 4937775!

    Input

    The input file consists of a sequence of positive integers, one integer per line. Each integer will have at most 8 digits. The input is terminated by a line containing the number 0.

    Output

    For every number n > 0 in the input, you are to compute the smallest Smith number which is larger than n,and print it on a line by itself. You can assume that such a number exists.

    Sample Input

    4937774
    0
    题目大意:
    给你一个数,求大于这个数字并满足以下条件的最小值:
        条件:数字的各个位置加起来与用质数拆分该数字后得到的数字的各个位置之和相等 4937775= 3*5*5*65837
    暴力模拟就可以啦 首先要知道质数拆分,然后将得到的每个数字的各个位置相加相等。如果与原数字相等的话说明找到啦!
    #include<iostream>
    #include<cstdio>
    using namespace std;
    
    int check(int x){//由于数字范围太大,不能打表,只能这样一步一步来
        for(int i=2;i*i<=x;i++){
            if(x%i==0) return 0;
        }
        return 1;
    }
    
    int f2(int x){
        int sum=0;
        while(x){
            sum+=x%10;
            x=x/10;
        }
        return sum;
    }
    int f(int x){
        int sum=0;
        for(int i=2;i*i<=x;i++){//拆分
            if(x%i==0){
                int ans=0;
                if(i<10)
                { 
                    while(x%i==0){
                        ans++;
                        x=x/i;
                    }
                    sum+=i*ans;
                }
                else {
                    int s=f2(i);
                    while(x%i==0){
                        ans++;
                        x=x/i;
                    }
                    sum+=s*ans;
                }
            }
        }
        if(x>1) sum+=f2(x);
        return sum;
    } 
    int main(){
        int n;
        while(scanf("%d",&n)!=EOF&&n){
            for(int i=n+1;;i++){
                if(check(i)==0){
                    if(f2(i)==f(i)){
                        printf("%d
    ",i);
                        break;
                    }
                    
                }
            }
        }
        return 0;
    }



  • 相关阅读:
    [k8s微服务作业]-day2-Docker基础
    运维常用命令记录
    【莫比乌斯反演】学习笔记
    2021牛客OI赛前集训营-提高组(第一场)
    NOIP 计划 · 模拟赛 #10
    2021牛客OI赛前集训营-提高组(第二场)
    10.5 模拟赛题解报告
    组合数学
    线段树合并
    2021, 9,26 模拟赛
  • 原文地址:https://www.cnblogs.com/Accepting/p/11343145.html
Copyright © 2020-2023  润新知