UVALive2203 UVa10042 Smith Numbers【质因数分解+素数判定+数位之和】

Regionals 2000 >> Europe - Mid-Central
Regionals 2000 >> Europe - Northwestern
Regionals 2000 >> Europe - Southwestern


问题链接UVALive2203 UVa10042 Smith Numbers

题意简述:寻找大于输入数并且最接近的Smith Numbers。

问题分析

Smith Numbers数不是素数,其各位数字之和等于其各个因子的各位数字之和。。

程序说明

该问题与《POJ1142 HDU1333 Smith Numbers【质因数分解+素数判定+数位之和】》是同一个问题,只是输入形式不同

函数digitsum()用于计算数的各位数字之和。

函数fact_digitsum用于计算数的各个因子的数字之和,但是若为素数则返回-1。函数中对因子的数量进行了计数,若为1则数为素数。

相关链接POJ1142 HDU1333 Smith Numbers【质因数分解+素数判定+数位之和】


AC的C++语言程序如下

/* UVALive2203 UVa10042 Smith Numbers */

#include <iostream>

using namespace std;

const int BASE10 = 10;

inline int digitsum(int n)
{
    int sum = 0;
    while(n) {
        sum += n % BASE10;
        n /= BASE10;
    }
    return sum;
}

int fact_digitsum(int n)
{
    int digitsum2 = 0, count = 0;
    for(int i=2; i*i<=n; i++) {
        while(n % i == 0) {
            count++;
            digitsum2 += digitsum(i);
            n /= i;
        }
    }
    if(n > 1 && count)
        digitsum2 += digitsum(n);
    if(count == 0)
        digitsum2 = -1;

    return digitsum2;
}

int main()
{
    int t, n;

    cin >> t;
    while(t--) {
        cin >> n;
        for(n++; ; n++) {
            if(digitsum(n) == fact_digitsum(n)) {
                cout << n << endl;
                break;
            }
        }
    }

    return 0;
}



原文地址:https://www.cnblogs.com/tigerisland/p/7563758.html