文章目录
2021、发工资
财务处的小胡老师最近就在考虑一个问题:如果每个老师的工资额都知道,最少需要准备多少张人民币,才能在给每位老师发工资的时候都不用老师找零呢?
这里假设老师的工资都是正整数,单位元,人民币一共有100元、50元、10元、5元、2元和1元六种。
Input
输入数据包含多个测试实例,每个测试实例的第一行是一个整数n(n<100),表示老师的人数,然后是n个老师的工资。
n=0表示输入的结束,不做处理。
Output
对于每个测试实例输出一个整数x,表示至少需要准备的人民币张数。每个输出占一行。
Sample Input
3
1 2 3
0
Sample Output
4
Code
给老师发工资,老师的工资都是正整数,人民币一共有100元、50元、10元、5元、2元和1元六种。最少需要准备多少张人民币,才能在给每位老师发工资的时候都不用老师找零呢?理解题意,不难
/*
老师的工资都是正整数,人民币一共有100元、50元、10元、5元、2元和1元六种。
最少需要准备多少张人民币,才能在给每位老师发工资的时候都不用老师找零呢?
*/
#include<iostream>
using namespace std;
int main(){
int n,salary,sum;//老师人数[1,99]
while(cin>>n){
if(n==0) return 0;
sum=0;
for(int i=0;i<n;i++){
cin>>salary;
while(salary>0){
if(salary>=100){
sum=sum+salary/100;
salary=salary%100;
}
else if(salary>=50){
sum=sum+salary/50;
salary=salary%50;
}
else if(salary>=10){
sum=sum+salary/10;
salary=salary%10;
}
else if(salary>=5){
sum=sum+salary/5;
salary=salary%5;
}
else if(salary>=2){
sum=sum+salary/2;
salary=salary%2;
}
else{
sum=sum+salary;
salary=0;
}
}//while循环
}//for循环
cout<<sum<<endl;
}
return 0;
}
2022、在二维数组中,寻找绝对值最大的数
输入m行n列的数据,输出其中绝对值最大的数所在的行数,列数和数据
如果有多个绝对值相等的数值,则输出行号最小的那个
若行号也相同,则输出列数最小的那个
Input
输入数据有多组,每组的第一行是两个整数m和n,表示应聘MM的总共的行列数,然后是m行整数,每行有n个,m和n的定义见题目的描述。
Output
对于每组输入数据,输出三个整数x,y和s,分别表示选中的MM的行号、列号和分数。
note:行号和列号从一开始,如果有多个MM的分数绝对值一样,那么输出排在最前面的一个(即行号最小的那个,如果行号相同则取列号最小的那个)。
Sample Input
2 3
1 4 -3
-7 3 0
Sample Output
2 1 -7
Code
对二维数组排序,不难
/*
输入m行n列的数据,输出其中绝对值最大的数所在的行数,列数和数据
如果有多个绝对值相等的数值,则输出行号最小的那个
若行号也相同,则输出列数最小的那个
*/
#include<iostream>
#include<cmath>
using namespace std;
int scoreArray[100][100];
int main(){
int m,n;//m行n列
while(cin>>m>>n){
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
cin>>scoreArray[i][j];
}
}
//寻找scoreArray[]数组中绝对值最大的数
int maxscore=scoreArray[0][0],k,s;
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(abs(maxscore)<abs(scoreArray[i][j])){
maxscore=scoreArray[i][j];
k=i+1;
s=j+1;
}
}
}
cout<<k<<" "<<s<<" "<<maxscore<<endl;
}
}
2023、求平均成绩
假设一个班有n(n<=50)个学生,每人考m(m<=5)门课,求每个学生的平均成绩和每门课的平均成绩,并输出各科成绩均大于等于平均成绩的学生数量。
Input
输入数据有多个测试实例,每个测试实例的第一行包括两个整数n和m,分别表示学生数和课程数。然后是n行数据,每行包括m个整数(即:考试分数)。
Output
对于每个测试实例,输出3行数据,第一行包含n个数据,表示n个学生的平均成绩,结果保留两位小数;第二行包含m个数据,表示m门课的平均成绩,结果保留两位小数;第三行是一个整数,表示该班级中各科成绩均大于等于平均成绩的学生数量。
每个测试实例后面跟一个空行。
Sample Input
2 2
5 10
10 20
Sample Output
7.50 15.00
7.50 15.00
1
Code
n个学生,每个学生有m门课的成绩,计算每个学生的平均成绩以及每门课的平均成绩.
利用结构体数组保存每个学生的数据
/*
n个学生,每个学生有m门课的成绩
计算每个学生的平均成绩以及每门课的平均成绩
*/
#include<iostream>
#include<iomanip>
using namespace std;
struct Student{
int score[5];//每门课的成绩
double aver_score;//平均成绩
}stu[50];
int main(){
int n,m,sum;//n[1,50] m[1,5]
while(cin>>n>>m){
for(int i=0;i<n;i++){
sum=0;
for(int j=0;j<m;j++){
cin>>stu[i].score[j];
sum=sum+stu[i].score[j];
}
stu[i].aver_score=(double)sum/(double)m;
}
//计算每门课的平均成绩
double aver_subject[5];
for(int i=0;i<m;i++){
sum=0;
for(int j=0;j<n;j++){
sum=sum+stu[j].score[i];
}
aver_subject[i]=(double)sum/(double)n;
}
//该班级中各科成绩均大于等于平均成绩的学生数量
int count=0;
bool flag;
for(int i=0;i<n;i++){
flag=true;
for(int j=0,k=0;j<m;j++,k++){
if(stu[i].score[j]<aver_subject[k]){
flag=false;
break;
}
}
if(flag==true){
count++;
}
}
//输出
cout<<setiosflags(ios::fixed);
for(int i=0;i<n;i++){
if(i==0)
cout<<setprecision(2)<<stu[i].aver_score;
else
cout<<" "<<setprecision(2)<<stu[i].aver_score;
}
cout<<endl;
for(int i=0;i<m;i++){
if(i==0)
cout<<setprecision(2)<<aver_subject[i];
else
cout<<" "<<setprecision(2)<<aver_subject[i];
}
cout<<endl;
cout<<count<<endl<<endl;
}
}
2024、C语言合法标识符
输入一个字符串,判断其是否是C的合法标识符。
Input
输入数据包含多个测试实例,数据的第一行是一个整数n,表示测试实例的个数,然后是n行输入数据,每行是一个长度不超过50的字符串。
Output
对于每组输入数据,输出一行。如果输入数据是C的合法标识符,则输出"yes",否则,输出“no”。
Sample Input
3
12ajf
fi8x_a
ff ai_2
Sample Output
no
yes
no
Code
注意换行符的影响
/*C语言合法标识符:
C语言中规定标识符只能由字母、数字和下划线3种字符组成
且第一个字符必须为字母或下划线,即第一个字符不能是数字。
题目:输入一个字符串,判断其是否是合法标识符
*/
#include<iostream>
#include<cstring>
using namespace std;
char ch[100];
int main(){
int n;
cin>>n;
char c[2];
gets(c);//消除换行符的影响,gets()从缓冲区读取一个字符串存储到字符指针变量 c所指向的内存空间
//使用gets()函数缓冲区不会遗留换行符
while(n--){
gets(ch);//cin遇到空格会停止输入
int len=strlen(ch);
bool flag=true;
for(int i=0;i<len;i++){
if(isdigit(ch[0])!=0){//以数字开始
flag=false;
cout<<"no"<<endl;
break;
}
if(!isalnum(ch[i])&&ch[i]!='_'){ //isalnum()判断字符是否为字母或数字
flag=false;
cout<<"no"<<endl;
break;
}
}
if(flag==true){
cout<<"yes"<<endl;
}
}
return 0;
}
2025、查找最大字母,并在其后插入字符串
对于输入的每个字符串,查找其中的最大字母,在该字母后面插入字符串“(max)”。
Input
输入数据包括多个测试实例,每个实例由一行长度不超过100的字符串组成,字符串仅由大小写字母构成。
Output
对于每个测试实例输出一行字符串,输出的结果是插入字符串“(max)”后的结果,如果存在多个最大的字母,就在每一个最大字母后面都插入"(max)"。
Sample Input
abcdefgfedcba
xxxxx
Sample Output
abcdefg(max)fedcba
x(max)x(max)x(max)x(max)x(max)
Code
查找一串字符串中最大的字母,在该字母后插入字符串(max)
思路:两次遍历,第一次找到最大值,第二次遍历与最大值进行比较,相等的时候输出"(max)"
/*
查找一串字符串中最大的字母,在该字母后插入字符串(max)
思路:两次遍历,第一次找到最大值,第二次遍历与最大值进行比较,相等的时候输出"(max)"
*/
#include<iostream>
#include<cstring>
using namespace std;
int main(){
char c[100];
while(cin>>c){
int len=strlen(c);
char maxc=c[0];
for(int i=0;i<len;i++){
if(maxc<c[i]){
maxc=c[i];
}
}
//最大的字符maxc
for(int i=0;i<len;i++){
cout<<c[i];
if(maxc==c[i]){
cout<<"(max)"; //输出的时候显示
}
}
cout<<endl;
}
return 0;
}
2026、首字母变大写
输入一个英文句子,将每个单词的第一个字母改成大写字母。
Input
输入数据包含多个测试实例,每个测试实例是一个长度不超过100的英文句子,占一行。
Output
请输出按照要求改写后的英文句子。
Sample Input
i like acm
i want to get an accepted
Sample Output
I Like Acm
I Want To Get An Accepted
Code
将空格后的第一个字母变为大写
/*对于一个英文句子,将句子中每个单词的第一个字母改成大写字母
思路:遍历字符串,除第一个字符外,每遇到一个空格,将其下一个字符转变为大写
小写字母转化为大写字母,-32
*/
#include<iostream>
#include<cstring>
using namespace std;
int main(){
char s[101];
while(gets(s)){
int len=strlen(s);
for(int i=0;i<len;i++){
if(i==0){
s[i]=s[i]-32;
}
else if(s[i]==' '){
i++;
s[i]=s[i]-32;
}
}
puts(s);//输出字符串,系统会自动在其后加一个换行符
}
}
2027、统计元音字母的个数
统计每个元音字母在字符串中出现的次数。
Input
输入数据首先包括一个整数n,表示测试实例的个数,然后是n行长度不超过100的字符串。
Output
对于每个测试实例输出5行,格式如下:
a:num1
e:num2
i:num3
o:num4
u:num5
多个测试实例之间由一个空行隔开。
请特别注意:最后一块输出后面没有空行:)
Sample Input
2
aeiou
my name is ignatius
Sample Output
a:1
e:1
i:1
o:1
u:1
a:2
e:1
i:3
o:0
u:1
Code:
统计一行字符串中元音的个数
//统计一行字符串中元音字母的个数
#include<iostream>
#include<cstring>
using namespace std;
int main(){
int n;
cin>>n;
char a[2]; gets(a);
char s[101];
while(n--){
gets(s);
int len=strlen(s);
int num[5]={0};//统计元音字母的个数
for(int i=0;i<len;i++){
switch(s[i]){
case 'a':
num[0]++;
break;
case 'e':
num[1]++;
break;
case 'i':
num[2]++;
break;
case 'o':
num[3]++;
break;
case 'u':
num[4]++;
break;
default:
break;
}
}
if(n==0){
cout<<"a:"<<num[0]<<endl;
cout<<"e:"<<num[1]<<endl;
cout<<"i:"<<num[2]<<endl;
cout<<"o:"<<num[3]<<endl;
cout<<"u:"<<num[4]<<endl;
}
else{
cout<<"a:"<<num[0]<<endl;
cout<<"e:"<<num[1]<<endl;
cout<<"i:"<<num[2]<<endl;
cout<<"o:"<<num[3]<<endl;
cout<<"u:"<<num[4]<<endl<<endl;
}
}
return 0;
}
2028、Lowest Common Multiple Plus[求n个数的最小公倍数]
求n个数的最小公倍数。
Input
输入包含多个测试实例,每个测试实例的开始是一个正整数n,然后是n个正整数。
Output
为每组测试数据输出它们的最小公倍数,每个测试实例的输出占一行。你可以假设最后的输出是一个32位的整数。
Sample Input
2 4 6
3 2 5 7
Sample Output
12
70
Code
求n个数的最小公倍数,转化为求两个数的最小公倍数
//求n个数的最小公倍数,每两个数求一次最小公倍数
#include<iostream>
using namespace std;
int comMul(__int64 x,__int64 y){
__int64 a=x*y;
if(x<y){
__int64 temp=x;
x=y;
y=temp;
}
__int64 t=x%y;
while(t!=0){
x=y;
y=t;
t=x%y;
}
return a/y;
}
int main(){
int n;
while(cin>>n){
__int64 a,b,c,result;
cin>>a>>b;
result=comMul(a,b);
for(int i=2;i<n;i++){
cin>>c;
result=comMul(result,c);
}
cout<<result<<endl;
}
return 0;
}
2029、Palindromes _easy version[判断回文字符串]
“回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。请写一个程序判断读入的字符串是否是“回文”。
Input
输入包含多个测试实例,输入数据的第一行是一个正整数n,表示测试实例的个数,后面紧跟着是n个字符串。
Output
如果一个字符串是回文串,则输出"yes",否则输出"no".
Sample Input
4
level
abcde
noon
haha
Sample Output
yes
no
yes
no
Code
//判断一个字符串是否是回文字符串
#include<iostream>
#include<cstring>
using namespace std;
char c[1000];
int main(){
int n;
cin>>n;
while(n--){
cin>>c;
int len=strlen(c);
bool flag=true;
for(int i=0;i<len/2;i++){
if(c[i]!=c[len-1-i]){
flag=false;
cout<<"no"<<endl;
break;
}
}
if(flag==true){
cout<<"yes"<<endl;
}
}
return 0;
}
2030、汉字统计
统计给定文本文件中汉字的个数。
Input
输入文件首先包含一个整数n,表示测试实例的个数,然后是n段文本。
Output
对于每一段文本,输出其中的汉字的个数,每个测试实例的输出占一行。
[Hint:]从汉字机内码的特点考虑~
Sample Input
2
WaHaHa! WaHaHa! 今年过节不说话要说只说普通话WaHaHa! WaHaHa!
马上就要期末考试了Are you ready?
Sample Output
14
9
Code
注意汉字机内码的特点
//统计给定文本中汉字的个数
//一个汉字占两个字节,汉字机内码的每个字节表示的十进制数都是负数
#include<iostream>
#include<cstring>
using namespace std;
char str[10000];
int main(){
int n;
cin>>n;
char a[2];gets(a);
while(n--){
gets(str);
int len=strlen(str);
int count=0;
for(int i=0;i<len;i++){
if(str[i]<0){
count++;
}
}
cout<<count/2<<endl;//记得除以2
}
return 0;
}