【问题标题】:Is there a smart way to use large numbers in C++有没有一种聪明的方法在 C++ 中使用大数
【发布时间】:2020-03-17 16:46:07
【问题描述】:

由于大学关闭并且所有考试都因电晕而取消,我开始用 C++ 编写素数分解算法。有没有办法使用比unsigned long long int 更大的数字?但我必须能够通过终端输入数字并用它计算。

到目前为止,这是我的代码:

#include <iostream>
#include <bits/stdc++.h>
unsigned long long int number = 1;
int main(int argc, char **argv)
{
    while(1){
        std::cout << "Please enter a number: ";
            unsigned long long int counter = 2;
            unsigned long long int root = 1;
            int err = scanf("%llu",&number);
            if(err != 1){
                number = 1;
                std::cerr << "NOPE" << std::endl;
                return 1;
            }else{
            std::cout << "Prime factors of  " << number << " are: "<<  std::endl;
            if(number < 2){
                number = 1;
                root = 1;
            }else{
                root = sqrt(number);
            }
            while(number != 1){
                // If number % counter == 0, counter must be a prime factor!
                if(number % counter == 0){
                    number = number / counter;
                    root = sqrt(number);
                    std::cout << counter <<  std::endl;
                // If number is smaller than root it must be the last prim factor!  
                }else if(number < root || number < counter){
                    std::cout << number <<  std::endl;
                    break;
                }else{
                    counter++;
                }
            }
        }
    }
    return 0;
}

【问题讨论】:

  • 如果你设法找到一个比 O(N) 更好的算法,那么大学将改名以纪念你。
  • 查看作为 Boost 发行版一部分的大量库。学习如何使用 Boost 对您的市场价值很有帮助。这是一个陡峭的学习曲线。
  • 正确方法:获取一个处理任意大小数字的大型整数库。聪明的方法:python(特别说明:我故意将python用于大规模算法或整数数学问题,因为如果性能成为问题,我知道我已经走错了路。他们都是为了更聪明地工作,而不是更努力.)

标签: c++ prime-factoring


【解决方案1】:

GMP 是一个非常高性能的库,用于 C 中的任意精度整数数学,它也可以在 C++ 中使用。有一个字符串转换功能,可以让您接受来自终端或其他字符串源的输入。

https://gmplib.org/

关于使用 GMP 进行素数分解的问题已经在 Stack Overflow 上 exist :)

【讨论】:

    【解决方案2】:

    也许是boost multi-precision 图书馆?

    【讨论】:

    • 仅供参考,我几乎将其标记为不是答案。以后我建议至少解释一下你为什么推荐这个库。
    • 这个赞是我的。我认为答案很有用(尽管它很简洁); Boost 库非常棒。
    【解决方案3】:

    您好,如果您想理解并创建一个好的代码来做这些事情,您必须学习一个非常重要的数学主题“数论”。一本好书可能是 Kraft,Washington's one。看看它并研究一下,你会发现感谢基础表示法和数论,一些微积分会更高效、更容易。

    【讨论】:

      猜你喜欢
      • 2020-08-28
      • 2015-04-07
      • 2012-12-27
      • 2021-03-02
      • 1970-01-01
      • 1970-01-01
      • 2015-12-19
      • 1970-01-01
      • 2010-12-28
      相关资源
      最近更新 更多