【问题标题】:total prime divisors of every index in array数组中每个索引的总素数
【发布时间】:2022-01-29 11:01:17
【问题描述】:

所以我正在编写一个程序,它计算所有数字的质数除数高达 200 万。 所以逻辑是所有素数数组索引的值都为 1,所有复合数组索引的值都为 no。的主要除数。例如。 pno[3] = 1 ;pno[4]=1; pno[6]=2 ; pno[9]=1 等等。


void prim(){
    
long int pno[20000001] = {0};  //initialise all as 0
    for(long i=1;i<=2000000;++i){
        if(pno[i]==0){            //check if no is prime
            
            
            for(long j=i;j<=2000000;++j){   
                
                if(j%i==0){  //if i(a prime) divides j(a composite) then increase 
                    ++pno[j];
                    
                }
            }
        }
    }
    
}

但它没有按预期工作,并且每个值最后都设置为 1。这里有什么问题?

编辑:这个问题已通过 James K polk 的评论解决。我应该从 i=2 开始,而 j 应该增加 i

【问题讨论】:

  • long int pno[20000001] = {0}; //initialise all as 0 这很可能会耗尽堆栈内存。然后你有一个嵌套的 for 循环,它将执行 2000000000000 次。显然,你试图解决这个问题的方式是不对的。
  • 你从 1 开始,这是一个错误。首先 1 不是素数,其次每个数字都可以被 1 整除。从 2 开始。j 循环也应该在每次迭代时增加 'i',而不是 1。所以for(long j=i;j&lt;=2000000;j+=i)
  • @PresidentJamesK.Polk 哦哦!现在觉得自己好傻。太感谢了。您的评论更正了我的代码。

标签: c++ primes


【解决方案1】:

你的第一个 if 语句是错误的。您需要一些算法来确定您当前的数字是否是素数(例如,使用最大公约数可能很有用)。您的代码只是检查该位置的元素是否为零,但在从外部循环执行一步后不再是这种情况,因为您正在递增除内部循环中的第一个元素之外的每个元素

【讨论】:

  • 欢迎堆栈溢出。感谢您的贡献。我必须警告你,这些问题有点浪费你的努力。这个问题很可能会被关闭。而且你不会得到提问者的赞赏,因为你没有给出完整的解决方案。 (不是你应该)
  • @JHBonarius:我认为没有理由结束这个问题。
  • 嘿狼,现在我意识到我的错误了。我应该从 i=2 开始。那么代码将正常工作
猜你喜欢
  • 1970-01-01
  • 2014-09-29
  • 2016-07-22
  • 1970-01-01
  • 1970-01-01
  • 2019-04-21
  • 1970-01-01
  • 1970-01-01
  • 2021-10-04
相关资源
最近更新 更多