1005 继续(3n+1)猜想 (25 分)
卡拉兹(Callatz)猜想已经在1001中给出了描述。在这个题目里,情况稍微有些复杂。
当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记录下递推过程中遇到的每一个数。例如对 n=3 进行验证的时候,我们需要计算 3、5、8、4、2、1,则当我们对 n=5、8、4、2 进行验证的时候,就可以直接判定卡拉兹猜想的真伪,而不需要重复计算,因为这 4 个数已经在验证3的时候遇到过了,我们称 5、8、4、2 是被 3“覆盖”的数。我们称一个数列中的某个数 n 为“关键数”,如果 n 不能被数列中的其他数字所覆盖。
现在给定一系列待验证的数字,我们只需要验证其中的几个关键数,就可以不必再重复验证余下的数字。你的任务就是找出这些关键数字,并按从大到小的顺序输出它们。
输入格式:
每个测试输入包含 1 个测试用例,第 1 行给出一个正整数 K (<100),第 2 行给出 K 个互不相同的待验证的正整数 n (1<n≤100)的值,数字间用空格隔开。
输出格式:
每个测试用例的输出占一行,按从大到小的顺序输出关键数字。数字间用 1 个空格隔开,但一行中最后一个数字后没有空格。
输入样例:
6
3 5 6 7 8 11
结尾无空行
输出样例:
7 6
结尾无空行
思路:
创建一个字典,每当数字出现,就让字典对应值+1,最后统计出字典对应值为1的数
代码:
n = input()
L = list(map(int,input().split()))
D = dict.fromkeys(L,0)
for i in L:
while i != 1:
if i in D.keys():
D[i] = D[i] + 1
if i%2 == 0:
i = i//2
else:
i = (3*i+1)//2
out = []
for item in D.items(): # D.item()以列表形式输出(val,key)
if item[0] in L and item[1] == 1:
out.append(item[0])
out.sort(reverse = True)
for i in range(len(out)):
if i == len(out) - 1:
print(out[i],end ='')
else:
print(out[i],end = ' ' )
运行结果:
测试点 | 结果 | 分数 | 耗时 | 内存 |
---|---|---|---|---|
0 | 答案正确 |
15 | 14 ms | 3128 KB |
1 | 答案正确 |
2 | 16 ms | 3292 KB |
2 | 答案正确 |
2 | 14 ms | 3136 KB |
3 | 答案正确 |
3 | 15 ms | 3164 KB |
4 | 答案正确 |
3 | 15 ms | 3204 KB |
1006 换个格式输出整数 (15 分)
让我们用字母 B
来表示“百”、字母 S
表示“十”,用 12...n
来表示不为零的个位数字 n
(<10),换个格式来输出任一个不超过 3 位的正整数。例如 234
应该被输出为 BBSSS1234
,因为它有 2 个“百”、3 个“十”、以及个位的 4。
输入格式:
每个测试输入包含 1 个测试用例,给出正整数 n(<1000)。
输出格式:
每个测试用例的输出占一行,用规定的格式输出 n。
输入样例 1:
234
结尾无空行
输出样例 1:
BBSSS1234
结尾无空行
输入样例 2:
23
结尾无空行
输出样例 2:
SS123
结尾无空行
思路:
计算出输入值10,100,……的数量,再以字符串的形式相加获得输出。
代码:
n = int(input())
s = str('')
if n//100 != 0:
s = s + 'B'*(n//100)
n = n%100
else:
pass
if n//10 != 0:
s = s + 'S'*(n//10)
n = n%10
else:
pass
if n//10 == 0:
for i in range(1,n+1):
s = s + str(i)
print(s)
运行结果:
测试点 | 结果 | 分数 | 耗时 | 内存 |
---|---|---|---|---|
0 | 答案正确 |
4 | 16 ms | 3200 KB |
1 | 答案正确 |
4 | 19 ms | 3244 KB |
2 | 答案正确 |
1 | 17 ms | 3252 KB |
3 | 答案正确 |
1 | 15 ms | 3264 KB |
4 | 答案正确 |
1 | 17 ms | 3284 KB |
5 | 答案正确 |
1 | 16 ms | 3200 KB |
6 | 答案正确 |
1 | 15 ms | 3300 KB |
7 | 答案正确 |
1 | 16 ms | 3276 KB |
8 | 答案正确 |
1 | 16 ms | 3156 KB |
1007 素数对猜想 (20 分)
暂未写出
1008 数组元素循环右移问题 (20 分)
一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥0)个位置,即将A中的数据由(A0A1⋯AN−1)变换为(AN−M⋯AN−1A0A1⋯AN−M−1)(最后M个数循环移至最前面的M个位置)。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?
输入格式:
每个输入包含一个测试用例,第1行输入N(1≤N≤100)和M(≥0);第2行输入N个整数,之间用空格分隔。
输出格式:
在一行中输出循环右移M位以后的整数序列,之间用空格分隔,序列结尾不能有多余空格。
输入样例:
6 2
1 2 3 4 5 6
结尾无空行
输出样例:
5 6 1 2 3 4
结尾无空行
思路:
将输入转化为列表,删除列表最后M个元素后添加到列表开头
代码:
n,s = input().split()
n,s = int(n),int(s)
number_list = list(map(int,input().split()))
for i in range(s):
num = number_list.pop()
number_list.insert(0,num)
for i in range(n):
if i == len(number_list) - 1:
print(number_list[i],end = '')
else:
print(number_list[i],end = ' ')
运行结果:
测试点 | 结果 | 分数 | 耗时 | 内存 |
---|---|---|---|---|
0 | 答案正确 |
10 | 15 ms | 3264 KB |
1 | 答案正确 |
3 | 14 ms | 3136 KB |
2 | 答案正确 |
3 | 15 ms | 3256 KB |
3 | 答案正确 |
2 | 16 ms | 3264 KB |
4 | 答案正确 |
2 | 15 ms | 3268 KB |