Python真题案例之小学算术 阶乘精确值 孪生素数 6174问题详解
作者:酷尔。
前言
今天给大家分享一下刷到的关于数值处理的算法题。虽然题目比较简单但是问题的处理方式值得我们学习。小学生算术涉及到加法进位、阶乘精确值用于计算一个结果为很长的数、孪生素数是计算两个相邻的素数(比较简单)、6174问题按照题目进行模拟就可以。
小学生算术
问题描述
最近很多小学生迎来了快学第一考,在进行加法进位的时候可把小学生难为坏了 因为进位的时候稍不注意就会算错。请你设计一个程序,实现计算两位数相加的时候需要 进行多少次进位,以供小学生检验自己是否正确的进位。(以0 0 结尾)
样例输入:
123 456
555 555
123 594
0 0
样例输出:
0
3
1
问题分析
可以设置一个标志位在进行计算的时候判断两个数是否需要进位, 如果进位了就将进位的标志位数值设为1,不进就将标志位数值设为0,因为在加法运算中进位最多进1。9+9=18,将8留下来将1进向更高位参与运算
代码实现
老规矩先上运行结果:
再上代码:
import sys flag=0 lis=[] num=0 while True: m,n=sys.stdin.readline().strip().split() m,n=int(m),int(n) if n==m==0: break # 只要m,n经过变换有一个为0那么循环就终止 while m and n: if (m%10+n%10+flag)>=10: num+=1 flag=1 else: flag=0 m//=10 n//=10 lis.append(num) num=0 for i in lis: print(i)
阶乘精确值
问题描述
众所周知,Python数值型的位数与电脑内存有关。可以很轻松实现n的阶乘 ,但是对于C、C++而言整型的位数是有一定长度的。超过一定长度就会溢出,输入不超过1000的正整数n,输出n!=1234…*n的精确结果。
样例输入:
30
样例输出:
265252859812191058636308480000000
问题分析
很长很长的计算结果对于Python语言而言不会有太大影响,因为Pyhton会根据电脑内存的大小决定整型的大小。而对于C\C++这样的语言而言,数值型都有一定的长度。超过一定长度发生溢出之后将会影响最终的结果。这一个题目我们需要使用数组进行计算结果的存储,然后自己模拟乘法运算。最终得到计算结果。
代码实现
老规矩先上运行结果:
上代码: 在这里使用了两种方式,一种是直接计算,另一种就是使用C语言风格进行模拟乘法。 由于Python内置模块较为强大直接计算超级方便还可以计算出很长的数,只需要很少的时间 (如下图)但是我们今天为自己找事情做,就使用Pyhton语言模拟一下C语言的写法。
即便计算10000的阶乘花费的时间依旧不到秒
import time def timmer(func): def weapper(*s): start=time.time() func(*s) end=time.time() print("用时:",end-start) return weapper @timmer def f1(n): # 直接计算 ans=1 # 用于标记现在是所在的位数 if n==0 or n==1: print(1) exit() else: for i in range(2,n+1): ans=ans*i print(ans) @timmer def f2(n): # C语言方法精确计算 ans=[0]*1000 ans[0]=1 for i in range(2,n+1): j=0 c=0 while j<1000: temp=ans[j]*i+c ans[j]=temp%10 c=temp//10 j+=1 i=len(ans)-1 flag=True while i>=0: if flag and ans[i]==0: pass else: print(ans[i],end="") flag=False i-=1 print() if __name__=="__main__": n=int(input()) # f1(n) f2(n)
孪生素数
问题描述
素数又称质数,他是只能被1与他本身整除的整数,并且大于1现给出一个数,比他小的孪生素数 孪生素数的意思就是连续挨着的两个素数,并且他的的差为2(即 n与n-2) 现在给出一个正整数,请计算出比他小但是距离他最近的两个孪生素数。
样例输入:
1000
样例输出:
881 883
问题分析
判断是不是孪生素数,首先要确定是不是素数。是的话再判断与其相差2的数是不是素数。 如果两个都是的话直接进行输出,否则继续判断。
代码实现
老规矩先上运行结果:
上代码:
def is_ok(num): if num==1: return False for i in range(2,int(math.sqrt(num))+1): if num%i==0: return False return True n=int(input()) while n: if is_ok(n) and is_ok(n-2): print(n-2,n) break n-=1
6174问题
问题描述
假设你有各位数字互不相同的四位数。将该数中的数字从大到小排序后得到a 从小到大排序后得到b,然后使用a-b得到的结果取代原来的数。并继续相同的操作。 任务:输入一个数n输出操作序列。直到出现循环,比如排序前的6174生成的结果也是6174
样例输入:
1234
样例输出:
1234—>3087—>8352—>6174—>6174
问题分析
涉及到对数值中的数字进行排序
排序完后使用大的减去小的,然后对比生成的结果与原来的数。
代码实现
老规矩先上运行结果:
上代码:
# 自定义排序函数,如果r=True就是降序 def msort(n,r=True): ans=0 temp=[] //将数值转换为列表 while n: temp.append(n%10) n//=10 #在刚刚进行排序的时候高位与低位进行了颠倒,再颠倒回来 temp=temp[::-1] #排序 temp=sorted(temp,reverse=r) # 将列表组合成数值并返回出去 for i in temp: ans=ans*10+i return ans ans=[] n=int(input()) ans.append(n) while True: # 得到最大最小值 maxn=msort(n) minn=msort(n,False) temp=maxn-minn ans.append(temp) if n==temp: break n=temp flag=True for i in ans: if flag: print(i,end="") flag=False else: print("--->",i,end="",sep="")
这就是今天分享的全部内容啦!实现并不难但是思想非常的重要。希望大家能熟练掌握。
ᴴᴬᵛᴱ ᴬ ᴳᴼᴼᴰ ᵀᴵᴹᴱฅʕ•̫͡•ʔฅ 🕺🏿🕺🏿⚰️🕺🏿🕺🏿
到此这篇关于Python真题案例之小学算术 阶乘精确值 孪生素数 6174问题详解的文章就介绍到这了,更多相关Python 阶乘精确值内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!