相传古代印度国王舍罕要褒赏他的聪明能干的宰相达依尔 (国际象棋发明者),问他需要什么?‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬
达依尔回答说:“国王只要在国际象棋的棋盘第一个格子里放一粒麦子,第二个格子里放两粒,第三个格子里放四粒,按此比例以后每一格加一倍,一直放到64格(国际象棋棋盘是8×8=64格),我就感恩不尽,其他的我什么也不要了。”‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬
国王想:“这有多少,还不容易!”让人扛来一袋小麦,但不到一会儿全用没了,再来一袋很快又没有了,结果全印度的粮食全部用完还不够,国王纳闷,怎样也算不清这笔账,请你帮国王计算一下,放到第 n (1<= n <=64)格时,共需多少粒麦子,写出程序。‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬
输入格式‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬
输入一个小于等于64的正整数 n‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬
输出格式‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬
一个正整数,表示多少粒麦子

解析

  1. 题目有一个输入
  2. 第一格麦粒数为1,后面每格是第一格的2倍,或者说,第一格数量是20,后面每格是2i
  3. math.pow()结果是浮点数,计算量大时会有精度问题,在大整数运算中不要用这个函数
  4. 累加时,要先有一个初值为 0 的空容器
  5. 输出一个数,应放循环外

常见问题

  1. 比较运算符错,相等用 ==

image.png

  1. import math
  2. n = int(input())
  3. 1 <= n <= 64 # 此语句未赋值,未用于条件运算,无意义
  4. for i in range(1,n):
  5. if x = 2**(n-1) # 行末缺少冒号,相等比较用 ==
  6. print(sum(x)) # sum()参数应为多个对象或一个可迭代对象,不能是一个整数
  1. 整数运算中用math.pow(2,a)转为浮点数,导致大数时出现误差

    1. import math
    2. a=int(input())
    3. if 1 < a <= 64:
    4. print(int((math.pow(2,a)))) # math.pow()结果是浮点数,数据大时会转科学计数法,引入误差
    5. else:
    6. if a <= 1:
    7. print(int((math.pow(2,a-1))))
  2. 在循环中输出,导致得到多个输出

    1. n=eval(input())
    2. for n in range(1,64):
    3. m=2**n
    4. print(m)
  3. 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()
  1. for语句缺少行末冒号,括号未封闭,sum()参数不能是一个整数

image.png

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