Python真题案例之小学算术 阶乘精确值 孪生素数 6174问题详解

目录
  • 前言
  • 小学生算术
    • 问题描述
    • 问题分析
    • 代码实现
  • 阶乘精确值
    • 问题描述
    • 问题分析
    • 代码实现
  • 孪生素数
    • 问题描述
    • 问题分析
    • 代码实现
  • 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="")

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

ᴴᴬᵛᴱ ᴬ ᴳᴼᴼᴰ ᵀᴵᴹᴱฅʕ•̫͡•ʔฅ

(0)

相关推荐

  • python怎么判断素数

    质数(Prime number),又称素数,指在大于1的自然数中,除了1和该数自身外,无法被其他自然数整除的数(也可定义为只有1与该数本身两个因数的数). 那么想计算出一个随机数是不是质数用Python应该怎么写呢?首先第一句话肯定是接受用户输入的数字: n = int(input("please enter the number:")) 接着要计算该数是不是质数,那么就要从2开始一直除到该数之前的那个自然数,很明显是一个数字范围: for i in range(2, n): 在循环体

  • python如何求100以内的素数

    方法一,用for循环来实现 num=[]; i=2 for i in range(2,100): j=2 for j in range(2,i): if(i%j==0): break else: num.append(i) print(num) 方法二,用函数来实现 import math def func_get_prime(n): return filter(lambda x: not [x%i for i in range(2, int(math.sqrt(x))+1) if x%i ==

  • python计算数字或者数组的阶乘的实现

    今天写毕业设计的时候遇到了一个级数展开式,里面包含着一个求一个数组的阶乘运算,这里特来记录一下. # -*- coding:utf-8 -*- """ author: 15025 time: 2021/7/18 17:58 software: PyCharm Description: calculate factorial of a given number """ class PythonStudy: @staticmethod def fac

  • Python 阶乘详解

    相信大家对阶乘都不陌生.不知道阶乘的可以看这里: 一个数的阶乘: 比如5的阶乘 在python中大部分教程一般推荐用递归函数完成: #!/usr/bin/python3 """Python2,3都可以""" def factorial(n):#主体函数 if n == 1: return 1 return n * factorial(n-1) res = input("请输入n:") print(factorial(res))

  • Python真题案例之小学算术 阶乘精确值 孪生素数 6174问题详解

    目录 前言 小学生算术 问题描述 问题分析 代码实现 阶乘精确值 问题描述 问题分析 代码实现 孪生素数 问题描述 问题分析 代码实现 6174问题 问题描述 问题分析 代码实现 前言 今天给大家分享一下刷到的关于数值处理的算法题.虽然题目比较简单但是问题的处理方式值得我们学习.小学生算术涉及到加法进位.阶乘精确值用于计算一个结果为很长的数.孪生素数是计算两个相邻的素数(比较简单).6174问题按照题目进行模拟就可以. 小学生算术 问题描述 最近很多小学生迎来了快学第一考,在进行加法进位的时候可

  • Python真题案例之最长回文子串 周期串详解

    目录 一.最长回文子串 问题描述

  • Python真题案例之二分法查找详解

    目录 写在前面的话

  • python字典多键值及重复键值的使用方法(详解)

    在Python中使用字典,格式如下: dict={ key1:value1 , key2;value2 ...} 在实际访问字典值时的使用格式如下: dict[key] 多键值 字典的多键值形式如下: dict={(ke11,key12):value ,(key21,key22):value ...} 在实际访问字典里的值时的具体形式如下所示(以第一个键为例): dict[key11,key12] 或者是: dict[(key11,key12)] 以下是实际例子: 多值 在一个键值对应多个值时,

  • Appium+python自动化之连接模拟器并启动淘宝APP(超详解)

    简介 上一篇讲解完模拟器的安装.配置好以后,就好比我们手机已经买好,并且系统已经做好了,就差我们用数据线和电脑连接开始实战了,这篇宏哥就带着小伙伴们和童鞋们趁热打铁,讲解和分享一下如何连接模拟器(电脑版的虚拟手机),然后再安装一款APP-淘宝为例. 一.appium+pycharm+连接夜神模拟器并启动淘宝APP(推荐) 1.首先打开pycharm并写好代码,这里以淘宝APK作为测试Demo,淘宝APK我是放在电脑桌面(或者放置同代码同个目录下).如下图所示 其中|:driver = webdr

  • python编程之requests在网络请求中添加cookies参数方法详解

    哎,好久没有学习爬虫了,现在想要重新拾起来.发现之前学习爬虫有些粗糙,竟然连requests中添加cookies都没有掌握,惭愧.废话不宜多,直接上内容. 我们平时使用requests获取网络内容很简单,几行代码搞定了,例如: import requests res=requests.get("https://cloud.flyme.cn/browser/index.jsp") print res.content 你没有看错,真的只有三行代码.但是简单归简单,问题还是不少的. 首先,这

  • 对Python中DataFrame选择某列值为XX的行实例详解

    如下所示: #-*-coding:utf8-*- import pandas as pd all_data=pd.read_csv("E:/协和问答系统/SenLiu/熵测试数据.csv") #获取某一列值为xx的行的候选列数据 print(all_data) feature_data=all_data.iloc[:,[0,-1]][all_data[all_data.T.index[0]]=='青年'] print(feature_data) 实验结果如下: "C:\Pro

随机推荐