目录
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;
}