程序员测试题: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;
}