三、2017
1、统计素数
题目:
给定若干个正整数,请判断素数的个数。
输入数据首先包含一个整数N(1<=N<=100)表示数据的个数,然后是N个大于1小于10000的整数。请判断并输出给定的N个数中素数的个数。
代码:
#include<stdio.h>
bool isprime(int x)
{
for(int i=2;i<=x/2;i++)
if(x%i==0)
return false;
return true;
}
int main()
{
int n, count, x;
count = 0;
scanf("%d", &n);
while(n--)
{
scanf("%d", &x);
if(isprime(x)==true)
count++;
}
printf("\n素数个数为%d个\n", count);
return 0;
}
2、绝对素数
题目:
绝对素数是指本身是素数,其逆序也是素数的数,例如:107与701是绝对素数。求[m,n]范围之内的所有绝对素数。
输入两个正整数m和n,其中m<n。
输入两个正整数m和n,其中m<n。
代码:
#include<stdio.h>
bool isPrime(int x)//判断是否为素数
{
for(int i=2;i<=x/2;i++)
if(x%i==0)
return false;
return true;
}
bool isAbsolutePrime(int x)
{
if(isPrime(x)==true)
{
int y, num, t;
int a[10]={0};
y=0; num=0;
while(x!=0)//将x放置在a数组中
{
a[num++] = x%10;
x /= 10;
}
//如果x=123, 则y=321
t=1;
while(num>=0)//求y
{
y += a[--num]*t;
t *= 10;
}
if(isPrime(y)==true)
return true;
}
return false;
}
int main()
{
int m, n;
scanf("%d %d", &m, &n);
for(int i=m;i<=n;i++)
if(isAbsolutePrime(i))
printf("%d\n", i);
return 0;
}
3、超素数
题目:
如果一个数是素数,并且能被分解为C(C>=2)个连续素数的和,则称这个数为“超素数”,请编程判断一个数是否是超素数。
输入数据仅仅包含一个正整数N(1<N<100000)。
如果给定的整数N为超素数,请输出yes,否则请输出no。
代码:
#include<stdio.h>
#include<string.h>
const int maxn=1001;
int p[maxn]={0}, prime[maxn]={0};
int num=0;
void primeTable()
//求1000以内的所有素数,并放在prime[0-num]中
{
for(int i=2;i<maxn;i++)
{
if(p[i]==0)//p[i]==0表示i为素数
{
prime[num++] = i;//把素数i放入数组prime
for(int j=i*2;j<maxn;j+=i)
//如果i为素数,那么i的整数倍,2*i,3*i...都不是素数
{
p[j] = 1;// //p[i]==1表示i不是素数
}
}
}
}
bool isPrime(int x)
//判断一个数是否为素数
{
for(int i=0;i<num;i++)
if(prime[i]==x)
return true;
return false;
}
int main()
{
int x;
scanf("%d", &x);
primeTable();
if(isPrime(x)==false)//如果x本身就不是素数,直接返回
{
printf("no\n");
return 0;
}
int k;
bool flag=false;
for(int i=0;i<num-1;i++)//找到素数prime[i],使得prime[i]>=x,然后x左边的素数才可能满足条件
if(prime[i]<x&&prime[i+1]>=x)
{
k = i;
break;
}
int a[100]={0};//数组a来存放组成x的素数
int m, sums, t;
for(int i=k;i>=0;i--)//从每一个prime[i]往左个移动,看是否满足连续的素数满足和为x
{
sums=x;
t=i;
m=0;
while(t>=0&&sums>prime[t])//用sums减掉当前t所指的素数prime[t]
{
a[m] = prime[t];
sums -= prime[t];
t--; m++;
}
if(t>=0&&prime[t]==sums)//如果恰好找到则返回
{
a[m] = prime[t];
flag = true;
m++;
break;
}
else if(t>=0&&prime[t]>sums)
flag=false;
}
if(flag==false)
printf("no\n");
else if(flag==true)
{
printf("yes: ");
sums = 0;
for(int i=0;i<m;i++)
{
printf("%d", a[i]);
sums += a[i];
if(i!=m-1)
printf("+");
else
printf("=%d\n", sums);
}
}
return 0;
}
4、统计元音个数
题目:
统计每个元音字母在字符串中出现的次数。
每组输入数据是一行长度不超过100的字符串。
代码:
#include<stdio.h>
#include<string.h>
int main()
{
char str[100];
gets(str);
int a[5]={0};
for(int i=0;i<strlen(str);i++)
{
switch(str[i])
{
case 'a':
case 'A':
{
a[0]++; break;
}
case 'e':
case 'E':
{
a[1]++; break;
}
case 'i':
case 'I':
{
a[2]++; break;
}
case 'o':
case 'O':
{
a[3]++; break;
}
case 'u':
case 'U':
{
a[4]++; break;
}
}
}
printf("%c: %d\n", 'a', a[0]);
printf("%c: %d\n", 'e', a[1]);
printf("%c: %d\n", 'i', a[2]);
printf("%c: %d\n", 'o', a[3]);
printf("%c: %d\n", 'u', a[4]);
return 0;
}
5、合法标识符
题目:
输入一个字符串,判断其是否是C语言的合法标识符,标识符由字母、下划线、数字这三种类型组成,但开头必须是字母或下划线(不用判断是否和保留字相同)。
每组输入数据是一个长度不超过50的字符串。
对于每组输入数据,如果是C的合法标识符,请输出“yes”,否则,输出“no”。
代码:
#include<stdio.h>
#include<string.h>
bool isnum(char ch)
{
if(ch>='0'&&ch<='9')
return true;
return false;
}
bool isalpha(char ch)
{
if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))
return true;
return false;
}
char str[50];
int main()
{
while(gets(str)!=NULL)
{
int len=strlen(str);
bool flag=true;
for(int i=0;i<len;i++)
{
if(i==0&&(isalpha(str[i])==false)&&str[i]!='_')
{
flag = false;
break;
}
else if((isalpha(str[i])==false)&&str[i]!='_'&&isnum(str[i])==false)
{
flag = false;
break;
}
}
if(flag==true)
printf("yes\n");
else if(flag==false)
printf("no\n");
}
return 0;
}