| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2531 人关注过本帖
标题:运行超时
只看楼主 加入收藏
三个人
Rank: 2
等 级:论坛游民
帖 子:54
专家分:40
注 册:2014-7-6
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:5 
运行超时
问题:
令Pi表示第i个素数。现任给两个正整数M <= N <= 104,请输出PM到PN的所有素数。

输入格式:

输入在一行中给出M和N,其间以空格分隔。

输出格式:

输出从PM到PN的所有素数,每10个数字占1行,其间以空格分隔,但行末不得有多余空格。

输入样例:
5 27
输出样例:
11 13 17 19 23 29 31 37 41 43
47 53 59 61 67 71 73 79 83 89
97 101 103
我的代码:
#include<stdio.h>
int main()
{
    int m,n,str[10000],i,j,y,x=0;
    scanf("%d %d",&m,&n);
    for(i=2;;i++)
    {
        for(j=2;j<i;j++)
        {
           y=i%j;
           if(y==0)
               break;
        }
        if(y!=0)
        {
           str[x]=i;
           x++;
        }
        if(x==9999)
            break;
    }
    x=0;
    for(i=m-1;i<n;i++)
    {
        printf("%d",str[i]);
        x++;
        if(x%10==0)
            printf("\n");
        else
            printf(" ");
    }
    return 0;
}
运行结果正确,但是运行的很慢,什么方法能简化程序,快速得出结果呢?希望看到大家的意见!
搜索更多相关主题的帖子: include 正整数 
2014-08-03 11:04
xlhcy2014
Rank: 2
等 级:论坛游民
帖 子:33
专家分:81
注 册:2014-2-6
收藏
得分:7 
你求素数的方法,有必要改进一下。整数
整数分奇数和偶数,除了2以外的偶数肯定不是素数,在奇数里只要能被3,5,7整出的也不是素数。(这个自己推一下)
综上所述,只要除于2,3,5,7就能判断是否是素数了。

#include<stdio.h>

int main()
{
    int m,n,i,j,y,x=4;
    int str[10000]={2,3,5,7};

    scanf("%d %d",&m,&n);

    for(i=2;;++i)
    {      

        //除于2,3,5,7,进行判断
        if(i%2==0)
             continue;
        if(i%3==0)
             continue;  
        if(i%5==0)
             continue;
        if(i%7==0)
             continue;   
        
       str[x++]=i;

        if (x==9999)
            break;
        
    }

    x=0;

    for(i=m-1;i<n;++i)
    {
      printf("%d",str[i]);
        ++x;
        if(x%10==0)
            printf("\n");
        else
            printf(" ");
    }
    return 0;
}
2014-08-03 12:28
三个人
Rank: 2
等 级:论坛游民
帖 子:54
专家分:40
注 册:2014-7-6
收藏
得分:0 
回复 2 楼 xlhcy2014
你的说法不对吧,那17的平方呢(比如)!
2014-08-03 12:59
j521887
Rank: 2
等 级:论坛游民
帖 子:26
专家分:42
注 册:2014-7-21
收藏
得分:7 
#include<stdio.h>
   int main()
   {
       int m,n,a[10000];
       int i,j;
       int x=0;
       scanf("%d %d",&m,&n);
       for(i=2;i<=10000;i++)
      {
         for(j=2;j<=i;j++)
          {
              if(i%j==0)
                  break;
          }
          if(i==j)
         {   
             a[x]=i;
             x++;
          }
      }      
      for(i=m;i<n;i++)
     {
          printf("%4d",a[i]);
      }   
      printf("\n");
  return 0;
  }
我觉得应该是你的判断语句用的太多了,试试这个。
2014-08-03 13:45
xlhcy2014
Rank: 2
等 级:论坛游民
帖 子:33
专家分:81
注 册:2014-2-6
收藏
得分:0 
回复 3 楼 三个人
不好意思  算法的确有问题。
我做了修改。
程序代码:
#include<stdio.h>

/*
    优化运算速度,就要减少不必要的求素数所做的循环次数。
    如自然数17,没必要从2除到16,因为这样自然数越大,所做除法次数越多 。
    我的方法是用2,3,5,7和素数本身去判断,这样就减少了除法的次数。
    刚才的自然数17,我只要用{2,3,5,7,11,13}去除就能准确判断;
    再举一个自然数100,只要用{2,3,5...,89,97}这些素数集合去除,大大减少了除法次数 。
    而你刚说的17的平方289,按照我的方法,用{2,3,5,7,11,13,17..283}集合去除,就能判断了。
*/
int main()
{
    int m ,n,num,tempCnt,next,PrintCnt=0; 
    int result[10000]={2,3,5,7},index=4;  //10000个元素的数组,对前四个元素赋值,那么以后要保存素数,就从数组下标4开始 
    scanf("%d%d",&m,&n);  //输入两个数,确定检索范围
    //从自然数8开始求素数
    for(num=8;;++num)
    {
        tempCnt=0;//用num除于每一个已知的素数,如果都不能整除,则是素数,这就把素数本身也考虑进去了。
        next=0;//next=0 表示继续往下执行,next=1 表示开始下一个循环数
        while(tempCnt<index)
        {
            if(num%result[tempCnt++]==0)
            {
                next=1;
                break;
            }
       
        }
        //如果不是素数,则开始下一个循环数
        if(next==1)
            continue;
        result[index++]=num;
        if(index>=m && index <=n)
        {
            if(PrintCnt%10==0)
                printf("\n");

                printf("%d ",result[m-1]);
                ++PrintCnt;
                ++m;
        }

        if (index==9999 || index>n)
            break;

    }

    return 0;
}





[ 本帖最后由 xlhcy2014 于 2014-8-3 16:29 编辑 ]
2014-08-03 15:03
vvvcuu
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:12
帖 子:353
专家分:1253
注 册:2014-4-22
收藏
得分:7 
程序代码:
#include "stdio.h"
int main()
{
    int m,n,a[10000],i,j,k=0,l,count;
    printf("请输入两个整数,数字之间以空格隔开:\n");
    if(scanf("%d%d",&m,&n)!=2)
        printf("输入有误!\a\n");
    else {
        for(j=2;j<=n;j++){
            for(i=2;j%i;++i);         
            if(i==j){
                a[k]=j;
                k++;
            }
        }
        for(l=0;a[l]!=0;l++){
            if(a[l]>=m && a[l]<=n){
                printf("%d\x20",a[l]);
                count++;
                if(count%10==0)
                printf("\n");   
            }
            printf("\n");
       }
    }
    return 0;
}

代码测试环境:  WinXP+C-Free5.0.
2014-08-03 17:20
快速回复:运行超时
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018283 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved