杭电oj刷题第一阶段答案

文章目录

  • 输入输出练习
    • 1000 A+B
    • 1089 A+B for Input-Output Practice (I)
    • 1090 A+B for Input-Output Practice (II)
    • 1091 A+B for Input-Output Practice (III)
    • 1092 A+B for Input-Output Practice (IV)
    • 1093 A+B for Input-Output Practice (V)
    • 1094 A+B for Input-Output Practice (VI)
    • 1095 A+B for Input-Output Practice (VII)
    • 1096 A+B for Input-Output Practice (VIII)
    • 1001 Sum Problem
  • 简单操作
    • 2000 ASCII码排序
    • 2001 计算两点间的距离
    • 2002 计算球体积
    • 2003 求绝对值
    • 2004 成绩转换
    • 2005 第几天?
    • 2006 求奇数的乘积
    • 2007 平方和与立方和
    • 2008 数值统计
    • 2009 求数列的和
    • 2010 水仙花数
    • 2011 多项式求和
    • 2039 三角形
  • 英文题试水
    • 1720 A+B Coming
    • 1062 Text Reverse
    • 2104 hide handkerchief
    • 1064 Financial Management
    • 2734 Quicksum
    • 1170 Balloon Comes!
    • 1197 Specialized Four-Digit Numbers
    • 2629 Identity Card
  • 回归水题
    • 2012 素数判定
    • 2013 蟠桃记
    • 2014 青年歌手大奖赛_评委会打分
    • 2015 偶数求和
    • 2016 数据的交换输出
    • 2017 字符串统计
    • 2018 母牛的故事
    • 2019 数列有序!
    • 2020 绝对值排序
    • 2021 发工资咯:)
    • 2022 海选女主角
    • 2023 求平均成绩
    • 2024 C语言合法标识符
    • 2025 查找最大元素
    • 2026 首字母变大写
    • 2027 统计元音
    • 2028 Lowest Common Multiple Plus
    • 2029 Palindromes _easy version
    • 2030 汉字统计
    • 2032 杨辉三角
    • 2040 亲和数
    • 2042 不容易系列之二
    • 2054 A == B ?
    • 2055 An easy problem
  • 写在最后

输入输出练习

这里贴上了我自己当时练习杭电oj时的代码和解题思路,必要的题目我会详细的写明需要注意的问题和每一步我的想法

1000 A+B

这道题只要注意EOF的用法就可以了,因为程序中并没有说明有多少数据,EOF可以帮助我们判断是否已经到了末尾。

#include 

int main(){
	int a = 0,b = 0;
	while(scanf("%d%d",&a,&b)!=EOF)//只要注意这种写法就可以了,在oj里面很常用
		printf("%d\n",a+b);
	return 0;
}

1089 A+B for Input-Output Practice (I)

#include 

int main(){
	int a = 0,b = 0;
	while(scanf("%d%d",&a,&b)!=EOF){
		printf("%d\n",a+b);
	}
	return 0;
}

1090 A+B for Input-Output Practice (II)

#include 

int main(){
	int N;
	scanf("%d",&N);
	int a,b;
	while(N--){
		scanf("%d%d",&a,&b);
		printf("%d\n",a+b);
	}
	return 0;
}

1091 A+B for Input-Output Practice (III)

#include 

int main(){
	int a = 0,b = 0;
	while(scanf("%d%d",&a,&b)!=EOF && ((a != 0)||(b != 0))){
		printf("%d\n",a+b);
	}
	return 0;
}

1092 A+B for Input-Output Practice (IV)

#include 

int main(){
	int n = 0,a = 0,sum = 0;
	while(scanf("%d",&n) != EOF&&(n!=0)){
		sum = 0;
		while(n--){
			scanf("%d",&a);
			sum += a;
		}
		printf("%d\n",sum);
	}
	return 0;
}

1093 A+B for Input-Output Practice (V)

#include 

int main(){
	int N = 0;
	int n = 0;
	int a = 0;
	int sum = 0;
	scanf("%d",&N);
	while(N--){
		scanf("%d",&n);
		sum = 0;
		while(n--){
			scanf("%d",&a);
			sum+=a;
		}
		printf("%d\n",sum);
	}
	return 0;
}

1094 A+B for Input-Output Practice (VI)

#include 

int main(){
	int n = 0;
	int a = 0;
	int sum = 0;
	while(scanf("%d",&n)!=EOF){
		sum = 0;
		while(n--){
			scanf("%d",&a);
			sum+=a;
		}
		printf("%d\n",sum);
	}
	return 0;
}

1095 A+B for Input-Output Practice (VII)

#include

int main(){
	int a = 0,b = 0;
	while(scanf("%d%d",&a,&b)!=EOF){
		printf("%d\n\n",a+b);
	}
	return 0;
}

1096 A+B for Input-Output Practice (VIII)

#include 

int main(){
	int N = 0,M = 0;
	int a = 0,sum = 0;
	scanf("%d",&N);
	while(N--){
		scanf("%d",&M);
		sum = 0;
		while(M--){
			scanf("%d",&a);
			sum += a;
		}
		if(N!=0){//如果不是最后一组数据就输出带一个空行的结果
			printf("%d\n\n",sum);
		}else{//是最后一组数据单输出结果即可
			printf("%d\n",sum);
		}
	}
	return 0;
}

1001 Sum Problem

这个题稍微需要动一下脑子,题目本来的意思是每输入一个数,输出当前已经输入的所有数据的和,我说的动一下脑子指的是如果你有追求效率的心的话,没有那就别管了,我当时做法是避免二重循环效率低,所以打算采用 sum = n * (n + 1) / 2来做,但是很不幸,溢出了,题目只保证了结果会是int类型范围内,但是中间数据可不保证所以你可以采用下面这种做法,也可以换一个思路 sum = n / 2 * (n + 1) 这样就可以了

# include

int main()
{	
	int n;
	while(scanf("%d",&n)!=EOF)
	{
		int sum=0;
		for(int i=0;i<=n;i++)
		{
			sum+=i;
		}
	printf("%d\n\n",sum);
	}
	return 0;
}

简单操作

2000 ASCII码排序

#include
#include
int main(){
	char a,b,c;
	while(scanf("%c %c %c",&a,&b,&c)!=EOF){
		getchar();//接收换行,不然下一次的数据可能会有问题
		char t;
		if(a>b){
			t=a;a=b;b=t;
		}
		if(a>c){
			t=a;a=c;c=t;
		}
		if(b>c){
			t=b;b=c;c=t;
		}
		printf("%c %c %c\n",a,b,c);
	}
}

2001 计算两点间的距离

#include 
#include //为了使用开根函数

int main(){
	double x1,y1,x2,y2;//首先要注意题目中说明了输入数据会是实数
	double distance = 0;
	while(scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2)!=EOF){
		distance = sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
		printf("%.2lf\n",distance);//注意保留两位小数的写法
	}
	return 0;
}

2002 计算球体积

这里只需要注意一下球的体积计算公式就可以了: 4 π r 3 3 \frac{4πr^3}{3} 34πr3

#include 
#define PI 3.1415927
int main(){
	double r;
	double tiji;//英文学的不好,体积是啥自己查
	while(scanf("%lf",&r)!=EOF){
		tiji = 4 * PI * r * r * r / 3.0;//这里为了以防万一我用的3.0来求精度
		printf("%.3lf\n",tiji);
	}
	return 0;
}

2003 求绝对值

#include 

int main(){
	double x;
	while ((scanf("%lf", &x))!= EOF)
		printf("%.2f\n", (x > 0) ? x : -x);
	return 0;
}

2004 成绩转换

#include 

int main(){
	int score;
	while(scanf("%d",&score)!=EOF){
		if(score >= 90 && score <= 100){
			printf("A\n");
		}else if(score >= 80 && score <= 89){
			printf("B\n");
		}else if(score >= 70 && score <= 79){
			printf("C\n");
		}else if(score >= 60 && score <= 69){
			printf("D\n");
		}else if(score >= 0 && score <= 59){
			printf("E\n");
		}else {
			printf("Score is error!\n");
		}
	}
	return 0;
}

2005 第几天?

这里首先要知道闰年的判断条件:能被4整除并且不能被100整除或者能被400整除

#include 

int main(){
	int day[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
	int year,month,date;
	int num = 0;
	while(scanf("%d/%d/%d",&year,&month,&date)!=EOF){//输入要随机应变
		num = 0;
		if((year % 400 == 0) || ((year % 100 != 0) && (year % 4 == 0))){
			day[1] = 29;
		}else{
			day[1] = 28;
		}
		for(int i = 0;i < month - 1;i++){//要计算到前一个月
			num += day[i];
		}
		num += date;//加上本月的天数
		printf("%d\n",num);
	}
	return 0;
}

2006 求奇数的乘积

#include 

int main(){
	int n,a,result;
	while(scanf("%d",&n)!=EOF){
		result = 1;//因为是成绩所以要用1进行初始化
		while(n--){
			scanf("%d",&a);
			if(a % 2 != 0)
				result *= a;
		}
		printf("%d\n",result);
	}
	return 0;
}

2007 平方和与立方和

#include

int main(){
	int m,n;
	int x,y;
	while(scanf("%d%d",&m,&n)!=EOF){
		x = 0;y = 0;
		if(m > n){
			int temp = m;
			m = n;
			n = temp;
		}
		for(int i = m;i <= n;i++){
			if(i % 2 == 0){
				x += i*i;
			}else{
				y += i*i*i;
			}
		}
		printf("%d %d\n",x,y);
	}
	return 0;
}

2008 数值统计

#include 

int main(){
	int n;
	double num;
	int a,b,c;
	while(scanf("%d",&n)!=EOF && n){
		a = 0;b = 0;c = 0;
		while(n--){
			scanf("%lf",&num);
			if(num < 0){
				a++;
			}else if(num > 0){
				c++;
			}else{
				b++;
			}
		}
		printf("%d %d %d\n",a,b,c);
	}
	return 0;
}

2009 求数列的和

#include 
#include 
int main(){
	double n;
	int m;
	double a[10000] = {0};
	double sum = 0;
	while(scanf("%lf%d",&n,&m)!=EOF){
		sum = 0;
		for(int i = 0;i < m;i++){
			if(i == 0){
				a[i] = n;
			}else{
				a[i] = sqrt(a[i-1]);
			}
			sum += a[i];
		}
		printf("%.2lf\n",sum);
	}
	return 0;
}

2010 水仙花数

#include 

int main(){
	int m,n;
	while(scanf("%d%d",&m,&n)!=EOF){
		bool flag = false;//来判断是否是第一个数据,由此判断什么时候输出空格
		for(int i = m;i <= n;i++){
			int gewei = i%10;//个位上的数
			int shiwei = i/10%10;//十位上的数
			int baiwei = i/100%10;//百位上的数
			int temp = gewei*gewei*gewei+shiwei*shiwei*shiwei+baiwei*baiwei*baiwei;
			if(i == temp){
				if(flag == false){//是第一个数据则直接输出
					printf("%d",i);
				}else{//不是第一个数据要先输出一个空格再输出结果
					printf(" %d",i);
				}
				flag = true;
			}
		}
		if(flag == false){//没有修改过说明没有水仙花数
			printf("no\n");
		}else{
			printf("\n");
		}
	}
	return 0;
}

2011 多项式求和

#include 
#include 
int main(){
	int m;
	int n;
	double sum = 0;
	scanf("%d",&m);
	while(m--){
		sum = 0;
		scanf("%d",&n);
		for(int i = 1;i <= n;i++){
			sum += pow(-1.0,(double)(i - 1)) * 1.0 / i;
		}
		printf("%.2lf\n",sum);
	}
	return 0;
}

2039 三角形

记住三角形的判断条件:两边之和大于第三边

#include 

int main(){
	int M;
	float A,B,C;
	scanf("%d",&M);
	while(M--){
		scanf("%f%f%f",&A,&B,&C);
		if(A+B>C&&A+C>B&&B+C>A){
			printf("YES\n");
		}else{
			printf("NO\n");
		}
	}
	return 0;
}

英文题试水

1720 A+B Coming

#include 

int main(){
	int A,B;
	while(scanf("%x%x",&A,&B)!=EOF){
		printf("%d\n",A+B);
	}
	return 0;
}

1062 Text Reverse

#include 
#include 
int main(){
	int T;
	char temp[1000];
	scanf("%d",&T);
	getchar();//接收换行
	while(T--){
		gets(temp);
		int length = strlen(temp);
		int flag = -1;
		for(int i =0;i<=length;i++){
			if(temp[i]==' '||i == length){//遇到空格就进行一次处理,把当前单词反转,同理换行
				for(int j = i - 1;j >= 0 && j != flag;j--){
					putchar(temp[j]);
				}
				flag = i;
				if(i!=length) putchar(' ');
			}
		}
		printf("\n");
	}
	return 0;
}

2104 hide handkerchief

翻译一下就是:n个人围成一个圈玩找手帕游戏,手帕藏在某一个人的箱子里,Haha来找,每一次他都会跳过m-1个人。问Haha是不是一定能找到手帕。
解析:因为Haha找的次数是无限的,可以永远找下去,所以,只要他能把所有的人都找一遍就一定能找到。但按照他的这种找法,如果n和m不互质的话就会出现某些人是永远不会找。所以看一下 n和m的最大公约数是否等于1就行了。
题目本身不难,难在想法上,看你能不能看出来这是一个互质的问题,采用辗转相除法就可以啦

#include 

int check(int n,int m){
	while(m){
		int r = n % m;
		n = m;
		m = r;
	}
	return n;
}

int main(){
	int N,M;
	while(scanf("%d%d",&N,&M)!=EOF&&N!=-1&&M!=-1){
		int r = check(N,M);
		if(r==1){
			printf("YES\n");
		}else{
			printf("POOR Haha\n");
		}
	}
	return 0;
}

1064 Financial Management

#include

int main(){
	int N = 12;
	double num = 0;
	double sum = 0;
	while(N--){
		scanf("%lf",&num);
		sum+=num;
	}
	printf("$%.2lf\n",sum/12);
	return 0;
}

2734 Quicksum

#include 
#include 

int main(){
	char input[256];
	gets(input);
	while(input[0]!='#'){
		int length = strlen(input);
		int sum = 0;
		for(int i = 0;i < length;i++){
			int distance = input[i] - 64;
			int value = 0;
			if(distance >=1 && distance <= 26){
				value = distance;
			}
			sum += (i + 1) * value;
		}
		printf("%d\n",sum);
		gets(input);
	}
	return 0;
}

1170 Balloon Comes!

#include 

int main(){
	int T;
	int A,B;
	char C;
	float result;
	scanf("%d",&T);
	getchar();
	while(T--){
		scanf("%c%d%d",&C,&A,&B);
		getchar();
		switch(C){
		case '+':result = A+B;break;
		case '-':result = A-B;break;
		case '*':result = A*B;break;
		case '/':result = (double)A/B;break;
		}
		if(C=='/' && A%B!=0){
			printf("%.2f\n",result);
		}else{
			printf("%d\n",(int)result);
		}
	}
	return 0;
}

1197 Specialized Four-Digit Numbers

#include
using namespace std;

int main(){
    int i;
    int thousand[3],hundred[3],ten[3],num[3],sum[3];
    for(i=1000;i<10000;i++){

        thousand[0]=i/1000;
        hundred[0]=i/100-10*thousand[0];
        ten[0]=(i%100)/10;
        num[0]=i%10;

        thousand[1]=i/1728;
        hundred[1]=i/144-12*thousand[1];
        ten[1]=(i%144)/12;
        num[1]=i%12;

        thousand[2]=i/4096;
        hundred[2]=i/256-16*thousand[2];
        ten[2]=(i%256)/16;
        num[2]=i%16;

        sum[0]=thousand[0]+hundred[0]+ten[0]+num[0];
        sum[1]=thousand[1]+hundred[1]+ten[1]+num[1];
        sum[2]=thousand[2]+hundred[2]+ten[2]+num[2];


        if(sum[0]==sum[1]&&sum[0]==sum[2])
            cout<<i<<endl;      
    } 
	return 0;
}

2629 Identity Card

#include 
#include

using namespace std;

int main(void)
{
    int n;
    string input_str,place;
    cin>>n;
    for(int i=0; i<n; i++)
    {
        cin>>input_str;
        if(input_str.substr(0,2)=="33")
            place="Zhejiang";
        else if(input_str.substr(0,2)=="11")
            place="Beijing";
        else if(input_str.substr(0,2)=="71")
            place="Taiwan";
        else if(input_str.substr(0,2)=="81")
            place="Hong Kong";
        else if(input_str.substr(0,2)=="82")
            place="Macao";
        else if(input_str.substr(0,2)=="54")
            place="Tibet";
        else if(input_str.substr(0,2)=="21")
            place="Liaoning";
        else if(input_str.substr(0,2)=="31")
            place="Shanghai";

        cout <<"He/She is from"<<" "<< place
             << ",and his/her birthday is on"<<" "<<input_str.substr(10,2)<<","
             <<input_str.substr(12,2)<<","<<input_str.substr(6,4)<<" "
             <<"based on the table."<<endl;
    }

    return 0;
}

回归水题

2012 素数判定

#include 

using namespace std;

int check_prime_num(int arg)
{
    if(arg<=0)return 0;
    else if(arg==1) return 0;
    else if(arg==2)return 1;
    else
    {
        for(int j=2; j<arg; j++)
        {
            if(arg%j==0) return 0;
        }
        return 1;
    }
}

int main(void)
{
    int x,y,temp,flag=0;
    while(cin>>x>>y)
    {
        if(x==0&&y==0)break;
        for(int i=x; i<=y; i++)
        {
            temp=i*i+i+41;
            if(check_prime_num(temp)==1)
                ++flag;
        }
        if(flag==(y-x+1))cout<<"OK"<<endl;
        else cout<<"Sorry"<<endl;
        flag=0;
    }
    return 0;
}

2013 蟠桃记

我们来简单的想一下,猴子每次吃前一天的一半多一个,那么我们前一天的桃子数量是后一天桃子数量+1的2倍,由此可以写出我们的代码

#include 

int main(){
	int n;
	while ((scanf("%d",&n))!=EOF){
		int sum = 1;
		for (int i = n-1; i != 0; --i){
			sum = (sum + 1) * 2;
		}
		printf("%d\n",sum);
	}
	return 0;
}

2014 青年歌手大奖赛_评委会打分

#include 

int main(){
	double result;
	int n = 0;
	double score;
	double max = 0,min = 100;
	while(scanf("%d",&n)!=EOF){
		result = 0;
		max = 0;min = 100;
		for(int i = 0;i < n;i++){
			scanf("%lf",&score);
			result += score;
			if(score > max){
				max = score;
			}
			if(score < min){
				min = score;
			}
		}
		result = (double)(result - max - min)/(n - 2);
		printf("%.2lf\n",result);
	}
	return 0;
}

2015 偶数求和

#include
#include
using namespace std;

int main(){
    int n, m, i;
    while(cin >> n >> m){
        for(i = 1; i + m <= n; i += m){
            printf("%d ", 2*i + m - 1);
        }
        printf("%d\n",n + i);
    }
    return 0;
}

2016 数据的交换输出

#include 

int main(){
	int n;
	int temp[100] = {0};
	int min = 10000000;
	int xiabiao = 0;
	scanf("%d",&n);
	while(n){
		min = 10000000;
		xiabiao = 0;		
		for(int i = 0;i < n;i++){
			scanf("%d",&temp[i]);
			if(min > temp[i]){
				xiabiao = i;
				min = temp[i];
			}
		}
		if(xiabiao){//交换
			int t = temp[xiabiao];
			temp[xiabiao] = temp[0];
			temp[0] = t;
		}
		for(int i = 0;i < n;i++){//输出
			if(i == 0)
				printf("%d",temp[i]);
			else
				printf(" %d",temp[i]);
		}
		printf("\n");
		scanf("%d",&n);
	}
	return 0;
}

2017 字符串统计

#include
#include
int main(){
	int n;
	scanf("%d",&n);
	char string[1000];
	while(n--){
		scanf("%s",&string);
		int length=strlen(string);
		int count=0;
		for(int i=0;i<length;i++){
			if(string[i]>='0'&&string[i]<='9'){
				count++;
			}
		}
		printf("%d\n",count);
	}
	return 0;
}

2018 母牛的故事

#include
using namespace std;

int main(){
	int n;//year
	int a;//一年熟母牛 
	int b;//两年熟母牛 
	int c;//三年熟母牛 
	int d;//全熟母牛 
	int x;
	while(cin>>n && n != 0){
		d = 1;
		a = b = c = 0;
		x = 1;
		for(int i = 0;i < n - 1;i++){
			d += c;		
			x = d;
			c = b;
			b = a;
			a = x;	
		}
		cout<<a+b+c+d<<endl;
	}
	return 0;
}

2019 数列有序!

#include
int main(){
    int n,m;
    while(~ scanf("%d %d",&n,&m)&&n&&m) {
        int t[100];
        for(int i=0; i<n; i++) {
            scanf("%d",&t[i]);
        }
        t[n]=m;
        int k;
        for(int i=0; i<=n; i++) {
            for(int j=0; j<=n-i-1; j++) {
                if(t[j]>t[j+1]) {
                    k=t[j];
                    t[j]=t[j+1];
                    t[j+1]=k;
                }
            }
        }
        for(int i=0; i<=n; i++) {
            if(i==n)
            printf("%d\n",t[i]);
            else
            printf("%d ",t[i]);
        }
    }
    return 0;
}

2020 绝对值排序

#include 
#include 

int main(){
	int n;
	int num[100] = {0};
	scanf("%d",&n);
	while(n){
		for(int i = 0;i < n;i++){
			scanf("%d",&num[i]);
		}
		for(int k = 0;k < n;k++){
			for(int j = 0;j < n - k - 1;j++){
				if(abs(num[j]) < abs(num[j + 1])){
					int temp = num[j];
					num[j] = num[j + 1];
					num[j + 1] = temp;
				}
			}
		}
		for(int i = 0;i < n;i++){
			if(i==0)
				printf("%d",num[i]);
			else
				printf(" %d",num[i]);
		}
		printf("\n");
		scanf("%d",&n);
	}
	return 0;
}

2021 发工资咯:)

#include 

int main(){
	int n;
	int money,num;
	int i;
	scanf("%d",&n);
	while(n){
		num = 0;
		for(i = 0;i < n;i++){
			scanf("%d",&money);
			int hundred = money / 100;
			int wushi = (money-hundred*100)/50;
			int shi = (money-hundred*100-wushi*50)/10;
			int wu = (money-hundred*100-wushi*50-shi*10)/5;
			int er = (money-hundred*100-wushi*50-shi*10-wu*5)/2;
			int yi = money-hundred*100-wushi*50-shi*10-wu*5-er*2;
			num += hundred+wushi+shi+wu+er+yi;
		}
		printf("%d\n",num);
		scanf("%d",&n);
	}
	return 0;
}

2022 海选女主角

#include
#include
#include
using namespace std;
int main(){
    int m, n;
    while (cin >> m >> n && m && n){
        vector<vector<int> > mm(m);

        for(int i = 0; i < m; ++ i)
            mm[i].resize(n);
        
        int row, col, maxs;
        row = col = maxs = 0;
        for(int i = 0; i < mm.size(); ++ i)
            for(int j = 0; j < (mm[0].size()); ++ j){
                cin >> mm[i][j];
                if(abs(mm[i][j]) > abs(maxs)){
                    maxs = mm[i][j];
                    row = i;
                    col = j;
                }
            }
        mm.clear();
        cout << row + 1 << ' ' << col + 1 << ' ' << maxs << endl;
    }
    return 0;  
}

2023 求平均成绩

#include 

int main(){
	int n,m;
	int a[50][5] = {0};
	int i,j;
	int stu_sum[50] = {0};
	int sub_sum[5] = {0};
	double sub_avg[5] = {0};
	int num = 0;;
	while(scanf("%d%d",&n,&m)!=EOF){
		num = 0;
		for(i = 0;i<50;i++){
			for(j = 0;j < 5;j++){
				a[i][j] = 0;
				sub_sum[j] = 0;
				sub_avg[j] = 0;
			}
			stu_sum[i] = 0;
		}
		for(i = 0;i < n;i++){
			for(j = 0;j < m;j++){
				scanf("%d",&a[i][j]);
				sub_sum[j] += a[i][j];
				stu_sum[i] += a[i][j];
			}			
		}
		for(j = 0;j < m;j++)
			sub_avg[j] = (double)sub_sum[j] / n;
		for(i = 0;i < n;i++){
			bool flag = true;
			for(j = 0;j < m;j++){
				if(a[i][j] < sub_avg[j]){
					flag = false;
					break;
				}
			}
			if(i == 0){
				printf("%.2lf",(double)stu_sum[i] / m);
			}else{
				printf(" %.2lf",(double)stu_sum[i] / m);
			}
			if(flag)
				num++;
		}
		printf("\n");
		for(j = 0;j < m;j++){
			if(j == 0)
				printf("%.2lf",sub_avg[j]);
			else
				printf(" %.2lf",sub_avg[j]);
		}
		printf("\n");
		printf("%d\n\n",num);
	}
	return 0;
}

2024 C语言合法标识符

#include 
#include 

int main(){
	int n;
	char input[50];
	bool flag;
	scanf("%d",&n);
	getchar();
	while(n--){
		flag = true;
		gets(input);
		int length = strlen(input);
		for(int i = 0;i < length;i++){
			if(i == 0){
				if(input[i]!='_'&&!(input[i]>='a'&&input[i]<='z')&&!(input[i]>='A'&&input[i]<='Z')){
					flag = false;
					break;
				}
			}else{
				if(!(input[i]>='a'&&input[i]<='z')&&!(input[i]>='A'&&input[i]<='Z')&&!(input[i]>='0'&&input[i]<='9')&&input[i]!='_'){
					flag = false;
					break;
				}
			}
		}
		if(flag)
			printf("yes\n");
		else
			printf("no\n");
	}
	return 0;
}

2025 查找最大元素

#include
#include

int main(){
	char c[100];
	while(scanf("%s",c)!=EOF){
		char max='A';
		for(int i=1;i<=strlen(c);i++){
			if(c[i-1]>=max) max=c[i-1];
		}
		for(int i=1;i<=strlen(c);i++){
			putchar(c[i-1]);
			if(c[i-1]==max) printf("(max)");
		}
		printf("\n");
	}
}

2026 首字母变大写

#include
#include
#include
using namespace std;
int main()
{
	string str;
	while(getline(cin,str)){
		str[0]=(char)(str[0]-'a'+65);
		for(int i=1;i<str.size();i++)
		{
			if(str[i]==' ')
			str[i+1]=(char)(str[i+1]-'a'+65);
		}
		cout<<str<<endl;
		
	}
	return 0;
}

2027 统计元音

#include 
#include 

int main(){
	int n;
	char input[1000];
	int num[5];
	int i;
	scanf("%d",&n);
	getchar();
	while(n--){
		for(i = 0;i <5;i++)
			num[i] = 0;
		gets(input);
		int length = strlen(input);
		for(i=0;i<length;i++){
			if(input[i]>='A'&&input[i]<='Z')
				input[i] = input[i]+'a'-'A';
			switch(input[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)
			printf("a:%d\ne:%d\ni:%d\no:%d\nu:%d\n\n",num[0],num[1],num[2],num[3],num[4]);
		else
			printf("a:%d\ne:%d\ni:%d\no:%d\nu:%d\n",num[0],num[1],num[2],num[3],num[4]);
	}
	return 0;
}

2028 Lowest Common Multiple Plus

#include 

int main() {
    int n, i;
    int num[100], n1, n2, temp;
    while (~scanf("%d", &n)) {
        for (int j = 0; j < n; j++) {
            scanf("%d", &num[j]);
        }
        for (i = 0; i < n - 1; i++) {
            n1 = num[i];
            n2 = num[i + 1];
            while (n1 % n2 != 0) {
                temp = n1 % n2;
                n1 = n2;
                n2 = temp;
            }
            num[i + 1] = num[i] / n2* num[i + 1];
        }
        printf("%d\n", num[i]);
    }
    return 0;
}

2029 Palindromes _easy version

#include 
#include 
int main(){
	int n;
	scanf("%d\n",&n);
	char input[1024];
	bool flag;
	while(n--){
		flag = true;
		gets(input);
		for(int i = 0;i < strlen(input)/2.0;i++){
			if(input[i] != input[strlen(input)-1-i]){
				printf("no\n");
				flag = false;
				break;
			}
		}
		if(flag)
			printf("yes\n");
	}
	return 0;
}

2030 汉字统计

这个题我觉得我有必要讲一下,这个题对我来说很新鲜,因为我没处理过汉字的问题,在处理这个问题之前我们需要了解一下汉字机内码在计算机内部的表示方式
首先我们都知道由于计算机是由美国人发明的,所以ASCII码只能用来存储英文,ASCII只占一个字节,那么后来的汉字怎么用计算机表示呢,这个时候就提出来用两个字节来存储汉字和其他文字,每个字节最高位置1,而计算机中都是用补码来存储的,这就意味着汉字的每一个字节都是负数,所以求汉字的个数其实就是求字符串中小于0的个数有几个再除2即可

#include
#include
int main(){
    int n,m=0,i,len;
    char a[10000];
    scanf("%d",&n);
    getchar();   //接收换行
    while(n--){
        m=0;
        gets(a); 
        len=strlen(a);        
        for(i=0;i<len;i++){
            if(a[i]<0)
                m++;
        }
        printf("%d\n",m/2);  
    }
    return 0;
}

2032 杨辉三角

#include
#include
int main(){
	int n;
	while(scanf("%d",&n)!=EOF){
		int a[100][100]={0};
		int i=1,j=1,k=0;
		for(;i<=n;++i){
			for(j=1;j<=i;++j){
				if(j==1)
					a[i][j]=1;
				else if(j==i){
					a[i][j]=1;
					break;
				}else
					a[i][j]=a[i-1][j-1]+a[i-1][j];
			}
		}
		for(i=1;i<=n;++i){
			for(j=1;j<=i;++j){
			if(i!=j){
				printf("%d ",a[i][j]);
			}else{
				printf("%d\n",a[i][j]);
				break;}
			}
		}
		printf("\n");
	}
	return 0;
}

2040 亲和数

#include 

int main(){
	int M,A,B;
	int total;
	bool flag;
	scanf("%d",&M);
	while(M--){
		total = 1;
		flag = true;
		scanf("%d%d",&A,&B);
		for(int i= 2;i < A;i++){
			if(A % i == 0)
				total += i;
		}
		if(total != B){
			printf("NO\n");
			continue;
		}else{
			total = 1;
			for(int i= 2;i < B;i++){
				if(B % i == 0)
					total += i;
			}
			if(total != A){
				printf("NO\n");
			}else{
				printf("YES\n");
			}
		}

	}
	return 0;
}

2042 不容易系列之二

#include 

int main(){
	int N,num,mei;
	scanf("%d",&N);
	while(N--){
		mei = 3;
		scanf("%d",&num);
		for(int i = 0;i < num;i++)
			mei = 2*(mei - 1);
		printf("%d\n",mei);
	}
	return 0;
}

2054 A == B ?

这个题乍一看很简单嘛,其实…坑在于数字的范围没给…所以只能用字串来处理了,然而这就是这个题最烦的地方,难倒是不难,就是烦,烦,烦…

#include 
#include
using namespace std;

//对数字进行统一处理,返回数字第一位不为0的位置
int change_char(char *letter,int *len)
{
    int i=0;
    int len_var=(*len)-1;
    //如果是符号,则跳过
    if(letter[i]=='-')
    {
        ++i;
        --(*len);
    }
    //去掉前面的0
    while(letter[i]=='0'&&i<=len_var)
    {
        --(*len);
        ++i;
    }
    //去掉小数点之后最后无效的0,从最后一位算起
    for(int j=0; j<=len_var; j++)
    {
        if(letter[j]=='.')
        {
            while(letter[len_var]=='0'&&len_var>=0)
            {
                --(*len);
                --len_var;
            }

            break;
        }
    }

    //如果小数点后面都是无效的0.则去掉小数点
    if(letter[len_var]=='.')
        --(*len);

    return i;
}

int main()
{
    char a[100000],b[100000];
    int symbol_flag,lenght_a,lenght_b,pos_char_a,pos_char_b,out_flag=1;

    while(cin>>a>>b)
    {
        /*当两者符号不一样的时候做一个标志,
        因为存在-0=0这种情况,所以当符号不一样不能直接下定论两者不相等
        */
        if(a[0]=='-'&&b[0]!='-' || a[0]!='-'&&b[0]=='-')
            symbol_flag=1;
        //求出a,b长度
        lenght_a=strlen(a);
        lenght_b=strlen(b);
        //求出第一位不为0的数的位置
        pos_char_a= change_char(a,&lenght_a);
        pos_char_b= change_char(b,&lenght_b);
        //当两者的有效位数不一样直接是不相等,注意下面几个continue的作用
        if(lenght_a!=lenght_b)
        {
            cout<<"NO"<<endl;
            continue;
        }
        //以下几个语句都是在lenght_a=lenght_b才执行的
        if(symbol_flag==1&&lenght_a==0)
        {
            cout<<"YES"<<endl;
            continue;
        }
        //当符号不一样,且lenght_a或者lenght_b都不为0时候是不相等的
        if(symbol_flag==1)
        {
            cout<<"NO"<<endl;
            continue;
        }
        //当符号一样,长度相等执行下面语句,从有效长度起始位置开始判断各位是否相等
        for(int i=pos_char_a,j=pos_char_b; i<lenght_a; i++,j++)
        {
            if(a[i]!=b[j])
            {
                cout<<"NO"<<endl;
                out_flag=0;
                break;
            }


        }

        if(out_flag==1)
            cout<<"YES"<<endl;
        //从新初始化
        out_flag=1;

    }
    return 0;
}

2055 An easy problem

#include
using namespace std;

int main()
{
    int t; cin >> t;
    while (t--)
    {
        char let;
        int num;
        cin >> let >> num;
        int res = 0;
        if (let <= 'Z' && let >= 'A')
            res = let - 'A' + 1;
        else if (let <= 'z' && let >= 'a')
            res = 'a' - let - 1;
        cout << res + num << endl;
    }
	return 0;
}

写在最后

这都是最基础的题目,据说天津大学机试的题目难度类似于第11页,建议学习一下C++标准库中的一些oj中经常用到的东西,比如:vector,queue,map等等,不需要很深入,但是要了解方法的使用。
如果对于哪一道题想要思路的讲解可以给我评论,我看到了就会及时更改。
PS:没有本人的许可,这篇博客不允许转载

你可能感兴趣的:(杭电oj)