c - c 中查找 12 位数字的质因数时出现溢出错误

标签 c primes integer-overflow prime-factoring

我想解决这个问题:https://projecteuler.net/problem=3通过这个程序,但我不确定它使用 long long int 的真正方法。

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
    long long int result = factors(6051475143);
    printf("%lld", result); 
    return 0;
}

void factors(int number) {
    int factor[100000];
    int index = 0, i = 1;
    for (; i < number; i++) {
        if (number % i == 0) {
            factor[index] = i;
            index += 1;
        }
    }
    findprime(factor, 100000);
}

int findprime(int prime[], int size) {
    int i = 0, j;
    long long int latestprime;
    for(; i < size; i++) {
        if (prime[i] == 0)
            break;
        int is_prime = 1;
        for (j = 2; j < prime[i]; j++) {
            if (prime[i] % j == 0 && prime[i] != j) {   
                is_prime = 0;
                break;
            }
        }
        if (is_prime == 1)
            latestprime = prime[i];
    } 
    return latestprime;
}

如果我尝试 10 位数字,它会起作用,但当我尝试 12 位数字时,它会返回零。

最佳答案

要解决这个问题,您确实需要一个足够大的类型来表示数字。 unsigned long long 被指定为至少有 64 个值位,即 18446744073709551615

您的程序有未定义的行为,即使是少量:result = Factors(6051475143) 不能可靠地存储任何有用的信息,因为 factors 是定义为 void 函数,甚至没有 return 语句。它的工作是偶然的,因为最后一个语句 findprime(factor, 100000);findprime 的返回值留在寄存器中,其中 main 检索什么它期望是 factors()int 结果,这是编译器因缺乏原型(prototype)而推断出的返回类型。

要找到最大的质因数,您应该尝试因数,并在找到能整除它的数时减少该数。

这是修改后的版本:

#include <stdio.h>

unsigned long long largest_factor(unsigned long long number) {
    unsigned long long p;
    if (number < 2)
        return number;
    for (p = 2; p * p <= number; p++) {
        while (number % p == 0) {
            number /= p;
        }
    }
    if (number == 1)
        return p;
    else
        return number;
}

int main(int argc, char *argv[]) {
    printf("%llu\n", largest_factor(6051475143)); 
    return 0;
}

关于c - c 中查找 12 位数字的质因数时出现溢出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63848965/

相关文章:

c++ - 在 Linux 中查找函数签名

c - 为什么 Python 3 和 C 中的 if 语句会产生不同的结果?

algorithm - 和为质数的特殊对

algorithm - 数学范围错误 - 有没有办法进一步限制该算法以避免

c - 我应该使用C中的十六进制数字格式来执行算术吗?

c++ - 实现安全左移

c - 使用结构体指针的段错误

Haskell 列表递归 - 为什么一个有效而另一个无效?

c - 整数溢出以及pow()和乘法的区别

c - 下面的程序是尾递归吗?