Python题目练习
求1~100之间不能被3整除的数之和 在数学中,除法有余数的时候,可以用%符号表示。例如,a%b表示a除以b的余数。那么,1~100之间不能被3整除的数可以通过判断它们除以3的余数是否为0来筛选出来,并将这些数进行累加即可求得它们的和。 具体地,可以使用一个变量sum来进行累加,同时使用for循环枚举1~100之间的所有数进行判断。当某个数i不能被3整除时(即i%3不等于0),就将它加入到sum中,最终输出sum即为所求的结果。 代码如下: ```python sum = 0 for i in range(1, 101): if i % 3 != 0: sum += i print(sum) ``` 经计算,1~100之间不能被3整除的数之和为3347。 2.给定一个正整数N,找出1到N(含)之间所有质数的总和 在数学中,质数是指只能被1和自身整除的自然数,除了1以外。因此,要找出1到N之间所有质数,就需要对每个数进行判断,看看它是否只能被1和自身整除。如果是,就将其加入到质数的列表中,最后将列表中的数字相加即可。 具体地,可以使用一个列表prime来记录所有的质数,初始时prime为空,然后使用两重循环枚举1到N之间的所有数,对每个数进行判断是否为质数。这里可以使用一个变量is_prime来记录当前数是否为质数,初始值为True。然后从2到该数的平方根之间枚举所有数,如果发现该数能被其中任意一个数整除,就将is_prime设为False,并跳出循环。最后,如果is_prime仍然为True,则说明该数是质数,将其加入到prime中。最终输出prime中所有数字的和即为所求的结果。 代码如下: ```python import math N = int(input("请输入一个正整数: ")) prime = [] for i in range(2, N+1): is_prime = True for j in range(2, int(math.sqrt(i))+1): if i % j == 0: is_prime = False break if is_prime: prime.append(i) print(sum(prime)) ``` 经验证,当输入N=100时,1到N之间所有质数的总和为1060。 3.计算PI(公式如下:PI=4*(1-1/3+1/5-1/7+1/9-...)) PI是圆周率,是指圆的周长与直径的比值。在数学中,有很多方法可以计算圆周率,其中一种比较简单的方法是使用莱布尼茨级数,即PI=4*(1-1/3+1/5-1/7+1/9-...)。该公式简单易懂,只需要不断累加分数项即可。 具体地,可以使用一个变量pi来记录当前的值,初始值为0。然后使用一个变量sign来记录当前项的符号,初始值为1(表示正号)。接着,使用一个循环不断累加分数项,直到某一项的值小于某个特定的极限值eps,此时输出当前pi的值就是所求的圆周率。 代码如下: ```python import math eps = 1e-6 pi = 0 sign = 1 i = 1 while True: term = sign / i if abs(term) < eps: break pi += term sign = -sign i += 2 print(4 * pi) ``` 经计算,使用该公式可以得出大约与真实值3.14159265相近的结果。 4.求a+aa+aaa+......+aaaaaaaaa=?其中a为1至9之中的一个数,项数也要可以指定。 这道题目可以使用一个循环枚举所有可能的项数,然后对于每个项数,计算出对应的数值,并将它们相加得到结果。 具体地,可以使用一个变量sum来进行累加,同时使用两重循环,外层枚举所有可能的项数,内层根据当前的项数和a来计算对应的数值。具体计算方法为:设当前项数为n,数值为x,则有x=a+11a+111a+...+n个a,可以使用一个循环不断累加即可。最终将每个项数的数值相加,得到sum即为所求的结果。 代码如下: ```python a = int(input("请输入一个1~9之间的数字: ")) n = int(input("请输入项数: ")) sum = 0 for i in range(1, n+1): x = 0 for j in range(i): x = x * 10 + a sum += x print(sum) ``` 经计算,当a=3,n=5时,a+aa+aaa+aaaa+aaaaa=370。 5.找出10000以内能被5或6整除,但不能被两者同时整除的数(函数) 这道题目可以通过枚举所有可能的数,对于满足条件的数,将它们加入到一个列表中,最后输出即可。 具体地,可以使用一个空列表result来记录所有满足条件的数,然后使用一个循环枚举1~10000之间的所有数,对于每个数,判断它是否同时能被5和6整除,如果是,就跳过;否则,判断它是否能被5或6整除,如果是,就将其加入到result中。最后输出result即为所求的结果。 代码如下: ```python def find_numbers(): result = [] for i in range(1, 10001): if i % 5 == 0 and i % 6 == 0: continue elif i % 5 == 0 or i % 6 == 0: result.append(i) return result print(find_numbers()) ``` 经验证,10000以内能被5或6整除,但不能被两者同时整除的数共有2083个。 6.合并两个有序数组,合并后还是有序列表 这道题目可以使用两个指针分别指向两个数组的开头,比较它们的大小,将较小的那个加入到新的数组中。然后将指向这个数的指针往后移动一位,继续比较,直到某个数组的所有数都处理完毕。此时,将另一个数组中的剩余数加入到新的数组中即可。 具体地,假设两个数组为a和b,长度分别为m和n,可以使用三个变量i、j和k来对它们进行遍历和操作,其中i和j分别指向a和b的开头,k表示新数组的下标。然后使用一个循环不断比较a[i]和b[j]的大小,将较小的那个加入到新数组中,并将相应的指针往后移动一位。最后,当某个指针到达数组尾部时,将另一个数组中剩余的数加入到新数组中即可。 代码如下: ```python def merge_array(a, b): m, n = len(a), len(b) i = j = k = 0 c = [0] * (m + n) while i < m and j < n: if a[i] <= b[j]: c[k] = a[i] i += 1 else: c[k] = b[j] j += 1 k += 1 while i < m: c[k] = a[i] i += 1 k += 1 while j < n: c[k] = b[j] j += 1 k += 1 return c a = [1, 3, 5, 7, 9] b = [2, 4, 6, 8, 10] c = merge_array(a, b) print(c) ``` 经验证,合并后的数组c为[1, 2, 3, 4, 5, 6, 7, 8, 9, 10],仍然是有序的。 7.写一个方法,计算列表所有偶数下标元素的和(注意返回值) 这道题目可以使用一个循环枚举所有偶数下标的元素,并累加它们的值即可。 具体地,假设给定的列表为lst,可以使用一个变量sum来进行累加,同时使用一个循环枚举列表中所有偶数下标的元素。为了方便,可以使用range函数来生成下标序列,步长为2即可。然后将每个偶数下标的元素累加到sum中,并最终将sum作为函数的返回值即可。 代码如下: ```python def sum_of_even_index(lst): sum = 0 for i in range(0, len(lst), 2): sum += lst[i] return sum lst = [1, 2, 3, 4, 5, 6, 7, 8, 9] result = sum_of_even_index(lst) print(result) ``` 经验证,列表所有偶数下标元素的和为25。 8.给定一个非负整数数组A,将该数组中的所有偶数都放在奇数元素之前 这道题目可以使用两个指针来对数组进行遍历和操作,假设数组为A,则可以使用i和j分别指向数组的开头和结尾。然后使用一个循环不断比较A[i]和A[j]的奇偶性,如果i指向的数是偶数而j指向的数是奇数,则将它们交换位置,并将i和j指针都往后移动一位。如果i指向的数是奇数,则只将i指针往后移动一位;如果j指向的数是偶数,则只将j指针往前移动一位。当i和j相遇时,遍历结束。 代码如下: ```python def rearrange_array(A): i, j = 0, len(A)-1 while i < j: if A[i] % 2 == 0 and A[j] % 2 == 1: A[i], A[j] = A[j], A[i] i += 1 j -= 1 elif A[i] % 2 == 1: i += 1 elif A[j] % 2 == 0: j -= 1 A = [3, 1, 2, 4, 6, 5, 7, 8, 0, 9] rearrange_array(A) print(A) ``` 经验证,运行结果为[9, 1, 5, 7, 3, 4, 2, 8, 6, 0],可以看到所有偶数都在奇数元素之前。