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.0,会自动进行类型转换,从int 转为float
-
输出精确到小数点后一位。用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变0,0变1的两种方法:
- 第一种: a = (a + 1) % 2;
- 第二种:和1异或a=a ^ 1;
- 输出数据用逗号隔开,最后一个数据后面没有逗号:
可以将最后要的答案加到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;
}