| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2703 人关注过本帖
标题:求素数的个数,出现未输入就退出程序的问题,求指点。谢谢~
取消只看楼主 加入收藏
Orcaina
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2016-10-18
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:6 
求素数的个数,出现未输入就退出程序的问题,求指点。谢谢~
我猜想是由于数组初始化时,a的值也是未知的才导致了这样的情况,但我的思路就是把输入的a作为第一个判断的数,不知道该怎么解决,请各位指点~不盛感激

给定两个非负整数a,b,其中0<= a,b<=1,000,000,请计算这两个数之间有多少个素数。
输入
第一行是一个整数K(1<=K<=1000),表示有多少个样例,每个样例占一行,是两个整数a和b,每个整数之间用一个空格隔开。
输出
每行输出一个样例的结果。
Sample Input  
2
2 3
17 19
  
Sample Output  
2
2

我想用筛法做:
#include <stdio.h>
#include <math.h>

int main()
{
    int K,a,b,i,j;//k是案例个数,a 和 b为区间的端点值(a,b)
    int num = 0;
    scanf("%d",&K);
    while(K--)
    {
        scanf("%d %d",&a,&b);//输入a和b的值
        int c[1000001];
   
         //用筛法把非素数都赋值成0.
         scanf("%d %d",&a,&b);
         for(i=a; i<=b; i++)//对数组进行初始化
        {
            c[i] = i;
        }        
        for(i=a; i<=((int)sqrt(b)); i++)//进行筛选
        {
            
            for(j=i+1; j<=b; j++)
            {
                if(c[i]!=0 && c[j]!=0 && c[j]%c[i]==0)
                {
                    c[j]=0;
                }
            }
        }

        for(i=a; i<=b; i++)
        {
            if(c[i]!=0)
            {
                num++;
            }
        }
        printf("%d\n",num);
    }
    return 0;
}


编译可以,但是一运行windows就显示出现了一个问题,导致程序停止正常工作。
关闭windows窗口后
小黑框显示Process exited with return value 3221225725
Press any key to continue...
 
搜索更多相关主题的帖子: include 
2016-10-25 17:08
Orcaina
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2016-10-18
收藏
得分:0 
回复 3楼 九转星河
谢谢指点,我问的那个问题已经解决了,刚发现还少考虑了一点,就是a b的大小.
写代码太少,看过的人都说乱,我自己感觉不到啊啊啊啊啊啊啊啊啊!!!!!!!!!!
2016-10-25 17:55
Orcaina
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2016-10-18
收藏
得分:0 
回复 5楼 九转星河
我的程序就是想计算任意两个数之间素数的个数.
可能我改的时候copy了忘记删了才多了个scanf()
2016-10-25 18:00
Orcaina
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2016-10-18
收藏
得分:0 
回复 8楼 九转星河
我还没有把这个题解出来,晚上上课,等我解出来了就发上来。
2016-10-25 18:21
Orcaina
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2016-10-18
收藏
得分:0 
回复 8楼 九转星河
我说的解决了是关于数组过大导致程序未运行就退出的问题,不是这道题目解决啦
2016-10-25 18:24
Orcaina
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2016-10-18
收藏
得分:0 
回复 8楼 九转星河
我的算法不对
2016-10-25 18:35
Orcaina
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2016-10-18
收藏
得分:0 
回复 5楼 九转星河
拖延症晚期来报道:
/* 按照我之前的思路做,只能先求出1~a之间的素数个数,再求出1~b之间的素数个数,然后将两者相减得到结果,这样做将1~a之间的过程
重复计算了两次,不是很好
换一种思路是利用筛法先将所有素数球出来,然后再判断a~b之间有多少个素数
*/
第一种求法:
#include <stdio.h>
#include <math.h>

int c[1000001];
int main()
{
    int K,i,j,t;//k是案例个数
    int a,b;
    scanf("%d",&K);

    //输入a和b的值
    while(K--)
    {
         //用筛法把非素数都赋值成0.
         int t,num1=0,num2=0;
         scanf("%d %d",&a,&b);
         for(i=2; i<=a; i++)//对数组进行初始化
        {
            c[i] = i;
        }        
        for(i=2; i<=sqrt(a); i++)//进行筛选
        {
            
            for(j=i+1; j<=a; j++)
            {
                if(c[i]!=0 && c[j]!=0 && c[j]%c[i]==0)
                {
                    c[j]=0;
                }
            }
        }

        for(i=2; i<=a; i++)
        {
            if(c[i]!=0)
            {
                num1++;
            }
        }
        
         for(i=2; i<=b; i++)//对数组进行初始化
        {
            c[i] = i;
        }        
        for(i=2; i<=sqrt(b); i++)//进行筛选
        {
            
            for(j=i+1; j<=b; j++)
            {
                if(c[i]!=0 && c[j]!=0 && c[j]%c[i]==0)
                {
                    c[j]=0;
                }
            }
        }

        for(i=2; i<=b; i++)
        {
            if(c[i]!=0)
            {
                num2++;
            }
        }
        if(num1>num2)
        {
           t=num1;
           num1=num2;
           num2=t;   
        }
        printf("%d\n",num2-num1+1);
    }
    return 0;
}


第二种求法:
#include <stdio.h>
#define  N 1000001
int prime[N];
int main()
{
        int K,i,c;
        scanf("%d",&K);
            for(i=2;i<N;i++)  //筛法求素数
        {
            prime[i]=1;   
        }
        prime[0]=prime[1]=0;
        for(i=2;i<=1000;i++)
        {
            if(prime[i])
            {
                for(c=i*i;c<=N;c+=i)
                {
                    prime[c]=0;   
                }
            }
        }
        while(K--)
        {
            int t,a,b,num=0;
            scanf("%d %d",&a,&b); //输入a b的值,如果a>b则将a与b的值交换
            if(a>b)
            {
                t=a;
                a=b;
                b=t;
            }
               
   
        
        for(i=a;i<=b;i++) //ab之间有多少个素数
        {
            if(prime[i]==1)
            {
                num++;
            }   
        }
        printf("%d\n",num);
    }
    return 0;            
}


测试没问题了,不过我在网站提交还是显示time limit exceed 没有ac还是要继续改
收到的鲜花
  • 九转星河2016-10-31 12:51 送鲜花  5朵   附言:我很赞同
2016-10-30 23:44
快速回复:求素数的个数,出现未输入就退出程序的问题,求指点。谢谢~
数据加载中...
 
   



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

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