【问题标题】:Prime Generator(spoj)Prime 发电机(spoj)
【发布时间】:2015-01-24 04:51:35
【问题描述】:

具体问题见link

在这里,我定义了三个函数,称它们为相互的。 函数调用未完成

#include<stdio.h>
int primegen(int x1,int x2);
int isprime(int j);
int main(){
   int x,n1,n2,i;
   printf("Enter the number of test cases:");
   scanf("%d",&x);
    for(i=0;i<x;i++){
      printf("enter the starting point and ending point:");
      scanf("%d %d",&n1,&n2);
      primegen(n1,n2);
    }
    return 0;
}

int primegen(int x1,int x2){
   int k;
   if(x2>x1){
      for(k=x1;k<x2;k++){
        if(isprime(k))
        {
           printf("%d",k);
        }
      }
      return 0;
   }
}

int isprime(int j){
   int i,c=0;
   for (i=1;i<=j;i++)
   {
     if(j%i==0){
        c++;
     }
     if(c!=2){
        return 0;
     }
     else{
        return 1;
     }
   }
}

输出

此代码没有输出。

【问题讨论】:

  • 正确格式化和缩进你的代码,解释你的问题,输入,输出和预期输出。
  • 使用铅笔和纸,写下isprime 中每行发生的情况,当 j 为 7 时。它会返回您期望的结果吗?
  • 即使在更正之后,您的代码也会在 SPOJ 上超时。你需要更好的算法。
  • 这里的输出是:进程返回0 执行时间:6.912

标签: c


【解决方案1】:

采取以下外循环:

if(c!=2){
    return 0;
}
else{
    return 1;
}

【讨论】:

  • #include int primegen(int x1,int x2); int isprime(int j); int main(){ int x,n1,n2,i; printf("输入测试用例数:"); scanf("%d",&x); for(i=0;ix1){ for(k=x1;k
  • 这里的输出是:进程返回0 执行时间:6.912
【解决方案2】:

问题出在isprime() 中的循环中。 在这种情况下,当它仍然为 0 时,您使用 c 的值。因此,c!=2 将导致 true 并且将返回 0,您将不会得到任何答案。 从 for 循环中删除此特定语句,因为您需要计算总数。除数。

for (i=1;i<=j;i++)
   {
     if(j%i==0)
        c++; 
   }
if(c!=2)
  return 0;
else
  return 1;

或者你可以这样做:

int isprime(int j){
   int i,k;
   k=sqrt(j); //include math.h for this
   for(i=2;i<=k;i++)
   { 
     if(j%i==0)
       return 1;
   }
   return 0;
}

您只需要找到不超过该数字平方根的任何除数。

【讨论】:

    【解决方案3】:

    如果发现可整除,最好返回0,而不是使用计数器并递增。

    int isprime(int j)
    {
      int i;
      for(i=2;i<j;i++)
        if((j%i)==0)
          return 0;
      return 1;
    }
    

    【讨论】:

    • 这里的输出是:进程返回0 执行时间:6.912
    【解决方案4】:
    #include <stdio.h>
    #include <math.h>
    int main()
    {
        int test;
        scanf("%d",&test);
        while(test--)
        {
            unsigned int low,high,i=0,j=2,k,x=0,y=0,z;
            unsigned long int a[200000],b[200000];
            scanf("%d",&low);
            scanf("%d",&high);
            for(i=low;i<=high;i++)
                a[x++]=i;
            for(i=2;i<=32000;i++)
                b[y++]=i;
            i=0;
            while(b[i]*b[i]<=high)
            {
                if(b[i]!=0)
                {
                    k=i;
                    for(;k<y;k+=j)
                    {
                        if(k!=i)
                        {
                            b[k]=0;
                        }
                    }
                }
                i+=1;j+=1;
            }
                for(i=0;i<y;i++)
                {
                    if(b[i]!=0 && (b[i]>=low && b[i]<=sqrt(high)))
                        printf("%d\n",b[i]);
                }
                int c=0;
                for(i=0;i<y;i++)
                {
                    if(b[i]!=0 && (b[i]>=1 && b[i]<=sqrt(high)))
                        b[c++]=b[i];
                }
                int m=a[0];
                for(i=0;i<c;i++)
                {
                    z=(m/b[i])*b[i];k=z-m;
                    if(k!=0)
                        k += b[i];
                    for(;k<x;)
                    {
                        if(a[k]!=0)
                        {
                            a[k]=0;
                        }
                        k+=b[i];
                    }
                }
                for(i=0;i<x;i++)
                {
                    if(a[i]!=0 && (a[i]>=2 && a[i]<=(high)))
                        printf("%d\n",a[i]);
                }
            printf("\n");
        }
        return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-11
      • 2023-03-29
      • 2018-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多