目录
T1236——分苹果
T1113——整理药名
T1153——整数奇偶排列
T1249——漂亮的字符串
T1168——统计素数个数
T1160——甲流病人筛选
T1236——分苹果
分享一道特别简单的题。
- 蒜头君要把一堆苹果分给 个小朋友,要使每个人都能拿到苹果,而目每个人拿到的苹果数都不同的话,这堆苹果至少应该有多少个?
- 输入格式:个不大于 1000 的正整数 n,代表小朋友人数
- 输出格式:个整数,表示满足条件的最少苹果个数。
根据题意,不难看出,如果要求最少的苹果个数,则第一个小朋友需要给得最少(即1个),之后每个人多一个,既满足了不同于之前的所有人,还能满足最少的条件。
所以,只需要将1~n依次累加,即可满足目标条件。
#include <iostream>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int main(int argc, char** argv) {
    
    int n=0;
    cin>>n;
    
    int sum=0;
    for(int i=1;i<=n;i++)
    {
        sum+=i;    
    }
    cout<<sum<<endl;
    
    return 0;
}T1113——整理药名
先看题干:
- 医生在书写药品名的经算不击高大小写,格中以混,现要求 个字将生写为题是备理 范的格式,药品名的第 字的如果是字@要大写,其他字@小写,如将"ASPIRIN"或'aspirin”整理成“Aspirin"。
- 输入格式:第一行一个数字n,表示有 n个药品名要整理,n 不超过 100;接下来n 行,每行一个单词,长度不超过 20,表示医生手书的药品名。药品名由字母、数字和 - 组成,
- 输出格式:n 行,每行一个单词,对应输入的药品名的规范写法。
这道题并不难,如果你对编程语言的基础有很好的掌握,很容易理清整个逻辑。实际上,不涉及到算法的题目都是简单题。笔者带领大家理一下这道题的考察点:
1.输入多个不定长字符串
2.将字符串的首字母一律变为大写(分本来就是大写和本来是小写两种情况)
3.将字符串的其他字母一律变为小写(分本来及时小写和本来是大写两种情况)
部分地方博主采用了STL的vector和string嵌套使用,实际上普通的字符数组也能搞定,只不过STL用习惯了是真的简洁;字符处理,单独写一个函数即可,用if-else判断多种情况~
完整代码如下:
#include <iostream>
#include <string>
#include <vector> 
using namespace std;
void Dx(int num,char x)
//输入参数分别是字符下标和字符本身 
{
	if(num==0)//首字母:本身是大写直接输出,小写要转换为大写 
	{
		if(x>='a'&&x<='z')
		{
			x=x-32;
			printf("%c",x);
		}	
		else
		{
			printf("%c",x);
		}	
	}
	else if(num>0)//其他字母,小写直接输出,大写要转换为小写 
	{
		if(x>='A'&&x<='Z')
		{
			x=x+32;
			printf("%c",x);
		}		
		else
		{
			printf("%c",x);
		}
	}
} 
int main(int argc, char** argv) {
	
	int n=0;
	cin>>n;
	vector<string> V;
	
	for(int i=1;i<=n;i++)
	{
		string temp;
		cin>>temp;
		V.push_back(temp);
	}
	//将输入的字符串存入vector容器中 
	
	
	for(int i=0;i<=n-1;i++)
	{
		string goal=V[i];
		for(int j=0;j<=goal.length()-1;j++)
		{
			Dx(j,goal[j]);
			//对每一个字母单独通过函数处理 
		}
		cout<<endl;
		//每处理完一段函数要换行 
	}
	return 0;
}T1153——整数奇偶排列
- 蒜术师给了你一个 10 个整数的序列,要求对其重新排序。排序要求:
1.奇数在前,偶数在后
2.奇数按从大到小排序
3.偶数按从小到大排序。
- 输入格式:输入一行,包含 10 个整数,彼此以一个空格分开,每个整数的范围是大于等于 0,小于等于 100~
- 输出格式:按照要求排序后输出一行,包含排序后的 10 个整数,数与数之间以一个空格分开
这道题本来很简单,但是被我写复杂了,我用的是两个vector分别处理奇数和偶数,最后用algorithm头文件自带的sort和reverse函数直接处理好再拼凑在一起,其实用普通的数组自己写逻辑也很快能写出来,不过我现在的状态实在是不想思考逻辑了,本帖仅供参考,只能通过,不算高明的做法。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
 
int main(int argc, char** argv) 
{
	vector<int> V;
	
	for(int i=1;i<=10;i++)
	{
		int n=0;
		cin>>n;
		V.push_back(n);	
	}	
	
	vector<int> V1,V2;
	for(int i=0;i<=9;i++)
	{
		if(V[i]%2==1)
			V1.push_back(V[i]);
		else
			V2.push_back(V[i]);	
	} 
	
	V.clear();
	sort(V1.begin(),V1.end());
	sort(V2.begin(),V2.end());
	reverse(V1.begin(),V1.end());
	
	//空间换时间,并不是高明的做法
	//注意sort算法默认从小到大排序 
	
	for(int i=0;i<=V2.size()-1;i++)
	{
		V1.push_back(V2[i]);
	}
	for(vector<int>::iterator it=V1.begin();it!=V1.end();it++)
	{
		cout<<(*it)<<" ";
	}
	return 0;
}T1249——漂亮的字符串
题干如下:
- 小蒜认为如果一个字符串中每个字符出现的次数都是偶数次,那么这个字符串是美丽的;现在给你一个字符串 s,长度不超过 100,请判断这个字符串是否是美丽的。
- 输入格式:个字符串 8。
- 输出格式:如果是美丽的字符串,输出"Yes",否则输出“No"
根据题干描述,可以抽象出本题的核心目标:
小写只要26个字母在本字符串中均出现偶数次,则为美丽字符串。
#include <iostream>
#include <string>
using namespace std;
 
int main() 
{
	int num[26];
	for(int i=0;i<26;i++)
	{
		num[i]=0;
	}
	//初始化数组每个元素为0,分别统计每个小写字母出现的个数 
	
	string goal;
	cin>>goal;
	
	for(int i=0;i<=goal.length()-1;i++)
	{
		int temp=0;
		temp=goal[i]-97;
		num[temp]++;	
	} 
	
	/* 
	for(int i=0;i<=25;i++)
	{
		printf("%c的个数为:%d\n",(i+97),num[i]);
	}
	*/
	
	int doubt=1;
	//如果是完美字符串则为1 
	for(int i=0;i<=25;i++)
	{
		if(num[i]%2!=0)
		{
			doubt=0;
			//如果有一位不是偶数,则该字符串不为完美字符串 
			break;
		}
	}
	if(doubt==1)
		cout<<"Yes"<<endl;
	else
		cout<<"No"<<endl;
	return 0;
}T1168——统计素数个数
具体题干看下图:
- 蒜头君给定两个整数 X 和Y,输出两者之间的素数个数 (包括 X 和Y)。
- 输入格式:两个整数X和Y (l < =X,Y <= 105) 。
- 输出格式:输出一个整数,表示 X,Y 之间的素数个数 (包括 X 和Y)。
- 提示信息:可能存在 X >=Y的情况;注意 1 不是素数
详解如下:
#include <iostream>
using namespace std;
int PrimeNumber(int x)
{
	//定义一个函数,只需要完成对一个数是否为素数的判断
	//如果是0,则为素数,若为1则不为素数 
	for(int i=2;i<x;i++)
	{
		if(x%i==0){
			//能整除则说明不是素数 
			return 1;
			//返回1则代表不是素数 
			break;
		}		
	}
	return 0; 
}
int main() 
{		
	int x=0,y=0;
	int count=0;
	//输入范围和统计总数 
	cin>>x>>y;
	
	int temp=0;
	if(x>y)
	{
		temp=x;
		x=y;
		y=temp;	
	} 
	//保证x一定小于y 
	
	for(int i=x;i<=y;i++)
	{
		if(PrimeNumber(i)==0&&i!=1)
		//仔细看,1不是素数 
		{
			//cout<<i<<"是素数!"<<endl;
			count++;
			//如果符合条件则要加一 
		}		
	} 
	cout<<count<<endl;
	return 0;
}
T1160——甲流病人筛选
 

关于这道题还是比较简单的,没有涉及到算法,只需要对编程语言基础知识熟练掌握即可破解。
这里需要有两个重点:
1.存储病人的各项信息
此处我采用自定义结构体,定义一个病人类型的变量;对于不定长的n,我采用动态数组vector进行存储(当然,传统的面向对象和一维数组也可以实现这一功能)。
2.循环遍历判断
此处我采用的是STL的迭代器进行判断。
具体内容请看下列代码中的注释:
#include <iostream>
#include <vector>
#include <string>
using namespace std;
struct patient{
	string name;
	float tem;
	bool health;
	//结构体,定义一个病人类型的变量,当然也可以用面向对象的class 
}; 
int main(int argc, char** argv) 
{
	int n=0;
	cin>>n;
	//输入需要判断的总人数 
	
	vector<patient> V1;
	//定义一个病人类型的动态数组
	patient p;
	//同时声明一个临时储存的病人变量
	
	
	for(int i=1;i<=n;i++)
	{
		cin>>p.name>>p.tem>>p.health;
		V1.push_back(p);
		//设置循环,将全部病人存在数组中 
	}
	
	int count=0;
	//统计被筛选的甲流病人总数 
	
	for(vector<patient>::iterator it=V1.begin();it!=V1.end();it++)
	{
		//迭代器遍历整个数组
		if((*it).tem>=37.5&&(*it).health==1)
		{
			cout<<(*it).name<<endl; 
			//如果同时满足则输出当前病人的名字 
			//(*it)为解引用,it为迭代器,类似指针的用法 
			count++;
			//同时筛选总人数+1 
		}	 
	}
	cout<<count<<endl;
	
	return 0;
}



















