上机练习三

导航:复试上机历年真题,题目未搜集全
十四:2003 十三:2004
十二:2005 十一:2006
十:2007 九:2008
八:2009 七:2012
六:2013 五:2014
四:2015 三:2017
二:2018 一:2019

三、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("
素数个数为%d个
", 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
", 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
");
		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
");
	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
", 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
", 'a', a[0]);
	printf("%c: %d
", 'e', a[1]);
	printf("%c: %d
", 'i', a[2]);
	printf("%c: %d
", 'o', a[3]);
	printf("%c: %d
", '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
");
		else if(flag==false)
			printf("no
");
					
	}	
	
	return 0;
}

原文地址:https://www.cnblogs.com/welan/p/12693547.html