解题思路:我们枚举出前30个数的时候,发现第31个数已经超出了10的6次方,那么这后面的数全部都要修改,所以我们就不管30个以后的数了,我们的关注点就放在这30个。 然后我们发现,以下的式子都符合斐波那契数列的定义:
互相为倍数关系 1:1 1 2 3 5
2:2 2 4 6 10 3:3 3 6 9 15 则可以设计字典录入每层中有多少数,进行动态解题 循环每到一个数则对数取余看是否满足倍数关系,在对数取整存入 字典,最后利用数组长度减去倍数层最多的数,可得到需要修改的数。
注意事项: get函数的使用 --- 用在字典处
dict.get(key, default=None)
解释:
key:字典中要查找的键
default:键不存在时要返回的默认值,若不提供,则返回None
参考代码:
n = int(input()) # 接收数组长度
a = list(map(int, input().split())) # 输入的要修改的数组
nums = [1, 1]
for i in range(1, 29):
nums.append(nums[i - 1] + nums[i]) # 枚举出前30个斐波那契数列
r = [] # 接收nums / a 的倍率
for i in range(min(len(a), len(nums))):
r.append(nums[i] / a[i])
res = 0 # 统计数目 符合的数
di = {} # 建立一个字典,以分层不同的倍率层
for j in r:
di[j] = di.get(j, 0) + 1 # 不断增加个数
res = max(di[j], res) #符合数目最多的那个
print(len(a) - res) # 减去倍率层中数目最多的那个 就是最小要修改的数
0.0分
1 人评分
如果还是看不懂,就这样 n = int(input()) # 接收数组长度 a = list(map(int, input().split())) # 输入的要修改的数组 nums = [1, 1] for i in range(1, 29): nums.append(nums[i - 1] + nums[i]) # 枚举出前30个斐波那契数列 r = [] # 接收nums / a 的倍率 for i in range(min(len(a), len(nums))): r.append(nums[i] / a[i]) print(r) res = 0 # 统计数目 符合的数 di = {} # 建立一个字典,以分层不同的倍率层 for j in r: di[j] = di.get(j, 0) + 1 # 不断增加个数 res = max(di[j], res) #符合数目最多的那个 print(di,res) print(len(a) - res) # 减去倍率层中数目最多的那个 就是最小要修改的数 在编译器上自己输入数据多测试几次,慢慢地看这个输出的结果,感悟一下
C二级辅导-统计字符 (C语言代码)浏览:577 |
C语言训练-最大数问题 (C语言代码)浏览:648 |
多输入输出练习1 (C语言代码)浏览:1219 |
C语言程序设计教程(第三版)课后习题9.10 (C语言代码)浏览:583 |
【明明的随机数】 (C语言代码)浏览:845 |
C语言程序设计教程(第三版)课后习题10.1 (C语言代码)浏览:585 |
C语言程序设计教程(第三版)课后习题5.4 (C语言代码)浏览:903 |
排序算法(选择,插入,冒泡)浏览:876 |
C语言程序设计教程(第三版)课后习题7.3 (C语言代码)浏览:420 |
2004年秋浙江省计算机等级考试二级C 编程题(1) (C语言代码)浏览:617 |
amani 2024-03-07 20:33:34 |
代码没看懂啥意思,解析看懂了,写出来了哈哈哈