1. 级数求和
已知:
S n = 1 + 1 2 + 1 3 + … + 1 n S_n= 1+\frac{1}{2}+\frac{1}{3}+…+\frac{1}{n} Sn=1+21+31+…+n1
显然对于任意一个整数 k,当 n 足够大的时候,Sn > k。现给出一个整数 k(1 ≤ k ≤ 15),要求计算出一个最小的 n,使得 Sn> k。
输入格式
一个正整数 k。
输出格式
一个正整数 n。
输入 #1
1
输出 #1
2
k = int(input())
sum = 1
i = 1
while sum <= k:
i += 1
sum += 1 / i
print(i)
2. 陶陶摘苹果
陶陶家的院子里有一棵苹果树,每到秋天树上就会结出
10
个苹果。苹果成熟的时候,陶陶就会跑去摘苹果。陶陶有个30
厘米高的板凳,当她不能直接用手摘到苹果的时候,就会踩到板凳上再试试。现在已知 10 个苹果到地面的高度,以及陶陶把手伸直的时候能够达到的最大高度,请帮陶陶算一下她能够摘到的苹果的数目。假设她碰到苹果,苹果就会掉下来。
输入格式
输入包括两行数据。第一行包含 10 个 100 到 200 之间(包括 100 和 200)的整数(以厘米为单位)分别表示 10 个苹果到地面的高度,两个相邻的整数之间用一个空格隔开。第二行只包括一个 100 到 120 之间(包含 100 和 120 )的整数(以厘米为单位),表示陶陶把手伸直的时候能够达到的最大高度。
输出格式
输出包括一行,这一行只包含一个整数,表示陶陶能够摘到的苹果的数目。
样例输入 #1
100 200 150 140 129 134 167 198 200 111 110
样例输出 #1
5
height = [int(i) for i in input().strip().split()]
max_height = int(input())
count = 0
for h in height:
if h <= max_height + 30:
count += 1
print(count)
3. 明明的随机数
明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了 N 个 1 到 1000 之间的随机整数 (N ≤100),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作。
输入格式
输入有两行,第 1 行为 1 个正整数,表示所生成的随机数的个数 N。
第 2 行有 N 个用空格隔开的正整数,为所产生的随机数。
输出格式
输出也是两行,第 1 行为 1 个正整数 M,表示不相同的随机数的个数。
第 2 行为 M 个用空格隔开的正整数,为从小到大排好序的不相同的随机数。
样例输入 #1
10 20 40 32 67 40 20 89 300 400 15
样例输出 #1
8 15 20 32 40 67 89 300 400
#include <stdio.h>
int main()
{
int i, j, n;
int k = 0;
int temp;
scanf("%d", &n);
int a[n];
int b[n];
for (i=0; i<n; i++)
{
scanf("%d", &a[i]);
}
// 对数组进行排序
for (i=0; i< n-1; i++)
{
for (j = 0; j<n-1-i; j++)
{
if(a[j] > a[j+1])
{
temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
}
// for (i=0; i<n; i++)
// {
// printf("%d ", a[i]);
// }
//
// printf("\n");
// 实现“去重”
for (i=0; i < n; i++)
{
if (i>=0 && i<n-1)
{
if(a[i] < a[i+1])
{
if (b[k-1] != a[i])
b[k++] = a[i];
}
}
else{
if (a[i] > a[i-1])
{
b[k++] = a[i];
}
}
}
printf("%d\n", k);
for (i=0; i<k; i++)
{
if (i != k-1)
printf("%d ", b[i]);
else
printf("%d", b[i]);
}
return 0;
}
4. Peter的烟
Peter 有 n 根烟,他每吸完一根烟就把烟蒂保存起来,k(k>1)个烟蒂可以换一个新的烟,那么 Peter 最终能吸到多少根烟呢?
吸烟有害健康。
输入格式
每组测试数据一行包括两个整数 n, k(1 < n, k ≤ 108)。
输出格式
对于每组测试数据,输出一行包括一个整数表示最终烟的根数。
样例输入 #1
4 3
样例输出 #1
5
样例输入 #2
10 3
样例输出 #2
14
#include <stdio.h>
int main()
{
int n, k;
scanf("%d %d", &n, &k);
int count = n, temp = n;
while (temp / k) // 判断是否可以继续换烟
{
count += temp / k;
temp = temp / k + temp % k; // 换到的烟加上剩余的烟蒂
}
printf("%d", count);
return 0;
}
5. 子数整数
对于一个五位数a1a2a3a4a5,可将其拆分为三个子数:
sub1 = a1a2a3
sub2 = a2a3a4
sub3 = a3a4a5
例如,五位数20207可以拆分成
sub1=202
sub2=020(=20)
sub3=207
现在给定一个正整数K(0<K<1000),要求你编程求出10000到30000之间的三个子数sub1、sub2和sub3都可被K整除的五位数。
输入格式
一个正整数K
输出格式
每一行为一个满足条件的五位数,要求从小到大输出。不得重复输出或遗漏。如果无解,则输出“No”。
样例输入 #1
15
样例输出 #1
22555 25555 28555 30000
k = int(input().strip())
numbers = []
for num in range(10000, 30001):
str_num = str(num)
# print(str_num)
num1 = int(str_num[0:3])
num2 = int(str_num[1:4])
num3 = int(str_num[2:])
# 判断3个子数是否都能被k整除
if (num1 % k == 0) and (num2 % k == 0) and (num3 % k == 0):
numbers.append(num)
if len(numbers) == 0:
print('No')
else:
for num in numbers:
print(num)
6. 数字统计
请统计某个给定范围[L, R]的所有整数中,数字 2 出现的次数。
比如给定范围[2, 22],数字 2 在数 2 中出现了 1 次,在数 12 中出现 1 次,在数 20 中出现 1 次,在数 21 中出现 1 次,在数 22 中出现 2 次,所以数字2 在该范围内一共出现了 6次。
输入格式
2个正整数 L 和 R(1 ≤ L ≤ R ≤ 105),之间用一个空格隔开。
输出格式
数字 2 出现的次数。
样例输入 #1
2 22
样例输出 #1
6
样例输入 #2
2 100
样例输出 #2
20
#include <stdio.h>
int main()
{
int l, r;
scanf("%d %d", &l, &r);
int count = 0;
for (int i=l; i<=r; i++)
{
int temp = i;
while (temp != 0)
{
if (temp % 10 == 2)
count++;
temp /= 10;
}
}
printf("%d", count);
return 0;
}
7. 你的飞碟在这里
写一个程序,通过小组名和彗星名来决定这个小组是否能被那颗彗星后面的 UFO 带走。
小组名和彗星名都以下列方式转换成一个数字:最终的数字就是名字中所有字母的积,其中 A 是 1,Z 是 26。例如,USACO 小组就是 :
21 × 19 × 1 × 3 × 15 = 17955 21 \times 19 \times 1 \times 3 \times 15=17955 21×19×1×3×15=17955
如果小组的数字 mod 47 等于彗星的数字 mod 47,你就得告诉这个小组需要准备好被带走!(记住“a mod b”是 a 除以 b 的余数,例如 34 mod 10 等于 4)写出一个程序,读入彗星名和小组名并算出用上面的方案能否将两个名字搭配起来,如果能搭配,就输出
GO
,否则输出STAY
。小组名和彗星名均是没有空格或标点的一串大写字母(不超过 6 个字母)。输入格式
第1行:一个长度为 1 到 6 的大写字母串,表示彗星的名字。
第2行:一个长度为 1 到 6 的大写字母串,表示队伍的名字。
样例输入 #1
COMETQ HVNGAT
样例输出 #1
GO
样例输入 #2
ABSTAR USACO
样例输出 #2
STAY
#include <stdio.h>
#include <string.h>
int cal_name(char arr[])
{
int len = strlen(arr);
int ans = 1;
for (int i=0; i< len; i++)
{
ans *= arr[i] - 'A' + 1;
}
return ans % 47;
}
int main()
{
char group[7], star[7];
scanf("%s", star);
scanf("%s", group);
if (cal_name(group) == cal_name(star))
printf("GO");
else
printf("STAY");
return 0;
}
8. 数字反转
给定一个整数 N (-109 ≤ N ≤ 109),请将该数各个位上数字反转得到一个新数。新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零。
输入格式
一个整数 N。
输出格式
一个整数,表示反转后的新数。
样例输入 #1
123
样例输出 #1
321
样例输入 #2
-380
样例输出 #2
-83
n = input().strip()
ch = '-' if int(n) < 0 else ''
n = n[1:] if int(n) < 0 else n
print(f'{ch}{int(n[::-1])}')
9. 小玉买文具
班主任给小玉一个任务,到文具店里买尽量多的签字笔。已知一支签字笔的价格是 1 元 9 角,而班主任给小玉的钱是 a 元 b 角,小玉想知道,她最多能买多少支签字笔呢。
输入格式
输入只有一行两个整数,分别表示 a 和 b (0 ≤ a ≤ 104,0 ≤ b ≤ 9)。
输出格式
输出一行一个整数,表示小玉最多能买多少支签字笔。
样例输入 #1
10 3
样例输出 #1
5
a, b = map(int, input().strip().split())
price = 19 # 一支笔的价钱
money = a * 10 + b # 将手上的钱单位转为角
pen = money // price
print(pen)
10. 小玉家的电费
夏天到了,各家各户的用电量都增加了许多,相应的电费也交的更多了。小玉家今天收到了一份电费通知单。小玉看到上面写:
据闽价电 [2006]27 号规定,
- 月用电量在
150 千瓦时及以下部分
按每千瓦时0.4463
元执行,- 月用电量在
151~ 400 千瓦时的部分
按每千瓦时0.4663
元执行,- 月用电量在
401 千瓦时及以上部分
按每千瓦时0.5663
元执行;
小玉想自己验证一下,电费通知单上应交电费的数目到底是否正确呢。请编写一个程序,已知用电总计,根据电价规定,计算出应交的电费应该是多少。输入格式
输入一个正整数,表示用电总计(单位以千瓦时计),不超过 10000。
输出格式
输出一个数,保留到小数点后 1 位(单位以元计,保留到小数点后 1 位)。
样例输入 #1
267
样例输出 #1
121.5
#include <stdio.h>
int main()
{
int n;
scanf("%d", &n);
float bill;
if (n <= 150)
{
bill = n * 0.4463;
}
else if (n <= 400)
{
bill = 150 * 0.4463 + (n - 150) * 0.4663;
}
else {
bill = 150 * 0.4463 + 250 * 0.4663 + (n - 400) * 0.5663;
}
printf("%.1f", bill);
return 0;
}
11. 小玉在游泳
已知小玉第一步能游 2 米,可是随着越来越累,力气越来越小,她接下来的每一步都只能游出上一步距离的 98%。现在小玉想知道,如果要游到距离 x 米的地方,需要游多少步。
输入格式
输入一个实数 s(0 ≤ s ≤ 100,且 s 小数点后最多只有一位。单位:米),表示要游的目标距离。
输出格式
输出一个整数,表示小玉一共需要游多少步。
样例输入 #1
4.3
样例输出 #1
3
#include <stdio.h>
int main()
{
float s;
scanf("%f", &s);
float distance = 2;
float count = 2;
int step = 1;
while (count < s)
{
distance = distance * 0.98;
count += distance;
step++;
}
printf("%d", step);
return 0;
}
12. 小鱼的航程
有一小鱼,它平日每天游泳 250 公里,周末休息(实行
双休
日),假设从周 x 开始算起,过了 n 天以后,小鱼一共累计游泳了多少公里呢?输入格式
输入两个正整数 x,n(1≤ x ≤ 7,1 ≤ n ≤ 106),表示从周 x 算起,经过 n 天。
输出格式
输出一个整数,表示小鱼累计游泳了多少公里。
样例输入 #1
3 10
样例输出 #1
2000
#include <stdio.h>
int main()
{
int x, n, i, count;
scanf("%d %d", &x, &n);
count = 0;
for (i=x; i<x+n; i++)
{
if ((i % 7 == 6) || (i % 7 == 0))
continue;
else
count += 250;
}
printf("%d", count);
return 0;
}
13. 小鱼的游泳时间
小鱼给自己的游泳时间做了精确的计时(本题中的计时都按
24 小时制
计算),它发现自己从 a 时 b 分一直游泳到当天的 c 时 d 分,请你帮小鱼计算一下,它这天一共游了多少时间呢?输入格式
一行内输入 4 个整数,以空格隔开,分别表示题目中的 a, b, c, d。(0 ≤ a,c ≤ 24,0 ≤ b, d ≤ 60,且结束时间一定晚于开始时间。)
输出格式
一行内输出 2 个整数 e 和 f,用空格间隔,依次表示小鱼这天一共游了多少小时多少分钟。其中表示分钟的整数 f 应该小于 60。
样例 #1
样例输入 #1
12 50 19 10
样例输出 #1
6 20
#include <stdio.h>
int main()
{
int a, b, c, d;
scanf("%d %d %d %d", &a, &b, &c, &d);
int start, end;
start = a * 60 + b; // 转为分钟
end = c * 60 + d; // 转为分钟
int hour = (end - start) / 60; // 小时
int minute = end - start - hour * 60; // 分钟
printf("%d %d", hour, minute);
return 0;
}
14. 小鱼的数字游戏
小鱼最近被要求参加一个数字游戏,要求它把看到的一串数字 ai(长度不一定,以 0 结束),记住了然后反着念出来(表示结束的数字 0 就不要念出来了)。
输入格式
一行内输入一串整数,以 0 结束,以空格间隔。(0 ≤ ai ≤ 231−1,数字个数不超过 100。)
输出格式
一行内倒着输出这一串整数,以空格间隔。
样例输入 #1
3 65 23 5 34 1 30 0
样例输出 #1
30 1 34 5 23 65 3
#include <stdio.h>
int main()
{
int arr[100];
int num, i=0;
while(scanf("%d", &num) != EOF && num)
{
arr[i++] = num;
}
for (int j=i-1; j>=0; j--)
{
if (j != 0)
printf("%d ", arr[j]);
else
printf("%d", arr[j]);
}
return 0;
}
15. 小鱼比可爱
小鱼最近参加了一个“比可爱”比赛,比的是每只鱼的可爱程度。参赛的鱼被从左到右排成一排,头都朝向左边,然后每只鱼会得到一个整数数值,表示这只鱼的可爱程度,很显然整数越大,表示这只鱼越可爱,而且任意两只鱼的可爱程度可能一样。由于所有的鱼头都朝向左边,所以每只鱼只能看见在它左边的鱼的可爱程度,它们心里都在计算,在自己的眼力范围内有多少只鱼不如自己可爱呢。请你帮这些可爱但是鱼脑不够用的小鱼们计算一下。
输入格式
第一行输入一个正整数 n(1≤ n ≤ 100),表示鱼的数目。
第二行内输入 n 个正整数,用空格间隔,依次表示从左到右每只小鱼的可爱程度 ai(0 ≤ ai ≤ 10)。
输出格式
一行,输出 n 个整数,用空格间隔,依次表示每只小鱼眼中有多少只鱼不如自己可爱。
样例输入 #1
6 4 3 0 5 1 2
样例输出 #1
0 0 0 3 1 2
#include <stdio.h>
int main()
{
int n;
scanf("%d", &n);
int arr[n];
for (int i=0; i<n; i++)
{
scanf("%d", &arr[i]);
}
int arr2[n];
arr2[0] = 0;
int count;
// 从第2条鱼开始,只和前面的鱼进行比较
for (int i=1; i<n; i++)
{
count = 0;
for (int j=0; j<i; j++)
{
if (arr[j] <arr[i])
count ++;
}
arr2[i] = count;
}
for (int i=0; i<n; i++)
{
if (i != n-1)
printf("%d ", arr2[i]);
else
printf("%d", arr2[i]);
}
return 0;
}