上机考试的一道题:
一个素数,若依次从低位去掉一位、两位、······若所得各数仍都为素数,则称该数为超级素数。例如:由于239、23、2均为素数,则239为超级素数。求:
[100,9999]之内:
(1)超级素数的个数;
(2)所有的超级素数之和;
(3)最大的超级素数。
代码如下
#include<stdio.h>
f(int n)/*n 是形式参数*/
{
int z=1;
int i;
for(i=2;i<=n-1;i++)
{
if(n%i==0)/*n是合数*/
{
z=0;
break;
}
}
return(z);
}
int main()
{
int a,b,c,m;
int num,sum,max;
num=0,sum=0,max=0;
for(m=100;m<=9999;m++)
{
if(f(m)==1)
{
a=m/10;/*去除m的个位*/
b=m/100;/*去除m的十位和个位*/
c=m/1000;/*去除m的百位、十位和个位*/
if((m<1000)&&(b!=1)&&(f(a)==1)&&(f(b)==1))/*a,b都是素数*/
{
num+=1;
sum+=m;
max=m;
printf("第%d个超级素数是%d\n",num,m);
}
if((m>=1000)&&(c!=1)&&(f(a)==1)&&(f(b)==1)&&(f(c)==1))/*a,b,c都是素数*/
{
num+=1;
sum+=m;
max=m;
printf("第%d个超级素数是%d\n",num,m);
}
}
}
printf("[100,9999]之内超级素数的个数为%d\n",num);
printf("[100,9999]之内超级素数的和为%d\n",sum);
printf("[100,9999]之内最大的超级素数是%d\n",max);
}
运行结果
第1个超级素数是233
第2个超级素数是239
第3个超级素数是293
第4个超级素数是311
第5个超级素数是313
第6个超级素数是317
第7个超级素数是373
第8个超级素数是379
第9个超级素数是593
第10个超级素数是599
第11个超级素数是719
第12个超级素数是733
第13个超级素数是739
第14个超级素数是797
第15个超级素数是2333
第16个超级素数是2339
第17个超级素数是2393
第18个超级素数是2399
第19个超级素数是2939
第20个超级素数是3119
第21个超级素数是3137
第22个超级素数是3733
第23个超级素数是3739
第24个超级素数是3793
第25个超级素数是3797
第26个超级素数是5939
第27个超级素数是7193
第28个超级素数是7331
第29个超级素数是7333
第30个超级素数是7393
[100,9999]之内超级素数的个数为30
[100,9999]之内超级素数的和为75548
[100,9999]之内最大的超级素数是7393
--------------------------------
Process exited after 0.1316 seconds with return value 0
请按任意键继续. . .
题目需要注意的事项:
1不是素数;
判断去除某位数后的数是否为素数可以用子函数的结论;
m要区分其是三位数和四位数的情况。