【问题标题】:Unable to process number 600851475143, but I can 13195 perfectly无法处理号码 600851475143,但我可以完美处理 13195
【发布时间】:2013-01-27 04:39:30
【问题描述】:

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

谢谢,

克莱门特

代码:

//
//  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;

}

【问题讨论】:

  • 在做试除时,只需要测试到sqrt(number)即可。这会给你一个很大的加速。您的 for(i

标签: c types floating-point primes


【解决方案1】:

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

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

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

【讨论】:

  • 我在 Sandy Bridge i7 上运行 10.8.2,所以 64 位绝对是硬件支持的,但不确定我的编译器是否支持 64,不过谢谢!
  • 什么编译器?您几乎肯定可以使用 64 位类型。
  • @Clement:我猜 10.8.2 是 OS X,在这种情况下,long long 已经使用了十多年,编译器默认生成 64 位程序。
  • 我还不能接受它,但是在将uint64_t 添加到数字变量和%lld 作为输入之后,我已经成功找到了答案。唯一的问题是它明显比我的 python 变体慢,这令人惊讶。知识欠缺见谅,我昨天学了C
  • @Stephen Canon - 日耳曼评论,但解释如何获得 128 位可能对初学者更有帮助。如果他继续欧拉问题,他将需要大整数。
猜你喜欢
  • 2014-01-20
  • 1970-01-01
  • 1970-01-01
  • 2011-11-16
  • 1970-01-01
  • 1970-01-01
  • 2020-03-04
  • 1970-01-01
  • 2016-08-04
相关资源
最近更新 更多