C-下10个素数
我在这里写的程序有点问题。 它应该打印给定值的下10个素数——当然,它不起作用。我的逻辑在这里是错误的 例如,如果程序读取数字:C-下10个素数,c,C,我在这里写的程序有点问题。 它应该打印给定值的下10个素数——当然,它不起作用。我的逻辑在这里是错误的 例如,如果程序读取数字: 2 它应该打印: 3, 5, 7, 11, 13, 17, 19, 23, 29, 31 代码: #include <stdio.h> int main() { int n, i, count, primenumber = 1; // primenumber is a flag printf("Insert a number:\n"
2
它应该打印:
3, 5, 7, 11, 13, 17, 19, 23, 29, 31
代码:
#include <stdio.h>
int main() {
int n, i, count, primenumber = 1; // primenumber is a flag
printf("Insert a number:\n");
scanf("%d", &n);
for (count = 0, n++; count < 10; n++, count++ ) {
for (i = 2; i < n; i++) {
if (n % i == 0) {
primenumber = 0;
break;
}
}
if (primenumber)
printf("%d\n", n);
}
return 0;
}
我决定不删除这篇文章。我相信总有一天会有人发现它很有用。这是您修改过的工作代码。 在每个步骤中,您都应该重新初始化
primenumber=1
,否则它只给出一个数字。当你找到素数时,计数也应该增加,否则就不会增加
#include <stdio.h>
int main() {
int n, i, count, primenumber = 1; // primenumber is a flag
printf("Insert a number:\n");
scanf("%d", &n);
for (count = 0, n++; count < 10; n++ ) {
primenumber = 1;
for (i = 2; i < n; i++) {
if (n % i == 0) {
primenumber = 0;
break;
}
}
if (primenumber){
count++;
printf("%d\n", n);
}
}
return 0;
}
#包括
int main(){
int n,i,count,primenumber=1;//primenumber是一个标志
printf(“插入一个数字:\n”);
scanf(“%d”和“&n”);
对于(计数=0,n++;计数<10;n++){
素数=1;
对于(i=2;i
将代码拆分一点,再排列一点,然后呈现出来
int isPrime ( int n )
{
if (n <= 1) return 0; // zero and one are not prime
unsigned int i;
for (i=2; i*i<=n; i++) {
if (n % i == 0) return 0;
}
return 1;
}
int main() {
int n, count; // primenumber is a flag
printf("Insert a number:\n");
scanf("%d", &n);
count = 0 ;
n++ ;
for ( ; count < 10; n++ ) {
if (isPrime(n)) { // if its Prime, print and increase count
printf("%d\n", n);
count ++;
}
// Check next number until we get all our numbers
}
return 0; // All Done
}
intisprime(intn)
{
如果(n这里有一个解决方案,它将减少处理时间,通常用于较大的n值:
#include <stdio.h>
#include <math.h>
int main() {
int n, i, count= 1, primenumber = 1, root; // primenumber is a flag
printf("Insert a number:\n");
scanf("%d", &n);
n++;
while(count!=11)
{
root= sqrt(n);//You only need to check for range 2 to square root of number. This is the key ingredient of the code to reduce time complexity
primenumber = 1;
for(i=2; i<= root; i++)
{
if(n%i==0)//As soon as it finds a number which perfectly divides it, break from loop checking n's nature
{
primenumber = 0;
break;
}
}
if(primenumber==1)
{
printf("%d \t", n);
count++;
}
n++;
}
}
#包括
#包括
int main(){
int n,i,count=1,primenumber=1,root;//primenumber是一个标志
printf(“插入一个数字:\n”);
scanf(“%d”和“&n”);
n++;
而(计数!=11)
{
root=sqrt(n);//您只需要检查数字的范围2到平方根。这是代码减少时间复杂性的关键因素
素数=1;
对于(i=2;iHail)抽象方法!拆分代码也是一种很好的方法(可能更具组织性)在这种情况下的想法。不过,我还是决定了一种更简单的方法。谢谢。哦!谢谢。我没有刷新页面,所以我没有看到你的答案。我已经解决了这个问题。不过,感谢大家的关注——我们最终得到了类似的解决方案!如果你想进一步提高,你应该只检查n是否可以被奇数除。我认为这会起作用ally增加复杂性,因为如果(i%2!=0)
,我们将检查每个i。因此,如果i是奇数,它将执行此附加步骤。当然@Valinho表示(i=3;i@Valinho“为什么不把你能想到的所有改进都加上呢?”花费在次要改进上的时间/精力/金钱可以更好地应用于主要改进。@这取决于chux。我敢打赌,出于科学目的,每个次要改进都将是一个良好的进步。与其用解决方案编辑您的问题,不如将其还原为未回答的状态,并发布您自己的答案。您甚至可以接受它或另一个好答案。
#include <stdio.h>
#include <math.h>
int main() {
int n, i, count= 1, primenumber = 1, root; // primenumber is a flag
printf("Insert a number:\n");
scanf("%d", &n);
n++;
while(count!=11)
{
root= sqrt(n);//You only need to check for range 2 to square root of number. This is the key ingredient of the code to reduce time complexity
primenumber = 1;
for(i=2; i<= root; i++)
{
if(n%i==0)//As soon as it finds a number which perfectly divides it, break from loop checking n's nature
{
primenumber = 0;
break;
}
}
if(primenumber==1)
{
printf("%d \t", n);
count++;
}
n++;
}
}