杭电OJ刷题Day4回归水题(2012-2030、2032、2040、2042、2054、2055)

回归水题

在这里插入图片描述

2012 素数判定

在这里插入图片描述

#include<iostream>
#include<string>
#include<cstring>
#include<cmath>

using namespace std;

int main(){
	int x,y,z;
	while(cin>>x>>y){
		if(x==0 && y==0) break;
		int temp=0;		//记录非素数的个数
		for(int n=x;n<=y;n++){
			z=n*n+n+41;
			//判断z是否为素数
			for(int i=2;i*i<=z;i++){
				if(z%i==0){
					temp++;
					break;
				}
			}
		}
		if(temp==0)
			cout<<"OK"<<endl;
		else
			cout<<"Sorry"<<endl;
	}
	return 0;
}

2013 蟠桃记

在这里插入图片描述

#include<iostream>
#include<string>
#include<cstring>
#include<cmath>

using namespace std;

int main(){
	int n,sum;		//第n天
	while(cin>>n){
		sum=1;
		//第n天剩1个
		//第n-1天剩x=(1+1)*2个,因为 x/2-1=1
		//第n-2天剩x=((1+1)*2+1)*2个,因为 x/2-1=(1+1*2)

		for(int i=n;i>1;--i){		//i!=1
			sum=(sum+1)*2;
		}
		cout<<sum<<endl;
		
	}
	return 0;
}

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

在这里插入图片描述

#include<iostream>
#include<string>
#include<cstring>
#include<cmath>

using namespace std;

int main(){
	int n,sum;		
	int *a;
	while(cin>>n){
		a=new int[n];
		for(int i=0;i<n;i++)
			cin>>a[i];

		//找到最高分和最低分
		int m1=a[0],m2=a[0];
		sum=a[0];
		for(int i=1;i<n;i++){
			if(a[i]<m1) m1=a[i];
			if(a[i]>m2) m2=a[i];
			sum+=a[i];
		}
		sum=sum-m1-m2;
		printf("%.2f\n",sum*1.0/(n-2));
		
	}
	return 0;
}

2015 偶数求和(!)

在这里插入图片描述

#include<iostream>
#include<string>
#include<cstring>
#include<cmath>

using namespace std;

int main(){
	int n,m;	//n:数列的长度 m:每隔m个相加
	while(cin>>n>>m){
		int sum=0;
		for(int i=1;i<=n;i++){
			//处理n%m!=0的情况,即剩余不足m个的情况
			if((n-i)<n%m && n%m!=0){	//
				sum+=i*2;
				if(i==n){
					cout<<sum/(n%m)<<endl;
				}
				continue;		//因为是最后几个不足m个的数相加,因此下面的代码不需要再执行
			}
			if(i%m!=0){
				sum+=i*2;
			}
			else{
				sum+=i*2;
				if(i==n){
					cout<<sum/m<<endl;
				}
				else{
					cout<<sum/m<<" ";
				}
				sum=0;
			}
		}
		
	}
	return 0;
}

2016 数据的交换输出(x)

在这里插入图片描述

#include<iostream>
#include<string>
#include<cstring>
#include<cmath>

using namespace std;

int main(){
	int n;
	int *a;
	while(cin>>n && n!=0){
		a=new int[n];
		cin>>a[0];
		int j=0,min=a[0];
		for(int i=1;i<n;i++){
			cin>>a[i];
			if(a[i]<min){
				j=i;	//temp是最小的下标
				min=a[i];		//要把最小值重新赋给min!!!
			}
		}
		if(j!=0){
			int temp=a[0];
			a[0]=a[j];
			a[j]=temp;
		}
		for(int i=0;i<n-1;i++)
			cout<<a[i]<<" ";
		cout<<a[n-1]<<endl;
	}
	return 0;
}

2017 字符串统计

在这里插入图片描述

#include<iostream>
#include<string>
#include<cstring>
#include<cmath>

using namespace std;

int main(){
	int n;
	string s;
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>s;
		int sum=0;
		for(int j=0;j<s.size();j++){
			if(s[j]>='0' && s[j]<='9'){
				sum++;
			}
		}
		cout<<sum<<endl;
	}
	return 0;
}

2018 母牛的故事

在这里插入图片描述

123456
第一只母牛111111
第二年的牛1---11
第三年的母牛1---1
  • n<=4时,共n只

  • n=5时,共5+1只

  • n=6时,共6+2只(不对)

  • a[1]=1

  • a[2]=2

  • a[3]=3

  • a[4]=4

  • a[5]=6

  • a[6]=9

  • a[7]=

#include<iostream>
#include<string>
#include<cstring>
#include<cmath>

using namespace std;

int main(){
	int n;
	int a[60];
	a[1]=1;
	a[2]=2;
	a[3]=3;
	a[4]=4;
	for(int i=5;i<55;i++){
		a[i]=a[i-1]+a[i-3];
	}
	while(cin>>n && n!=0){
		cout<<a[n]<<endl;
	}
	
	
	return 0;
}

2019 数列有序!(类似插入排序)

在这里插入图片描述

#include<iostream>
#include<string>
#include<cstring>
#include<cmath>

using namespace std;

int main(){
	int n,m;
	int *a;
	while(cin>>n>>m){
		if(n==0 && m==0){
			break;
		}
		a=new int[n+1];
		for(int i=0;i<n;i++){
			cin>>a[i];	//n个有序的数列
		}
		int j;
		for(j=n-1;j>=0;--j){
			if(a[j]>m){
				a[j+1]=a[j];
			}
			else break;		//!!!
		}
		a[j+1]=m;
		for(int i=0;i<n;i++)
			cout<<a[i]<<" ";
		cout<<a[n]<<endl;
	}
	
	return 0;
}

2020 绝对值排序

在这里插入图片描述

#include<iostream>
#include<string>
#include<cstring>
#include<cmath>

using namespace std;

int main(){
	int n,m;
	int *a;
	while(cin>>n && n!=0){
		a=new int[n];
		for(int i=0;i<n;i++)
			cin>>a[i];
		//冒泡排序
		int flag=0;	//没有交换则退出
		for(int i=0;i<n-1;i++){
			for(int j=0;j<n-i-1;j++){
				if(abs(a[j])<abs(a[j+1])){
					int temp=a[j];
					a[j]=a[j+1];
					a[j+1]=temp;
					flag=1;
				}
			}
			if(flag==0) break;
		}
		for(int i=0;i<n-1;i++)
			cout<<a[i]<<" ";
		cout<<a[n-1]<<endl;
	}
	
	return 0;
}

2021 发工资咯:)

在这里插入图片描述

#include<iostream>
#include<string>
#include<cstring>
#include<cmath>

using namespace std;

void sum_n(int &a,int size,int &sum){
	if(a>=size){
		sum+=a/size;
		a=a-a/size*size;
	}
}
int main(){
	int n,a;
	while(cin>>n && n!=0){
		int sum=0;
		for(int i=0;i<n;i++){
			cin>>a;
			//100元,50元,10元,5元,2元,1元
			/*
			if(a>100){
				sum+=a/100;
				a=a-a/100*100;
			}
			*/
			sum_n(a,100,sum);
			sum_n(a,50,sum);
			sum_n(a,10,sum);
			sum_n(a,5,sum);
			sum_n(a,2,sum);
			sum_n(a,1,sum);
		}
		cout<<sum<<endl;
	}
	
	return 0;
}

2022 海选女主角(!)

在这里插入图片描述
主要是行号和列号。。。

#include<iostream>
#include<string>
#include<cstring>
#include<cmath>

using namespace std;

int main(){
	int n,m;
	int *a;
	while(cin>>n>>m){
		a=new int[n*m];
		cin>>a[0];
		int max=abs(a[0]);
		int x,y;
		for(int i=1;i<n*m;i++){
			cin>>a[i];
			if(abs(a[i])>max){
				max=abs(a[i]);
				if(i<m){
					x=0;
					y=i;
				}
				else{
					x=i/m;		//行号
					y=i-x*m;	//列号
				}
			}
		}
		cout<<x+1<<" "<<y+1<<" "<<a[x*m+y]<<endl;
	}
	
	return 0;
}

下面这段代码没通过。。。
在这里插入图片描述

#include<iostream>
#include<string>
#include<cstring>
#include<cmath>

using namespace std;

int main(){
	int n,m;
	int **a;
	while(cin>>n>>m){
		a=new int* [n];
		for(int i=0;i<m;i++)
			a[i]=new int[m];

		cin>>a[0][0];
		int x=0,y=0;
		int max=abs(a[0][0]);
		for(int i=0;i<n;++i){
			for(int j=0;j<m;++j){
				if(i!=0 || j!=0){
					cin>>a[i][j];
					if(abs(a[i][j])>max){
						max=abs(a[i][j]);
						x=i+1;	//行号
						y=j+1;	//列号
					}
				}
			}
		}
		cout<<x<<" "<<y<<" "<<a[x-1][y-1]<<endl;
		for(int i=0;i<m;i++)
			delete []a[i];

	}
	
	return 0;
}

2023 求平均成绩

在这里插入图片描述

#include<iostream>
#include<string>
#include<cstring>
#include<cmath>

using namespace std;

int main(){
	int n,m;
	int a[50][5];
	while(cin>>n>>m){
		for(int i=0;i<n;i++){
			for(int j=0;j<m;j++){
				cin>>a[i][j];
			}
		}

		//n个学生的平均成绩
		int sum_s;
		for(int i=0;i<n;i++){
			sum_s=0;
			for(int j=0;j<m;j++){
				sum_s+=a[i][j];
			}
			printf("%.2f",sum_s*1.0/m);
			if(i!=n-1)
				printf(" ");
			else
				printf("\n");

		}

		float *aver_c=new float[m];		//!!!平均值应该是浮点数
		//m门课的平均成绩
		int sum_c;
		for(int j=0;j<m;j++){
			sum_c=0;
			for(int i=0;i<n;i++)
				sum_c+=a[i][j];

			aver_c[j]=sum_c*1.0/n;

			printf("%.2f",sum_c*1.0/n);
			if(j!=m-1)
				printf(" ");
			else
				printf("\n");
		}

		//各科成绩均大于等于平均成绩的学生数量
		int sum=0,x=0;
		for(int i=0;i<n;i++){
			x=0;
			for(int j=0;j<m;j++){
				if(a[i][j]>=aver_c[j]) x++;
			}
			if(x==m) sum++;
		}
		cout<<sum<<endl<<endl;
	}
	
	return 0;
}

2024 C语言合法标识符(输入带空格的一行)

在这里插入图片描述

char c[50];
cin.getline(c,50);

#include<iostream>
#include<string>
#include<cstring>
#include<cmath>

using namespace std;

bool isLetter(char c){
	if((c>='A' && c<='Z') || (c>='a' && c<='z'))
		return true;
	return false;
}
/*c的合法标识符:
	1.标识符由字母(A-Z,a-z)、数字(0-9)、下划线“_”组成,
	2.并且首字符不能是数字,
	3.但可以是字母或者下划线
*/
int main(){
	int n;
	cin>>n;
	
	char str[50];
	
	getchar();
	for(int j=0;j<n;j++){
		//getchar();
		cin.getline(str,50);		输入的字符串含有空格

		if(isLetter(str[0]) || str[0]=='_'){
			int sum=1;
			for(int i=1;i<strlen(str);i++){
				if(isLetter(str[i]) || (str[i]>='0' && str[i]<='9') || str[i]=='_')
					sum++;
			}
			if(sum==strlen(str)) cout<<"yes"<<endl;
			else cout<<"no"<<endl;
		}
		else cout<<"no"<<endl;
		

	}
	
	return 0;
}

string s;
getline(cin,s);

#include<iostream>
#include<string>
#include<cstring>
#include<cmath>

using namespace std;

bool isLetter(char c){
	if((c>='A' && c<='Z') || (c>='a' && c<='z'))
		return true;
	return false;
}
/*c的合法标识符:
	1.标识符由字母(A-Z,a-z)、数字(0-9)、下划线“_”组成,
	2.并且首字符不能是数字,
	3.但可以是字母或者下划线
*/
int main(){
	int n;
	cin>>n;
	
	string str;
	
	getchar();
	for(int j=0;j<n;j++){
		//getchar();
		getline(cin,str);		输入的字符串含有空格

		if(isLetter(str[0]) || str[0]=='_'){
			int sum=1;
			for(int i=1;i<str.size();i++){
				if(isLetter(str[i]) || (str[i]>='0' && str[i]<='9') || str[i]=='_')
					sum++;
			}
			if(sum==str.size()) cout<<"yes"<<endl;
			else cout<<"no"<<endl;
		}
		else cout<<"no"<<endl;
		

	}
	
	return 0;
}

2025 查找最大元素

在这里插入图片描述

#include<iostream>
#include<string>
#include<cstring>
#include<cmath>

using namespace std;

bool isLetter(char c){
	if((c>='A' && c<='Z') || (c>='a' && c<='z'))
		return true;
	return false;
}
/*c的合法标识符:
	1.标识符由字母(A-Z,a-z)、数字(0-9)、下划线“_”组成,
	2.并且首字符不能是数字,
	3.但可以是字母或者下划线
*/
int main(){
	string s;
	while(cin>>s){	//由字母组成
		//先找到最大值
		char max=s[0];
		for(int i=1;i<s.size();i++){
			if(s[i]>max){
				max=s[i];
			}
		}
		for(int i=0;i<s.size();i++){
			cout<<s[i];
			if(s[i]==max)
				cout<<"(max)";
		}
		cout<<endl;
	}
	return 0;
}

2026 首字母变大写

在这里插入图片描述

#include<ctype.h>
toupper(char c);
tolower(char c);
#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<cctype>		//toupper()转大写字母函数

using namespace std;
int main(){
	string s;
	while(getline(cin,s)){	//由字母组成
		int temp=-1;	//标记空格的位置
		for(int i=0;i<s.size();i++){
			if(s[i]==' ') temp=i;
			else{	//不是空格,是空格的下一个
				if(i==temp+1){
					s[i]=toupper(s[i]);
				}
			}
		}
		cout<<s<<endl;
	}
	return 0;
}

自己写的转换大小写的方法

#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<cctype>		//toupper()转大写字母函数

using namespace std;

char toupper_0(char c){
	if(c>='A' && c<='Z')
		return c;
	else		//大小写asscii相差32
		return c-32;
}
int main(){
	string s;
	while(getline(cin,s)){	//由字母组成
		int temp=-1;	//标记空格的位置
		for(int i=0;i<s.size();i++){
			if(s[i]==' ') temp=i;
			else{	//不是空格,是空格的下一个
				if(i==temp+1){
					s[i]=toupper_0(s[i]);
				}
			}
		}
		cout<<s<<endl;
	}
	return 0;
}

2027 统计元音

在这里插入图片描述

#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<cctype>		//toupper()转大写字母函数

using namespace std;

int main(){
	int n;
	string s;
	cin>>n;
	getchar();	//!!!接收换行符!!!
	for(int i=0;i<n;++i){
		int sum[5]={0};
		getline(cin,s);
		for(int j=0;j<s.size();j++){
			switch (s[j]){
			case 'a':sum[0]++;break;	//break;不能忘
			case 'e':sum[1]++;break;
			case 'i':sum[2]++;break;
			case 'o':sum[3]++;break;
			case 'u':sum[4]++;break;
			}
		}
		cout<<"a:"<<sum[0]<<endl;
		cout<<"e:"<<sum[1]<<endl;
		cout<<"i:"<<sum[2]<<endl;
		cout<<"o:"<<sum[3]<<endl;
		cout<<"u:"<<sum[4]<<endl;
		if(i!=n-1)
			cout<<endl;
	}
	return 0;
}
#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<cctype>		//toupper()转大写字母函数

using namespace std;

int main(){
	int n;
	string s;
	cin>>n;
	getchar();	//!!!接收换行符!!!
	char c[5]={'a','e','i','o','u'};
	for(int i=0;i<n;++i){
		int sum[5]={0};
		getline(cin,s);
		for(int j=0;j<s.size();j++){
			switch (s[j]){
			case 'a':sum[0]++;break;
			case 'e':sum[1]++;break;
			case 'i':sum[2]++;break;
			case 'o':sum[3]++;break;
			case 'u':sum[4]++;break;
			}
		}
		for(int k=0;k<5;k++)
			cout<<c[k]<<":"<<sum[k]<<endl;
		
		if(i!=n-1)
			cout<<endl;
	}
	return 0;
}

2028 最小公倍数(!20211210)

在这里插入图片描述

#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<cctype>		//toupper()转大写字母函数

using namespace std;

long long gcd(long long x,long long y){
	//求x和y的最大公约数
	if(x%y==0) return y;
	return gcd(y,x%y);
}
int main(){
	long long n,a,min;
	while(cin>>n){
		long long min=1;
		for(long long i=0;i<n;i++){
			cin>>a;
			min=min*a/gcd(min,a);	//最小公倍数=2数成绩/最大公约数
		}
		cout<<min<<endl;
	}
	return 0;
}

https://blog.csdn.net/weixin_42673018/article/details/100179764
在这里插入图片描述

2029 反转字符串

在这里插入图片描述

  1. 重新建个string存储反转的字符串
#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<cctype>		//toupper()转大写字母函数

using namespace std;

int main(){
	int n;
	string s;
	cin>>n;
	for(int i=0;i<n;++i){
		cin>>s;
		//string s1=new string[s.size()]; //错误
		string s1=s;
		for(int j=0;j<s.size();j++)
			s1[j]=s1[s.size()-1-j];
		if(s1==s)
			cout<<"yes"<<endl;
		else
			cout<<"no"<<endl;
	}
	return 0;
}
  1. 收尾对应的相比较
#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<cctype>		//toupper()转大写字母函数

using namespace std;

int main(){
	int n;
	string s;
	cin>>n;
	for(int i=0;i<n;++i){
		cin>>s;
		int flag=1;	//2个比较的字符不等时为0
		for(int j=0;j<s.size()/2;j++){
			if(s[j]!=s[s.size()-1-j]) flag=0;
		}
		if(flag==1)
			cout<<"yes"<<endl;
		else
			cout<<"no"<<endl;
	}
	return 0;
}
  1. 使用函数,没试
    https://www.cnblogs.com/wkfvawl/p/9053011.html
    在这里插入图片描述

2030 汉字统计(!)

https://blog.csdn.net/qq_42025235/article/details/105558042
在这里插入图片描述

#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<cctype>		//toupper()转大写字母函数

using namespace std;

int main(){
	int n;
	string s;
	cin>>n;
	getchar();
	for(int i=0;i<n;++i){
		getline(cin,s);
		int sum=0;
		for(int j=0;j<s.size();j++){
			int a=s[j];
			if(a>=0 && a<=127) sum++;
		}
		cout<<(s.size()-sum)/2<<endl;
	}
	return 0;
}

比较asscii码没能行
在这里插入图片描述
原来是又把j写成了i
在这里插入图片描述
但是汉字占2个字节,所以要除以2


20211210

2032 杨辉三角(!)

在这里插入图片描述
试图用一维数组,没成功。。。

#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<cctype>		//toupper()转大写字母函数

using namespace std;

int main(){
	int n;
	int a[50][50];
	while(cin>>n){
		for(int i=1;i<=n;i++){	
			//每层
			for(int j=1;j<=i;j++){
				if(j<=i-1 && j>1){		//如果不是头和尾
					a[i][j]=a[i-1][j-1]+a[i-1][j];
				}
				else
					a[i][j]=1;
				
				cout<<a[i][j];
				if(j!=i)
					cout<<" ";
				else
					cout<<endl;
			}
		}
		cout<<endl;
	}

	return 0;
}

2040 亲和数

在这里插入图片描述

#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<cctype>		//toupper()转大写字母函数

using namespace std;

int sum_y(int n){	//计算1个数n的所有除他自身的约数之和
	int sum=1;
	for(int i=2;i*i<=n;i++){
		if(n%i==0)
			sum=sum+i+n/i;
	}
	return sum;
}

int main(){
	int M,a,b;
	cin>>M;
	for(int i=0;i<M;++i){
		cin>>a>>b;
		if((sum_y(a)==b) && (sum_y(b)==a)) cout<<"YES"<<endl;
		else cout<<"NO"<<endl;
	}

	return 0;
}

2042 老汉过路

在这里插入图片描述

#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<cctype>		//toupper()转大写字母函数

using namespace std;


int main(){
	int N,a;
	cin>>N;
	for(int i=0;i<N;++i){
		int sum=3;
		cin>>a;
		while(a>0){
			a--;
			sum=(sum-1)*2;
		}
		cout<<sum<<endl;
	}

	return 0;
}

2054 A == B ?(不是简单的比较)

在这里插入图片描述

string的find

string.find(),当找不到时,会返回一个很大的数
在这里插入图片描述
使用int pos=n.find('.')则查找失败会返回-1
在这里插入图片描述
https://blog.csdn.net/qq_38735931/article/details/82501503
在这里插入图片描述

#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<cctype>		//toupper()转大写字母函数

using namespace std;

string change(string n){
	//处理数中有小数点的情况,如3.0000,那么此时比较3.0000与3,则应输出yes
	int pos=n.find(".");
	//cout<<"‘.’的位置"<<pos<<endl;
	if(pos!=-1){
		int i;
		for(i=n.size()-1;i>pos && n[i]=='0';--i);
		if(n[i]=='.')
			n=n.substr(0,i);	//截取0-'.'之前的,不要'.'
		else
			n=n.substr(0,i+1);

	}
	return n;
}
int main(){
	string a,b;
	while(cin>>a>>b){
		string s1=change(a);
		string s2=change(b);
		if(s1==s2) cout<<"YES"<<endl;	//if(change(a)==change(b))会只执行change(b)?
		else cout<<"NO"<<endl;
	}

	return 0;
}

2055 An easy problem

在这里插入图片描述

#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<cctype>		//toupper()转大写字母函数

using namespace std;

int main(){
	int n,a,b;
	char c;
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>c>>a;
		if(c>='A' && c<='Z')
			b=c-'A'+1;
		else
			b='a'-c-1;
		cout<<a+b<<endl;
	}
	return 0;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值