当前位置: 代码迷 >> 综合 >> 杭电ACM基础题(2021、2022、2023、2024、2025、2026、2027、2028、2029、2030)
  详细解决方案

杭电ACM基础题(2021、2022、2023、2024、2025、2026、2027、2028、2029、2030)

热度:66   发布时间:2023-12-29 06:14:52.0

文章目录

    • 2021、发工资
    • 2022、在二维数组中,寻找绝对值最大的数
    • 2023、求平均成绩
    • 2024、C语言合法标识符
    • 2025、查找最大字母,并在其后插入字符串
    • 2026、首字母变大写
    • 2027、统计元音字母的个数
    • 2028、Lowest Common Multiple Plus[求n个数的最小公倍数]
    • 2029、Palindromes _easy version[判断回文字符串]
    • 2030、汉字统计

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;elsecout<<" "<<setprecision(2)<<stu[i].aver_score;}cout<<endl;for(int i=0;i<m;i++){
    if(i==0)cout<<setprecision(2)<<aver_subject[i];elsecout<<" "<<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];}}//最大的字符maxcfor(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:1a: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;
}