上机第一次训练 || 入门题

1. 判断是否是闰年

链接:判断是否是闰年
题目描述:

输入一个年份,判断这一年是否是闰年,如果是输出 1,否则输出 0。

代码:

#include<iostream>
using namespace std;
int main() {
	// 闰年:要求能被 4整除,不能被100整除, 或者是能被400整除
	int year;
	cin>>year;
	if((year%100!=0 && year%4==0) || year%400==0) {
		cout<<1<<endl;
	} else {
		cout<<0<<endl;
	}
	return 0;
}

2. 分类平均

链接:分类平均
题目描述

给定 n n n k k k,将从 1 到 n n n 之间的所有正整数可以分为两类:A 类数可以被 k k k 整除(也就是说是 k k k 的倍数),而 B 类数不能。请输出这两类数的平均数,精确到小数点后 1 1 1 位,用空格隔开。

数据保证两类数的个数都不会是 0 0 0

输入格式

输入两个正整数 n n n k k k

输出格式

输出一行,两个实数,分别表示 A 类数与 B 类数的平均数。精确到小数点后一位。

样例输入

100 16

样例输出

56.0 50.1

题解:

  1. 注意整数转小数运算的时候要*1.0,会自动进行类型转换,从int 转为float

  2. 输出精确到小数点后一位。用C语言的输出printf
    printf("%.1f %.1f",averageA,averageB);

    补充:
    printf("%10.1f ",x);
    整数10表示输出总共10位,如果不够10位,前面补空格,小数点后数字表示保留几位小数。

代码:

#include<iostream>
using namespace std;
int main() {
	int n,k;
	cin>>n>>k;
	int countk = 0,count2 = 0; // 记录可以被k整除的数有几个,或者不可以被k整除的数有几个
	int sum1 = 0,sum2 = 0; //记录两类数的总和
	for(int i=1; i<=n; i++){
		if(i%k==0){
			countk++;
			sum1 += i;
		}else{
			count2++;
			sum2+=i;
		}
	}
	double averageA = 1.0*sum1/countk;
	double averageB = 1.0*sum2/count2;
	printf("%.1f %.1f",averageA,averageB); //用C语言输出,小数点精确到后一位 
	return 0;
}

3. 陶陶摘苹果

题目链接

题目描述

陶陶家的院子里有一棵苹果树,每到秋天树上就会结出 10 10 10 个苹果。苹果成熟的时候,陶陶就会跑去摘苹果。陶陶有个 30 30 30 厘米高的板凳,当她不能直接用手摘到苹果的时候,就会踩到板凳上再试试。

现在已知 10 10 10 个苹果到地面的高度,以及陶陶把手伸直的时候能够达到的最大高度,请帮陶陶算一下她能够摘到的苹果的数目。假设她碰到苹果,苹果就会掉下来。

输入格式

输入包括两行数据。第一行包含 10 10 10 100 100 100 200 200 200 之间(包括 100 100 100 200 200 200)的整数(以厘米为单位)分别表示 10 10 10 个苹果到地面的高度,两个相邻的整数之间用一个空格隔开。第二行只包括一个 100 100 100 120 120 120 之间(包含 100 100 100 120 120 120)的整数(以厘米为单位),表示陶陶把手伸直的时候能够达到的最大高度。

输出格式

输出包括一行,这一行只包含一个整数,表示陶陶能够摘到的苹果的数目。

样例 #1

样例输入 #1

100 200 150 140 129 134 167 198 200 111
110

样例输出 #1

5

思路:
先读入数据,然后再判断if(height[i] <= H + 30)s++;即可。
代码:

#include<iostream>
using namespace std;
int main() {
	int arr[10];
	for(int i=0; i<10; i++){
		cin>>arr[i];
	}
	int limit;
	cin>>limit;
	limit=limit+30; // 只要苹果高度<=手能够到的最高高度即可 
	int count=0; // 能摘到的个数 
	for(int i=0; i<10; i++){
		if(arr[i]<=limit){
			count++;
		}
	}
	cout<<count<<endl;
}

5.开关灯

题目链接
题目:

假设有N盏灯(N为不大于5000的正整数),从1到N按顺序依次编号,初始时全部处于开启状态;有M个人(M为不大于N的正整数)也从1到M依次编号。
第一个人(1号)将灯全部关闭,第二个人 (2号)将编号为2的倍数的灯打开,第三个人(3号)将编号为3的倍数的灯做相反处理(即,将打开的灯关闭,将关闭的灯T打开)。依照编号递增顺序,以后的人都和3号一样,将凡是自己编号倍数的灯做相反处理。
请问:当第M个人操作之后,哪几盏灯是关闭的,按从小到大输出其编号,其间用逗号间隔。

输入格式:
输入正整数N和M,以单个空格隔开,M< N。

输出格式:
顺次输出关闭的灯的编号,其间用逗号间隔。

题解:

  1. 1变0,0变1的两种方法:
    • 第一种: a = (a + 1) % 2;
    • 第二种:和1异或a=a ^ 1;
  2. 输出数据用逗号隔开,最后一个数据后面没有逗号:
    可以将最后要的答案加到vector里面,然后再对钱n-1个数据输出并添加逗号,最后一个数据单独输出,不加逗号。

代码:

#include<iostream>
#include<vector>>
using namespace std;
int main() {
	int n,m;
	cin>>n>>m;
	// 开启状态为1,关闭为0,做相反的处理用:和 1异或来实现
	int arr[5000]= {0}; // 第一个人将灯全部关闭
	for(int i=2; i<=m; i++) {
		int k=i; // 倍数为i,每个人第一个数是k, 
		while(k<=n) {
			arr[k]=arr[k]^1;
			k+=i;
		}
	}
	// 最后一个数不输出逗号:用vector来存储元素,这样不用记录有几个
	 vector<int> ans;
	 
	for(int i=1; i<=n;i++) {
		if(arr[i]==0) {
			ans.push_back(i);
		}
	}
	for(int i=0; i<ans.size()-1;i++) {
		cout<<ans[i]<<",";
	}
	// 输出最后一个,不带逗号
	cout<<ans[ans.size()-1]; 
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值