洛谷基础题练习1

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦里逆天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值