c - 无法处理号码 600851475143,但我可以完美处理 13195

标签 c types floating-point primes

基本上,我一直在尝试完成 projecteuler.net 上的第 3 个问题。该示例为我提供了数字 13195,该程序(用 C 语言编写)准确地返回了 5 7 13 29 的质因数树,但是当我输入问题编号 600851475143 时,没有任何反应。大约一年前,我还在 Python 中编写了一个类似的程序,它解决了 600851475143 的因子树。我认为这与我正在使用的数据类型有关,但我找不到可靠的信息来源和如何用 float / double /大东西做模数。

谢谢,

克莱门特

代码:

//
//  main.c
//  Project Euler Question 3
//
//  Created by Cwbh on 2/11/13.
//  Copyright (c) 2013 Cwbh. All rights reserved.
//

#include <stdio.h>
#include <math.h>

int is_prime(int x);

int main(int argc, const char * argv[])
{
    int pft[100];
    int number;
    int pointerloc = 0;

    printf("Enter the number to find the Prime Factor Tree of: ");
    scanf("%d", &number);

    if (is_prime(number) == 0) {
        for (int i = 2; i < number; i++) {
            if (number%i == 0 && is_prime(i) == 1) {
                pft[pointerloc] = i;
                pointerloc++;
            }
        }
    }else{
        printf("You've entered a prime number to begin with!");
    }

    for (int i = 0; i < pointerloc; i++) {
        printf("%d\n",pft[i]);
    }


    return 0;
}

int is_prime(int x){
    int prime = 1;

    for (int i = 2; i < x; i++) {
        if (x%i == 0) {
            prime = 0;
            break;
        }
    }

    return prime;

}

最佳答案

看起来 int 在您的机器上是 32 位类型。这意味着 600851475143 不适合(32 位整数中可表示的最大数字是 4294967295)。使用 64 位类型,你应该没问题。您可以使用 stdint.h 中的 uint64_t,或者您的机器可能有 64 位 longlong long类型。

% 运算符仅适用于 C 中的整数类型,因此尝试将其用于 floatdouble 将不起作用。

您的另一个选择是使用某种“大数”库。您当然可以编写自己的简单程序来解决这个级别的欧拉计划问题。

关于c - 无法处理号码 600851475143,但我可以完美处理 13195,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14822973/

相关文章:

grails - 在 gorm 中使用时间的数据类型是什么?

c - 如何在C中根据数据类型显示表达式的结果

javascript - 在 JavaScript 中将负 float 转换为正 float

Javascript Float32Array 怪异

c - 为什么我的 NDIS 筛选器驱动程序的 FilterReceiveNetBufferLists 处理程序未被调用?

我无法理解预处理宏

.net - 如何在 .net 中查找数组的元素类型

c - 为什么 float 不会溢出到无穷大

c - 在 C OpenMP 中并行化函数

c++ - 用于在 linux 中获取 CPU 负载的 C API