洛谷题单105【入门6】函数与结构体题解|部分

P5735 【深基7.例1】距离函数

题解:

给三点坐标,然后求出三点连接成的三角形的周长,也就是求这三条线每两条线之间的距离的和,数学题,直接计算即可。

代码如下:

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cmath>
#include<iomanip>
using namespace std;
double juli(double a,double b,double c,double d){
	double dis;
	dis=sqrt(pow(a-c,2)+pow(b-d,2));
	return dis;
}
int main(void){
	double x1,x2,x3,y1,y2,y3,sum;
	cin>>x1>>y1;
	cin>>x2>>y2;
	cin>>x3>>y3;
	sum=juli(x1,y1,x2,y2)+juli(x2,y2,x3,y3)+juli(x3,y3,x1,y1);
	cout<<fixed<<setprecision(2)<<sum;
}

P5736 【深基7.例2】质数筛

题解:

就是找出一列数中的质数。质数又称素数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数。就是如果遇到除了1和本身外还有能整除的数那就不是质数,根据这个规律从2开始遍历到自身即可。

我用的是稍微少一点时间复杂度的方法,一个数对于另一个的数的开方不能整除,则这一个数对另一个数本身也无法做到整除,减少了一半的时间复杂度。

其实质数筛还可以用另外一个更高级的欧拉筛法,通过公倍数来整除,想了解的可以自己搜索一下。

代码如下:

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cmath>
using namespace std;
bool zhishu(int x){
	if(x==1||x==0)return false;
	for(int i=2;i<=sqrt(x);i++){
		if(x%i==0)return false;
		
	}return true;
}
int main(void){
	int n;
	cin>>n;
	int arr[105];
	for(int i=0;i<n;i++){
		cin>>arr[i];
		if(zhishu(arr[i])){
			cout<<arr[i]<<" ";
		}
	}
	return 0;
}

P5737 【深基7.例3】闰年展示

题解:

用函数判断闰年,就是知道闰年判断方法即可;

普通年份:如果年份能被4整除但不能被100整除,则是闰年。例如,2004年是闰年,而1900年不是闰年。

世纪年份:如果年份是整百数,它必须能被400整除才是闰年。例如,2000年是闰年,但2100年不是闰年。

代码如下:

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cmath>
#include<iomanip>
using namespace std;
bool run(int k){
	if(k%4==0&&k%100!=0||k%400==0){
		return true;
	}
	else{
		return false;
	}
}
int main(void){
	int x,y,s=0;
	int a[3001]={0};
	cin>>x>>y;
	for(int i=x;i<=y;i++){
		if(run(i)){
			s++;
			a[i]++;
		}
	}
	cout<<s<<endl;
	int f=0;
	for(int j=1582;j<=3000;j++){
		if(a[j]!=0){
			f++;
			if(f>1){
				cout<<" ";
			}
			cout<<j;
			
		}
	}
}

P5738 【深基7.例4】歌唱比赛

题解:

这次代码写的比较详细,应该不用解释了,自己看就好了

代码如下:

#include<cstdlib>
#include<iostream>
#include<cmath>
#include<iomanip>
#include<algorithm>
using namespace std;
int main(void){
	int n,m;//定义
	double max=0;//首先把最大值设为int_min
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		double s[1000],sum=0;//临时数组记录本组内容
		for(int j=1;j<=m;j++){ //循环输入评委的for循环 
			cin>>s[j];   //输入每个成绩 
			sum+=s[j];   //每次把成绩累计求和 
		} 
		sort(s+1,s+m+1);//调用sort进行排序,默认为升序。 
		sum=sum-s[1]-s[m];//找到最大最小值,减去最大值和最小值
		sum/=(m-2);//注意平均分的时候要减去最大,最小值所以数量是m-2
		if(sum>max)max=sum;//这里比较大小,sum大把sum赋给MAX 
	} 
	cout<<fixed<<setprecision(2)<<max;//保留两位小数,输出结果
	return 0;//结束 
	
} 

P5739 【深基7.例7】计算阶乘

题解:

高中数学,知道阶乘怎么求就可以了。

代码如下:

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cmath>
#include<iomanip>
using namespace std;
int jie(int x){
	if(x==1){
		return 1;
	}
	else{
		return ((jie(x-1))*x);
	}
}
int main(){
	int n;
	cin>>n;
	int jie(int x);
	cout<<jie(n);
}

P5461 赦免战俘

这道题主要考的是找规律,就跟小学奥数题一样。

我们可以列出几种情况下的矩阵,逐一对比,总结规律。

首先发现将第一行只有最后一个是1,然后后面每一行,如果i行j列的上一行i-1行j列加上i-1行j+1列的和为1时候,i行j列也为1,如果和为2或0时候,i行j列相应的数为0,按照这个规律一步步遍历即可。

代码如下:

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cmath>
int arr[1025][1025];
using namespace std;
int main(void){
	int n;
	cin>>n;
	
	for(int k=0;k<pow(2,n);k++){
		if(k==(pow(2,n))-1){
			arr[0][k]=1;
		} else{
			arr[0][k]=0;
		}
		
	}
	for(int i=1;i<pow(2,n);i++){
		for(int j=0;j<pow(2,n);j++){
			if(arr[i-1][j]+arr[i-1][j+1]==1){
				arr[i][j]=1;
			}
			if(arr[i-1][j]+arr[i-1][j+1]==2||arr[i-1][j]+arr[i-1][j+1]==0){
				arr[i][j]=0;
			}
		}
	}
	for(int i=0;i<pow(2,n);i++){
		for(int j=0;j<pow(2,n);j++){
			if(j>0){
				cout<<" ";
			}
			cout<<arr[i][j];
			if(j==(pow(2,n))-1){
				cout<<endl;
			}
		}
	}
	return 0;
}

P5740 【深基7.例9】最厉害的学生

这个题其实可以用结构体,但鉴于大家还没学到可能,就开了五个数组来分别记录学生名字,第一科成绩,第二科成绩,第三科成绩,以及计算出来的总分。

我们直接读入,然后遍历,用一个值max去存储每一次,如果总分大于max,则max=总分,如果等于则不记录,因此,我们可以得到如果多个分数相同的情况下,第一次读到的最大分。

输出即可。

代码如下:

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<string>
using namespace std;
string name[1001];
int sum[1001],r1[1001],r2[1001],r3[1001];
int zong(int a,int b,int c){
	int s;
	s=a+b+c;
	return s;
}
int main(){
	int n;
	cin>>n;
	int zong(int a,int b,int c);
	for(int i=0;i<n;i++){
		cin>>name[i]>>r1[i]>>r2[i]>>r3[i];
		sum[i]=zong(r1[i],r2[i],r3[i]);
	}
	int max=sum[0],ans=0;
	for(int j=0;j<n;j++){
		if(sum[j]>max){
			max=sum[j];
			ans=j;
		}
	}
	cout<<name[ans]<<" "<<r1[ans]<<" "<<r2[ans]<<" "<<r3[ans];
	return 0;
}

P5741 【深基7.例10】旗鼓相当的对手 - 加强版

第一次看到这道题,大家可能会在思考怎么去用字典序排列,但是,其实不需要排序字典序,因为这道题已经说了它的给出的数据都是已经用字典序排列好的,所以我们可以直接遍历,然后发现符合“旗鼓相当的对手”的一组数据直接输出即可。

代码如下:

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cmath>
#include<cstring>
using namespace std;
string name[1005];
int a[1005],b[1005],c[1005];
int main(void){
	int n,i;
	cin>>n;
	for(i=0;i<n;i++){
		cin>>name[i]>>a[i]>>b[i]>>c[i];
	}
	for(int j=0;j<n-1;j++){
		for(int k=j+1;k<n;k++){
			if(a[j]-a[k]<=5&&a[j]-a[k]>=-5
&&b[j]-b[k]<=5&&b[j]-b[k]>=-5&&c[j]-c[k]<=5
&&c[j]-c[k]>=-5&&a[j]+b[j]+c[j]-a[k]-b[k]-c[k]<=10
&&a[j]+b[j]+c[j]-a[k]-b[k]-c[k]>=-10){
				cout<<name[j]<<" "<<name[k]<<endl;
			}
		}
	}
	return 0;
}

P5742 【深基7.例11】评等级

很简单的一道题,计算比较,满足条件则输出优秀,不满足条件则输出不优秀。

代码如下:

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cmath>
using namespace std;
int a[1005],b[1005],c[1005];
bool youxiu(int x,int y){
	if(x+y>140&&x*7+y*3>=800){
		return true;
	}else{
		return false;
	}
}
int main(void){
	int n;
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>a[i]>>b[i]>>c[i];
	}
	bool youxiu(int x,int y);
	for(int j=0;j<n;j++){
		if(youxiu(b[j],c[j])){
			cout<<"Excellent"<<endl;
		}
		else{
			cout<<"Not excellent"<<endl;
		}
	}
	return 0;
}

P1075 [NOIP2012 普及组] 质因数分解

找出最大的质因数,

因为数据范围达到2的九次方,数据范围很大,一个个慢慢循环去直接寻找最大质因数需要很长时间,占时间,容易,超时。

我们可以曲线救国,换个思路,数除以最小质因数=最大质因数。

也就是从2开始遍历,先找出最小的质因数,找到了就退出循环,n除以最小的质因数就能得到最大质因数了。

代码如下:

#include <iostream>
#include <cmath>
using namespace std;

int main() {
    int n, i;
    cin >> n;
    for (i=2; i<=sqrt(n); ++i)
        if (n % i == 0)
            break;
    cout << n / i << endl;
    return 0;
}

P1304 哥德巴赫猜想

题目意思就是把大于2到n的所有偶数的质数之和给写出来,也就是循环遍历2到这个数,找到第一个数和第二个数都是质数的输出即可,注意第一个数必须为两个数较小的数,第二个数为两个数中较大的数。

代码如下:

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<iomanip>
#include<cmath>
using namespace std; 
bool zhishu(int num){
	
	for(int i=2,I=sqrt(num);i<=I;i++){
		if(num%i==0)
		return 0;
	}	
	return 1;
} 
int main()
{
	int n;
	cin>>n;
	for(int i=2;i<n/2+1;i++){
		cout<<i*2<<'=';
		for(int j=2;j<i*2;j++){
			if(zhishu(j)){
				if(zhishu(i*2-j)){
					cout<<j<<'+'<<i*2-j<<endl;
					goto flag;
				}
			}
				
			
		}
		flag:;
	}
	
	
 } 

P1217 [USACO1.5] 回文质数 Prime Palindromes

写两个函数

一个判断是否是质数的函数,从2遍历到数的开方,能整除则不是质数。

一个判断是否是回文数的函数,先把小于0和两位数和两位数以上,个位数为0这些肯定不是回文数的去掉。然后定义一个数res,把x取反,也就是把上一次的数*10+x%10,x/=10。最后判断如果res==x,则是回文数,如果res!=x,就不是回文数。

写出这两个函数即可。

代码如下:

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cmath>
using namespace std;
bool zhishu(long long z){
	for(int q=2;q<=sqrt(z);q++){
		if(z%q==0){
			return false;
		}
	}
	return true;
}
bool huiwen(long long x){
	if(x<0||(x%10==0&&x!=0)){
		return false;
	}
	long long oldRes=x;
	long long res=0;
	while(x!=0){
		res=res*10+(x%10);
		x/=10;
	}
	if(res==oldRes){
		return true;
	}
	else{
		return false;
	}
}
int main(void){
	long long a,b;
	cin>>a>>b;
	bool zhishu(long long z);
	bool huiwen(long long x);
	for(int i=a;i<=b;i++){
		if(i==2){
			cout<<2<<endl;
		}
		if(i%2==1){
			if(huiwen(i)){
			if(zhishu(i)){
					cout<<i<<endl;
			}
		
		}
	}
		}
		
	return 0;
}

P2415 集合求和

先用数学角度,

两个数的集合,子集分别为,空集,2,3,{2,3},每个数都出现了两次,

三个数的集合,2,3,4,{2,3},{3,4},{2,4},{2,3,4},空集,每个数都出现了四次

一个数的集合,每个数出现了 一次 ,

总结规律:

那么每个数出现的次数就是2的n-1次方

那么所有子集之和是总数乘以2的n-1次方。 

代码如下:

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cmath> 
using namespace std;
//先用数学角度,两个数的集合,每个数都出现了两次,三个数的集合,每个数都出现了四次
//一个数的集合,每个数出现了 一次 ,那么每个数出现的次数就是2的n-1次方, 
//那么所有子集之和是总数乘以2的n-1次方 
int main(){
	int x;
	int n=0;
	long long sum=0;
	while(cin>>x){
		n++;
		sum+=x;
	} 
	sum*=pow(2,n-1);
	cout<<sum;
	return 0;
} 

P5743 【深基7.习8】猴子吃桃

递归思想;

知道天数,最后剩一个桃子,也知道规律,每天会吃桃子总数的一半多一个,所以,写方程即可。

代码如下:

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cmath>
using namespace std;
int tao(int m){
	if(m==1){
		return 1;
	}
	else if(m==2){
		return 4;
	}
	else{
		return (2*tao(m-1)+2);
	}
}
int main(void){
	long long x;
	int n;
	int tao(int m);
	cin>>n;
	cout<<tao(n);
	return 0;
}

P5744 【深基7.习9】培训

题目很简单,就是通过去年的成绩来计算今年的成绩,年龄加一,然后输出即可。用结构体或者数组都能完成这道题。

代码如下:

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cmath>
#include<cstring>
using namespace std;
string name[6];
int a[6],b[6];
int nian(int x){
	return (x+1);
}
int ceng(int y){
	y=y*(1.2);
	if(y>=600){
		return 600;
	}
	return y;
}
int main(){
	int nian(int x);
	int ceng(int y);
	int n;
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>name[i]>>a[i]>>b[i];
	}
	for(int j=0;j<n;j++){
		cout<<name[j]<<" "<<nian(a[j])<<" "<<ceng(b[j])<<endl;
	}
	return 0;
}

这里是红糖,记录我的小白进化史。希望能帮到你们,创作不易,如果觉得有帮助可以为我点个赞!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值