相传古代印度国王舍罕要褒赏他的聪明能干的宰相达依尔 (国际象棋发明者),问他需要什么?
达依尔回答说:“国王只要在国际象棋的棋盘第一个格子里放一粒麦子,第二个格子里放两粒,第三个格子里放四粒,按此比例以后每一格加一倍,一直放到64格(国际象棋棋盘是8×8=64格),我就感恩不尽,其他的我什么也不要了。”
国王想:“这有多少,还不容易!”让人扛来一袋小麦,但不到一会儿全用没了,再来一袋很快又没有了,结果全印度的粮食全部用完还不够,国王纳闷,怎样也算不清这笔账,请你帮国王计算一下,放到第 n (1<= n <=64)格时,共需多少粒麦子,写出程序。
输入格式
输入一个小于等于64的正整数 n
输出格式
一个正整数,表示多少粒麦子
解析
- 题目有一个输入
- 第一格麦粒数为1,后面每格是第一格的2倍,或者说,第一格数量是20,后面每格是2i
- math.pow()结果是浮点数,计算量大时会有精度问题,在大整数运算中不要用这个函数
- 累加时,要先有一个初值为 0 的空容器
- 输出一个数,应放循环外
常见问题
- 比较运算符错,相等用 ==
import math
n = int(input())
1 <= n <= 64 # 此语句未赋值,未用于条件运算,无意义
for i in range(1,n):
if x = 2**(n-1) # 行末缺少冒号,相等比较用 ==
print(sum(x)) # sum()参数应为多个对象或一个可迭代对象,不能是一个整数
整数运算中用math.pow(2,a)转为浮点数,导致大数时出现误差
import math
a=int(input())
if 1 < a <= 64:
print(int((math.pow(2,a)))) # math.pow()结果是浮点数,数据大时会转科学计数法,引入误差
else:
if a <= 1:
print(int((math.pow(2,a-1))))
在循环中输出,导致得到多个输出
n=eval(input())
for n in range(1,64):
m=2**n
print(m)
f’{m:.0f}’math.pow(2,a)将整数转浮点数运算引入误差 ```python import math
n = eval(input()) m = 0 for i in range(0, n): a = 2 ** i m = m + a if n <= 64: print(f’{m:.0f}’) # 都是整数,没必要限制小数位数,大整数转浮点数后可能导致误差 else: breakpoint() # 这是什么用处呢? print(18446744073709551615)
18446744073709551615
print(f’{18446744073709551615:.0f}’)
18446744073709551616
5. 计算公式错,若直接用前n项和公式计算,结果应该输出2**n-1
```python
n=eval(input())
if n <= 64:
print(f"{2 ** (n-1)}",end=" ")
print()
- for语句缺少行末冒号,括号未封闭,sum()参数不能是一个整数
n = int(input())
for i in range(n) # SyntaxError: expected ':'
print((sum(i * i)) # SyntaxError: '(' was never closed
# TypeError: 'int' object is not iterable
a = int(input())
for n in range(0, a + 1):
print(sum(2 ** n)) # TypeError: 'int' object is not iterable