【Python 百炼成钢】 小学生算术、阶乘的精确值、孪生素数、6174问题

简介: 【Python 百炼成钢】 小学生算术、阶乘的精确值、孪生素数、6174问题

前言🍀


今天给大家分享一下刷到的关于数值处理的算法题。虽然题目比较简单但是问题的处理方式值得我们学习。小学生算术涉及到加法进位、阶乘精确值用于计算一个结果为很长的数、孪生素数是计算两个相邻的素数(比较简单)、6174问题按照题目进行模拟就可以。


小学生算术🗽


🗽问题描述


最近很多小学生迎来了快学第一考,在进行加法进位的时候可把小学生难为坏了

因为进位的时候稍不注意就会算错。请你设计一个程序,实现计算两位数相加的时候需要

进行多少次进位,以供小学生检验自己是否正确的进位。(以0 0 结尾)

样例输入:

123 456

555 555

123 594

0 0

样例输出:0

3

1


🗽问题分析


可以设置一个标志位在进行计算的时候判断两个数是否需要进位,

如果进位了就将进位的标志位数值设为1,不进就将标志位数值设为0

因为在加法运算中进位最多进1。9+9=18,将8留下来将1进向更高位参与运算


🗽代码实现


老规矩先上运行结果:


6c57dcae06b547e0a1cf5a3ebe830a8e.png


再上代码:


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
————————————————
版权声明:本文为CSDN博主「酷尔。」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/apple_51931783/article/details/123244862


🐳问题分析


很长很长的计算结果对于Python语言而言不会有太大影响,因为Pyhton会根据电脑内存的大小决定整型的大小。而对于C\C++这样的语言而言,数值型都有一定的长度。超过一定长度发生溢出之后将会影响最终的结果。这一个题目我们需要使用数组进行计算结果的存储,然后自己模拟乘法运算。最终得到计算结果。


🐳代码实现


老规矩先上运行结果:


f20605b64fc1450cbec90ad286093a2b.png


上代码:

在这里使用了两种方式,一种是直接计算,另一种就是使用C语言风格进行模拟乘法。

由于Python内置模块较为强大直接计算超级方便还可以计算出很长的数,只需要很少的时间

(如下图)但是我们今天为自己找事情做,就使用Pyhton语言模拟一下C语言的写法。


即便计算10000的阶乘花费的时间依旧不到秒

ba7105d2268b4ca782242cf390195270.png

88f27bbfe70145a791cff223d1b9d812.png

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的数是不是素数。

如果两个都是的话直接进行输出,否则继续判断。


🛸代码实现


老规矩先上运行结果:


1fcf372fbe1f449697c76474175aabcf.png


上代码:


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


🎱问题分析


涉及到对数值中的数字进行排序

排序完后使用大的减去小的,然后对比生成的结果与原来的数。


🎱代码实现


老规矩先上运行结果:


76d28352429d401da212303b8fe6bab3.png


上代码:


# 自定义排序函数,如果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="")


这就是今天分享的全部内容啦!实现并不难但是思想非常的重要。希望大家能熟练掌握。

相关文章
|
6月前
|
Python
435: 素数的求解(python)
435: 素数的求解(python)
|
6月前
|
算法 Python
Python判断素数
Python判断素数
|
6月前
|
Python
利用Python判断一个数是否为素数
利用Python判断一个数是否为素数
154 0
|
6月前
|
机器学习/深度学习 人工智能 算法
【代数学作业1完整版-python实现GNFS一般数域筛】构造特定的整系数不可约多项式:涉及素数、模运算和优化问题
【代数学作业1完整版-python实现GNFS一般数域筛】构造特定的整系数不可约多项式:涉及素数、模运算和优化问题
125 0
|
6月前
|
机器学习/深度学习 人工智能 算法
【代数学作业1-python实现GNFS一般数域筛】构造特定的整系数不可约多项式:涉及素数、模运算和优化问题
【代数学作业1-python实现GNFS一般数域筛】构造特定的整系数不可约多项式:涉及素数、模运算和优化问题
118 0
|
3月前
|
Python
掌握Python算术与反算术精髓,解锁编程新境界,轻松驾驭数值计算,让每一行代码都精准无误!
【8月更文挑战第22天】Python中的算术运算符如加(+)、减(-)、乘(*)、除(/)、整除(//)、取模(%)及幂运算(**)是数值计算的基础,简化了编程过程并使代码更直观。例如,可以轻松计算矩形的面积与周长。而所谓的“反算术”操作,如取反(使用负号-)和求绝对值,则能进一步处理数值结果。这些运算符是编程中不可或缺的工具,帮助我们高效且清晰地解决问题。
31 0
|
6月前
|
机器学习/深度学习 Python 算法
最新【Python 百练成钢】时间调整、二进制数、回文素数、字母距离(1),2024年最新2024年阿里Python岗面试必问
最新【Python 百练成钢】时间调整、二进制数、回文素数、字母距离(1),2024年最新2024年阿里Python岗面试必问
最新【Python 百练成钢】时间调整、二进制数、回文素数、字母距离(1),2024年最新2024年阿里Python岗面试必问
|
2月前
|
Python
Python实现200以内的乘法算术题
Python实现200以内的乘法算术题
|
5月前
|
Python
【Python 训练营】N_6 求素数
【Python 训练营】N_6 求素数
25 0
|
6月前
|
Python
【Python 百练成钢】高精度加法、阶乘计算、矩阵幂运算、矩阵面积交
【Python 百练成钢】高精度加法、阶乘计算、矩阵幂运算、矩阵面积交