杭电ACM基础题(2021、2022、2023、2024、2025、2026、2027、2028、2029、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;
            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;
} 
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值