【习题解析】
1411 区间内的真素数
【题目描述】
找出正整数M和N之间(N不小于M)的所有真素数。
真素数的定义:如果一个正整数P为素数,且其反序也为素数,那么P就为真素数。
例如,11,13均为真素数,因为11的反序还是为11,13的反序为31也为素数。
【输入】
输入两个数M和N,空格间隔,1≤M≤N≤100000。
【输出】
按从小到大输出M和N之间(包括M和N)的真素数,逗号间隔。如果之间没有真素数,则输出No。
【输入样例】
10 35
【输出样例】
11,13,17,31
【参考程序】
#include
int isPrime(int a)
{
int i;
if(a<2)return 0;
for(i=2;i*i<=a;i++)
if(a%i==0)return 0;
return 1;
}
int f(int a)
{
int b=0;
while(a)
{
b*=10;
b+=a%10;
a/=10;
}
return b;
}
int main()
{
int m,n,i,k=0;
scanf("%d%d",&m,&n);
for(i=m;i<=n;i++)
if(isPrime(i)&&isPrime(f(i)))
{
if(k)printf(",");
printf("%d",i);
k++;
}
if(k==0)printf(“No”);
return 0;
}
1408素数回文数的个数
【题目描述】
求11到n之间(包括n),既是素数又是回文数的整数有多少个。
【输入】
一个大于11小于1000的整数n。
【输出】
11到n之间的素数回文数个数。
【输入样例】
23
【输出样例】
1
【提示】
提示:
回文数指左右对称的数,如:292,333。
【参考程序】
#include
int isPrime(int a)
{
int i;
if(a<0)return 0;
for(i=2;i*i<=a;i++)
if(a%i==0)return 0;
return 1;
}
int isData(int a)
{
if(1<=a&&a<=99)
{
if(a/10==a%10)return 1;
else return 0;
}
else if(100<=a&&a<=999)
{
if(a/100==a%10)return 1;
else return 0;
}
}
int main()
{
int n,i,cnt=0;
scanf("%d",&n);
for(i=1;i<=n;i++)
if(isPrime(i)&&isData(i)) cnt++;
printf("%d",cnt);
return 0;
}
1157 哥德巴赫猜想
题目描述
哥德巴赫猜想(任何充分大的偶数都可由两个素数之和表示)。输入a,b,将a到b中的所有偶数分别用两个素数之和表示。输出为:
4=2+2
6=3+3
….
a,b<=100;
输入
输入两个整数a,b(a,b<=100)
输出
输出哥德巴赫猜想表达式子
样例输入
4 10
样例输出
4=2+2
6=3+3
8=3+5
10=3+7
样例输入
50 100
【参考程序】
#include
int isPrime(int n)
{
int i;
if(n<2)return 0;
for(i=2;i*i<=n;i++)
if(n%i==0)return 0;
return 1;
}
int main()
{
int i,j,a,b;
for(i=6;i<=100;i++)
if(i%2==0)
{
for(j=2;j<i;j++)
{
a=j,b=i-j;
if(isPrime(a)&&isPrime(b))
{
printf("%d=%d+%d\n",i,a,b);
break;
}
}
}
return 0;
}
1407 笨小猴
[题目描述]
笨小猴的词汇量很小,所以每次做英语选择题的时候都很头疼。但是他找到了一种方法,经试验证明,用这种方法去选择选项的时候选对的几率非常大!
这种方法的具体描述如下:假设maxn是单词中出现次数最多的字母的出现次数,minn是单词中出现次数最少的字母的出现次数,如果maxn-minn是一个质数,那么笨小猴就认为这是个Lucky Word,这样的单词很可能就是正确的答案。
[输入格式]:
输入只有一行,是一个单词,其中只可能出现小写字母,并且长度小于100。
[输出格式]:
输出共两行,第一行是一个字符串,假设输入的的单词是Lucky Word,那么输出“Lucky Word”,否则输出“No Answer”;
第二行是一个整数,如果输入单词是Lucky Word,输出maxn-minn的值,否则输出0。
[输入样例#1]:
error
[输出样例#1]:
Lucky Word
2
[输入样例#2]:
olympic
[输出样例#2]:
No Answer
0
【参考程序】
int main()
{
int maxn=0,minn=1000;
string s;
int i;
cin>>s;
for(i=0;i<s.length();i++)
abc[s[i]-‘a’]+=1;
for(i=0;i<26;i++)
{
if(maxn<abc[i])
maxn=abc[i];
if(minn>abc[i]&&abc[i]!=0)
minn=abc[i];
}
if(isprime(maxn-minn)==true)
cout<<“Lucky Word”<<endl<<(maxn-minn)<<endl;
else
cout<<“No Answer”<<endl<<0<<endl;
return 0;
}