程序员测试题:PAT 乙级 1007 素数对猜想(C语言版本)

程序员测试题:PAT 乙级 1007 素数对猜想(C语言版本)

添加链接描述
思路:
先求出不大于N的所有素数,利用数组存储所有素数,然后相邻做差值,找出对数,另外还写了求合数的函数以用来备用,目前看测试点5测试超时,mark一下,下次来讨论程序复杂度。

#include <stdio.h>

void cal_he(int num)
{
    int i,ii;
    int he[100001] = {0};
    int flag = 0;//记录合数的数组下标 
    he[2] = 2;//2作为特殊情况 
    for(i=3;i<=num;i++)
    {
      
        for(ii=2;ii<i;ii++)//遍历除了它本身的数以外的数,说明不是素数
        {
            if(i%ii==0)
            {          
                he[++flag]=i;//记录合数
                break;//一旦检测出来合数,后面的就不计算和累加flag,防止i=6   i=2、3都满足条件。 
            }            
        }
    }
	for(;flag;flag--)
	{
		printf("flag:%d,he:%d\n",flag,he[flag]);	
	} 	
}
//从3开始 
int cal_su(int num,int get_su[])
{
	
    //找出所有的素数
    int  arr[100001];
    int i,ii;
    int su[100001] = {0};//记录素数的数组 
    int flag = 0;//记录素数的数组下标 
    arr[0] = 2;//2作为特殊情况
	su[0] = 2;
    for(i=3;i<=num;i++)
    {
      	arr[i] = i;//下标代表数据 
        for(ii=2;ii<i;ii++)//遍历除了它本身的数以外的数,说明不是素数
        {
        	
        	while((i%ii==0))
        	{
        		arr[i]=0;//合数所在数组值清零 
				break;	
			}       	            
        }
    }
    
    int p;
	for(p=3;p<=num;p++)
	{		
		if(arr[p]!=0)
		{
			 su[++flag] = arr[p];
		}		
		
	} 	
	for(p=0;p<=flag;p++)
	get_su[p] = su[p];	
//	printf("flag:%d,su:%d\n",p,su[p]);	
	return flag;
}

 
int main()
{
    int num;
    scanf("%d",&num);
    int su[100001] = {0};
    //找出所有的素数
    int flag;
   	flag = cal_su(num,su);
   	int pp; 
//   	for(pp=0;pp<=flag;pp++)
 //  	printf("flag:%d,su:%d\n",p,su[p]);
	
	//计算素数差的个数
	int del;
	int pairs = 0;
	for(del=0;del<flag;del++)
	{
		if((su[del+1]-su[del])==2)//存在无穷多对相邻且差为2的素数
		pairs++;
	} 
	printf("%d\n",pairs);
	    
    return 0;
}

测试结果

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页