【问题标题】:Prime numbers between two large numbers?两个大数之间的质数?
【发布时间】:2014-11-09 02:04:09
【问题描述】:

我想找到两个 13 位数字(1,000,000,000,000 和 1,000,000,100,000)之间的质数...我使用了类似 unsigned long longlong long intscanf%llu%lld 之类的东西工作。我怎样才能做到这一点?我使用这样的代码:

int main()
{
  long long int n1, n2, i;
  int flag, j;
  printf("Enter two numbers (intervals): ");
  scanf("%lld %lld", &n1, &n2);
  printf("Prime numbers between %lld and %lld are: ", n1, n2);
  for(i=n1+1; i<n2; ++i)
  {
      flag=0;
      for(j=2; j<=i/2; ++j)
      {
        if(i%j==0)
        {
          flag=1;
          break;
        }
      }
      if(flag==0)
        printf("%lld ",i);
  }
  return 0;
}

【问题讨论】:

  • 什么不起作用?算法还是scanf?
  • 筛子会覆盖13位数字吗??
  • 您可能希望在某些输出中包含一些换行符。提示中不需要它(第一个printf());大多数系统将确保在读取任何内容之前刷新标准输出。但其他打印操作应包括一些换行符。你的算法效率很低。除此以外,2 是唯一的偶素数。
  • 尝试使用%Ld 而不是%lld for long long intscanf()

标签: c


【解决方案1】:

jint,大概是32位类型,而ilong long int,大概是64位类型。由于i大于2³²,所以i/2的值大于int类型的最大值,即2³¹-1。因此,比较 j&lt;=i/2 始终为真,并且循环 for(j=2; j&lt;=i/2; ++j) 除了通过主体内的 break 之外永远不会停止。但是这个break 仅在ji 的除数时才被调用,而当i 是素数时不会发生这种情况。

如果您将j 更改为long long int,我认为您的程序可以工作,但需要很长时间才能完成内部循环——n1/2 迭代。一个简单的改进是停在i 的平方根而不是i 的一半。仅这一点就可以让程序在我的机器上以不错的速度运行。

您应该在每个printf 调用之后添加fflush(stdout);,否则输出将被缓冲直到程序退出。或者,首先调用setbuf(stdout, NULL) 来关闭输出缓冲。

这种朴素的算法绝对可以改进:它重复了大量的计算。您可以将信息存储在内存中,以避免一遍又一遍地进行相同的测试;这是时间/内存的权衡。 sieve of Eratosthenes 是一个相当简单的算法,它将权衡取舍到另一个极端:它维护一个 sqrt(n2) 位表,其中第 k 个条目指示 k 是否为素数。这在这里是可行的。你也可以看看开源BSD primes utility 看看他们是怎么做的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-24
    • 2021-01-14
    • 1970-01-01
    • 1970-01-01
    • 2018-05-11
    • 2021-11-02
    • 2011-03-14
    相关资源
    最近更新 更多