python_practice2(一些题目) practice1 1 2 3 4 5 6 7 8 9 10 从键盘读入一个数n,输出小于或等于n的所有素数的个数。 exampleinput :100 output:25 input :200 output:46
这个题目简单明了,是一个求小于等于它以内的素数个数,此时的逻辑应该是我们要定义一个函数先进行判断是否为素数,然后再用计数器用来计数即可。其实直接用
Crypto库里的isPrime函数直接一劳永逸。但这里我还是尝试手搓了一下函数。
1 2 3 4 5 6 7 8 9 10 11 12 n = int (input ())def isprime (n ): for i in range (2 ,n): if n % i == 0 : return False return True isprime(n) count =0 for j in range (2 ,n+1 ): if isprime(j) == True : count +=1 print (count)
practice2 1 从键盘输入一个正整数n,输出小于n的所有与其互素的数的个数。(即求(n)的值)。例如:与10 互素的数为:9 ,7 ,3 ,1 一共4 个。
这个题目明显是欧拉函数,如果在sage里面可以直接用euler_phi的函数,那么这里面我们需要在明白欧拉函数后再进行写,这里不做赘述。直接上代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 n = int (input ())def euler_phi (n ): result = n p = 2 while (p * p <= n): if (n % p == 0 ): while (n % p == 0 ): n //= p result -= result // p p += 1 if (n > 1 ): result -= result // n print (result) euler_phi(n)
practice3 1 2 3 4 5 6 7 8 9 10 11 从键盘接受一个正整数n,生成一个由1 ~n的数组。输出一个数组,数组中的每个元素为与前面数组中小于自身的互素的数的个数。 example:input :10 output: [0 , 1 , 2 , 2 , 4 , 2 , 6 , 4 , 6 , 4 ]input :20 output: [0 , 1 , 2 , 2 , 4 , 2 , 6 , 4 , 6 , 4 , 10 , 4 , 12 , 6 , 8 , 8 , 16 , 6 , 18 , 8 ]
生成1-n的数组 开始的时候我们可以用列表解析对我们平常写的代码进行一个优化:
基本语法:
1 2 [expression for iter_val in iterable] [expression for iter_val in iterable if cond_expr]
该优化可以在列表解析,筛选条件,嵌套循环,字典解析,集合解析中进行使用。
例如1-n我们可以用i for i in range(n+1)。
回到这道题目上面,因为要判断互质我们可以自己手搓一个gcd函数,也可以用math库里的gcd函数。这里我直接用math库里的gcd函数进行书写。然后通过挨个的互质判断确定个数。因为你这里要考虑到挨个进行比大小,所以一个循环是不够的我们可以考虑循环嵌套(就是大循环所在的数与自己前面的所有数进行互质判断)
1 2 3 4 5 6 7 8 9 10 11 import math n = int (input ()) l1 = [i for i in range (1 , n+1 )] l2 = []for i in range (1 , n+1 ): count = 0 for j in range (1 , i): if math.gcd(l1[i-1 ], l1[j-1 ]) == 1 : count += 1 l2.append(count)print (l2)
practice4
这个题目很明显是循环。而且等腰三角形1,3,5,7……明显是一个等差数列,但是如果只是考虑等差数列的话会发现你会打印出来的是个直角三角形。仔细思考,发现空格也是等差数列排布,与*的等差数列是恰好相反的。所以我们就可以同时用一个循环进行打印,代码如下
1 2 3 4 5 n = int (input ())for i in range (1 , n + 1 ): spaces = ' ' * (n - i) stars = '*' * (2 * i - 1 ) print (spaces + stars)
practice 5
这里的菱形借用了上道等腰三角形的思路,以中间最长的那行为界限,我们很容易想到把上面的代码给逆回来进行逐级递减即可。代码实现如下
1 2 3 4 5 6 7 8 9 10 n = int (input ())for i in range (1 , n + 1 ): spaces = ' ' * (n - i) stars = '*' * (2 * i - 1 ) print (spaces + stars)for j in range (n-1 ,0 ,-1 ): spaces = ' ' *(n-j) stars = '*' *(2 *j-1 ) print (spaces+stars)
practice6 1 从键盘接收一个n ,用来确定数组包含的元素个数。并循环读入n 个数字字符,将其转换成int 型数据,存储在数组中。编写一个程序,让数组中,相邻的两位进行比较,并将比较大的数字交换到后面的位置,将数组中相邻的两位依次比较,确保经过一轮比较后,数组中最大的数字放在索引为n -1 的位置上。输出此时最大值在索引最大位置上的数组。
这个题目我们只需要根据题目的叙述来比较每个数与下个数进行比较,如果大于那么就直接进行交换位置。
1 2 3 4 5 6 7 8 n = int (input ()) l =[]for x in range (n): l.append(int (input ()))for i in range (n-1 ): if l[i] > l[i+1 ]: l[i],l[i+1 ] = l[i+1 ],l[i]print (l)
practice 7 1 从键盘接收一个n ,代表当前数组中包含的元素个数。依次从键盘读入n 个数据,并转换成int 型,保存在数组中。按照上题的方法整理数组中的元素,将数组中元素整理为从小到大有序的数组输出。(注:不允许使用内置的排序函数,或方法)
这个题目有限制,那么我们应该考虑的是将每个数都作比较,然后如果前面的数大于后面的数那么就可以进行交换位置。这样子便可以达到从小到大排序的效果了。
1 2 3 4 5 6 7 8 9 n = int (input ()) l =[]for x in range (n): l.append(int (input ()))for i in range (len (l)): for j in range (i,len (l)): if l[i] > l[j]: l[i],l[j] = l[j],l[i]print (l)
practice 8 1 从键盘接收一个m,代表二维数组的行数,再从键盘接收一个n,代表二维数组的列数。利用循环读入二维数组所有的数值,并转换为int 类型,存在数组中。输出该二维数组。
这个题目比较简单就直接在代码里呈现思路了
1 2 3 4 5 6 7 8 9 l = [] m = int (input ()) n = int (input ())for i in range (m): row = [] for j in range (n): row.append(int (input ())) l.append(row)print (l)