浮点异常:史密斯数字检查中的8。

问题描述 投票:0回答:1

所以我写了一段代码来检查一个长int数是否是Smith,但我一直得到浮点异常: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; 
} 
c++ number-theory
1个回答
0
投票

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

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
> 

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

© www.soinside.com 2019 - 2024. All rights reserved.