【问题标题】:Floating point exception: 8 on Smith number check浮点异常:史密斯数检查中的 8
【发布时间】:2020-05-22 12:59:45
【问题描述】:

所以我写了一个代码来检查一个长整数是否是史密斯,但我不断收到浮点异常:8,无论我修复我的变量的大小。不太确定我错过了什么。

#include <iostream>

 bool isPrime(long int k) { 
   if (k == 1) return false;  
   for (long int i = 2; i*i < k; i++) 
    if (k % i == 0) 
        return false; 

return true; 
} 

int main(){

long int n;
std::cin >> n;
long int sumPr = 0, sumCif = 0;
 while (n > 0) { 
    sumCif += n % 10; 
    n = n/10; 
}

for (long int i = 0; i*i<=n/2; i++) {
    if (isPrime(i)) {
        while (n % i == 0){
            long int p = i;
            while (p > 0) { 
            sumPr += (p % 10); 
            p = p/10; 
        } 
            n = n/i;
        }
    }
}
 if (sumPr == sumCif) std::cout << "1" ; else std::cout << "0";
return 0; 
} 

【问题讨论】:

  • n = n/i - 这里可能被零除。
  • 请注意,您的 isPrime 对于素数平方将失败。
  • 您的isPrime0 返回true。这意味着您在n=n/i;上除以0

标签: c++ number-theory


【解决方案1】:

这个循环的限制似乎是有缺陷的:

for (long int i = 0; i*i<=n/2; i++) {

部分原因可能是从isPrime() 复制和粘贴。但更大的问题是您需要模块化此代码,以便您可以正确测试每个组件。并重用模块(例如,您在代码中两次实现一个数字的数字总和。)代码重复是一个潜在的错误来源。

#include <iostream>

bool isPrime(long number) { 
    if (number < 2) {
        return false;
    }

    if (number % 2 == 0) {
        return (number == 2);
    }

    for (long divisor = 3; divisor * divisor <= number; divisor += 2) {
        if (number % divisor == 0) {
            return false;
        }
    }

    return true; 
}

long sum_digits(long number) {
    long sum = 0;

    while (number > 0) { 
        sum += number % 10; 
        number /= 10; 
    }

    return sum;
}

long sum_prime_factor_digits(long number) {
    long sum = 0;

    for (long divisor = 2; divisor <= number; divisor++) {
        if (isPrime(divisor)) {
            while (number % divisor == 0) {
                sum += sum_digits(divisor);
                number /= divisor;
            }
        }
    }

    return sum;
}

bool is_smith(long number) {
    if (isPrime(number)) {
        return false;  // only composites can play this game
    }

    return sum_digits(number) == sum_prime_factor_digits(number);
}

int main() {
    long number;
    std::cin >> number;

    if (is_smith(number)) {
        std::cout << "1";
    } else {
        std::cout << "0";
    }

    std::cout << "\n";

    return 0; 
}

测试

> ./a.out
4
1
> ./a.out
5
0
> ./a.out
6
0
> ./a.out
22
1
> ./a.out
4937775
1
> ./a.out
15966114
1
> 

编写干净的代码不是事后你做的事情,而是你在调试过程中帮助你做的事情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-26
    相关资源
    最近更新 更多