zl程序教程

您现在的位置是:首页 >  其他

当前栏目

22-23(2)第2次线上赛

2023-04-18 15:51:07 时间

日期-2

跳转链接: 3971:日期-2

要点

  • 数组存储每个月对应天数
  • 闰年的判断条件:能被400整除或者能被4整除不能被100整除
    闰年时二月份为29天,所以一年由365天变为366天

代码

#include<iostream>
#include<cstdio>

using namespace std;

int main()
{
	int n;
	scanf("%d",&n);
	
	//数组存储月份对应的天数 
	int mm[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
	while(n--)
	{
		int y,m,r;
		scanf("%d%d%d",&y,&m,&r);
		
		if(y%400==0&&y%3200!=0||y%4==0&&y%100!=0) //是闰年
		{
			mm[2]=29;
			printf("%d %d
",366,mm[m]);
		}
		else
		{
			mm[2]=28;
			printf("%d %d
",365,mm[m]);
		}
	}
	return 0;
}

星号阵列-24

跳转链接: 3993:星号阵列-24

要点

  • a=1时是一个尴尬的点,所以干脆写入一个死循环,先打印后判断退出
  • 因子:能够整除a的整数(可以为负数),题目划定找到小于a的最大因子
    优化寻找最小因子b(这里因子都指大于0):
    应该从最小的开始找,因为b是a的因子,那么a/b也是a的因子,这题中因为a的值并不大用a--逐个寻找也可以,但是如果a的数值很大就需要这种优化来提升运行速度了

代码

#include<iostream>
#include<cstdio>

using namespace std;

int main()
{
	int n;
	scanf("%d",&n);
	
	while(n--)
	{
		int a;
		scanf("%d",&a);
		
		while(true) //死循环 
		{
			for(int i=0;i<a;i++) printf("*");
			puts("");
			
			if(a==1) break; //退出 
			
			int b; //因子 
			for(b=2;b*b<=a;b++)
				if(a%b==0) break;
			if(a%b==0) a=a/b;
			else a=1;
		}
	}
	return 0;
}

名字和成绩

跳转链接: 4027:名字和成绩

要点

  • sort函数自定义排序
  • 扩展:也可以用变量记录更新状态即可

代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>

using namespace std;

typedef pair<string,int> PII; //typedef别名声明

bool mycmp(PII& p1,PII& p2) //自定义排序,取地址避免拷贝速度更快
{
	return p1.second>p2.second;
}

int main()
{
	vector<PII> vec;
	for(int i=0;i<5;i++)
	{
		string name;
		int score;
		cin>>name>>score;
		vec.push_back({name,score});
	}	
	
	sort(vec.begin(),vec.end(),mycmp);
	
	cout<<vec[2].first<<" "<<vec[2].second<<endl;
	
	return 0;
} 

0和1

跳转链接:4024:0和1

要点

  1. 常用函数to_string位于头文件<string>中,可以将数值转换成字符串,in、long、double都可以
  2. 常用函数find查找子串
  • find返回的是unsigned int无符号正数类型,>=0判断无论如何都会成立。find是无符号>=右边的0也是无符号,而find找不到时返回的是unsigned int最大值,所以>=0判断永远成立

  • 由此我们应该使用-1来判断,这样就会将unsigned int转换成有符号整数

  • 等价于-1写法:string::npos。npos可以表示string结束位置,即find函数在找不到指定值得情况下会返回string::npos

if (s.find("01") !=string::npos|| s.find("10") != string::npos) puts("Yes");
//或者下面这种写法
if (s.find("01") ==string::npos && s.find("10") == string::npos) puts("No");

代码

#include<iostream>
#include<cstdio>
#include<string>

using namespace std;

int main()
{
	int n;
	scanf("%d", &n);
	while (n--)
	{
		int a, b;
		scanf("%d%d", &a, &b);
		string s = to_string(a + b);

		if (s.find("01") !=string::npos|| s.find("10") != string::npos)
			puts("Yes");
		else
			puts("No");
	}

	return 0;
}

方法二:字符串流

通过字符串流不仅可以将数值转换为字符串,也可以将字符串转换为数值

#include<iostream>
#include<cstdio>
#include <sstream> //stringstream头文件

using namespace std;

int main()
{
	int n;
	scanf("%d",&n);
	
	while(n--)
	{
		int a,b;
		scanf("%d%d",&a,&b);
		
		string str;
		stringstream ss; //字符串流 
		ss<<a+b;
		ss>>str;
		
		if(str.find("01")!=-1||str.find("10")!=-1) puts("Yes");
		else puts("No");
	}
	return 0;
}