注册 登录
编程论坛 Python论坛

用Python判断质偶数

lambert1012 发布于 2022-06-30 15:20, 1389 次点击
最近听说有人想要一个能判断质偶数的python代码,我写了一个比较简单的IDLE的代码,欢迎借鉴或质疑
代码如下:
for i in range(100000000000000000000000000000):
    a=1
    b=0
    c=input('请输入一个数字:')
    c=int(c)
    for i in range(c):
        if c % a == 0:
            b += 1
        if a < c:
            a += 1
    if b > 2:
        print('这是一个合数')
    else:
        print('这是一个质数')

45 回复
#2
厨师王德榜2022-06-30 15:28
要加 检验代码,否则 用户输入 abc 时,程序就出错了
#3
lambert10122022-06-30 15:40
回复 2楼 厨师王德榜
谢谢
#4
yh31632022-07-03 18:42
借鉴了,万分感谢
#5
lambert10122022-07-05 09:05
回复 4楼 yh3163
没事
#6
yh31632022-07-10 17:23
回复 5楼 lambert1012
兄台加个好友
#7
往生2023-01-15 09:49
如果用户输入小数
程序就会有漏洞
可添加
c=input()
c=float(c)
if c==int(c):
#8
东海ECS2023-01-29 20:40
回复 7楼 往生
质数与合数一般是自然数(一般不包括0)

[此贴子已经被作者于2023-1-29 20:42编辑过]

#9
东海ECS2023-01-29 20:42
回复 楼主 lambert1012
这缩进太大了,一般要设置一下才可以.缩进默认一般是四个空格.
#10
ysr28572023-01-30 10:51
for i in range(100000000000000000000000000000):
...     a=1
...     b=0
...     c=input('请输入一个数字:')
...     c=int(c)
...     for i in range(c):
...         if c % a == 0:
...             b += 1
...         if a < c:
...             a += 1
...     if b > 2:
...         print('这是一个合数')
...     else:
...         print('这是一个质数')
...
请输入一个数字:123645
这是一个合数
请输入一个数字:11111
这是一个合数
请输入一个数字:14629
这是一个质数
请输入一个数字:2857
这是一个质数
请输入一个数字:142857
这是一个合数
请输入一个数字:9999997
这是一个合数
请输入一个数字:77777771
这是一个合数
请输入一个数字:127
这是一个质数
请输入一个数字:257
这是一个质数
请输入一个数字:481
这是一个合数
请输入一个数字:667
这是一个合数
请输入一个数字:9997
这是一个合数
请输入一个数字:9991
这是一个合数
请输入一个数字:

您的这个程序能运行,速度太慢,7位的数就明显变慢了,8位的更时间长,10位的简直和死机一样,等了很长时间没有显示结果只好关机了。
咋回事呢?

[此贴子已经被作者于2023-1-30 10:52编辑过]

#11
ysr28572023-01-31 09:09
为了提高速度改成如下这样行吗?
for i in range(100000000000000000000000000000):
    a=1
    b=0
    c=input('请输入一个数字:')
    c=val(c)
    for i in range(c):
        if c % a == 0:
            b += 1
        if a < c:
            a += 1
    if b > 2:
        print('这是一个合数')
    else:
        print('这是一个质数')
#12
ysr28572023-01-31 09:14
改成这样试试:
for i in range(100000000000000000000000000000):
    a=1
    b=0
    c=input('请输入一个数字:')
    c=int(c)
    d=c**0.5
    e=int(d)
    for i in range(e):
        if c % a == 0:
            b += 1
        if a < c:
            a += 1
    if b > 2:
        print('这是一个合数')
    else:
        print('这是一个质数')

[此贴子已经被作者于2023-1-31 09:59编辑过]

#13
ysr28572023-01-31 10:04
for i in range(100000000000000000000000000000):
...     a=1
...     b=0
...     c=input('请输入一个数字:')
...     c=int(c)
...     d=c**0.5
...     e=int(d)
...     for i in range(e):
...         if c % a == 0:
...             b += 1
...         if a < c:
...             a += 1
...     if b > 2:
...         print('这是一个合数')
...     else:
...         print('这是一个质数')
...
请输入一个数字:997
这是一个质数
请输入一个数字:9999999997
这是一个质数
请输入一个数字:123456787
这是一个合数
请输入一个数字:12345678911
这是一个质数
请输入一个数字:
这回可以了,速度快了,看来和vb语言还是有很大区别的。
#14
ysr28572023-01-31 10:21
for i in range(100000000000000000000000000000):
...     a=1
...     b=0
...     c=input('请输入一个数字:')
...     c=int(c)
...     d=c**0.5
...     e=int(d)
...     for i in range(e):
...         if c % a == 0:
...             b += 1
...         if a < c:
...             a += 1
...     if b > 2:
...         print('这是一个合数')
...     else:
...         print('这是一个质数')
...
请输入一个数字:997
这是一个质数
请输入一个数字:9999999997
这是一个质数
请输入一个数字:123456787
这是一个合数
请输入一个数字:12345678911
这是一个质数
请输入一个数字:123456789
这是一个合数
请输入一个数字:12345678911111
这是一个合数
请输入一个数字:1234567891111111
这是一个质数
请输入一个数字:123456789111111
这是一个合数
请输入一个数字:12345678911111111
这是一个质数
请输入一个数字:

17位的数也能很快算出来,比vb语言编的是快。
#15
ysr28572023-01-31 10:27
12345678911111111~12345678911111113之间的素数有个:(用时0.2539063秒)
最后一个可能有错误,应该是合数?
#16
ysr28572023-01-31 10:42
请输入一个数字:12345678911111111
这是一个质数
请输入一个数字:12345678911111113
这是一个合数
请输入一个数字:12345678911111111
这是一个质数
请输入一个数字:

看来这个程序对大数据计算是有错误的,对这个数12345678911111111<17位>的判断是错的,咋回事?程序错了?
12345678911111111<17位>=239171*51618628141<11位>.
12345678911111113<17位>=269*331*138654734567<12位>.
#17
东海ECS2023-01-31 10:43
for i in range(100000000000000000000000000000):
    a=1
    b=0
    c=input('请输入一个数字:')
    c=val(c)
    for i in range(c):
        if c % a == 0:
            b += 1
        if a < c:
            a += 1
    if b > 2:
        print('这是一个合数')
    else:
        print('这是一个质数')
两个局部变量i发生了冲突,不过没有用i,没多大关系

[此贴子已经被作者于2023-1-31 10:58编辑过]

#18
东海ECS2023-01-31 11:06
怎么要for个1000000000000000000呢?一个死循环不就可以了吗?
程序代码:

while True:
    try:
        a = 1
        b = 0
        c = input('请输入一个数字:')
        c = eval(c)
        for i in range(c):
            if c % a == 0:
                b += 1
            if a < c:
                a += 1
        if b > 2:
            print('这是一个合数')
        else:
            print('这是一个质数')
    except:
        print("错误")
        exit()

顺便加个异常处理.不过有些简单粗暴,发生异常直接退出( ̄▽ ̄)~*
#19
ysr28572023-01-31 11:12
for i in range(100000000000000000000000000000):
    a=1
    b=0
    c=input('请输入一个数字:')
    c=int(c)
    d=c**0.5
    e=int(d)
    for i in range(e):
        if c % a == 0:
            b += 1
        if a <= e:
            a += 1
    if b >= 2:
        print('这是一个合数')
    else:
        print('这是一个质数')
#20
ysr28572023-01-31 11:14
for i in range(100000000000000000000000000000):
...     a=1
...     b=0
...     c=input('请输入一个数字:')
...     c=int(c)
...     d=c**0.5
...     e=int(d)
...     for i in range(e):
...         if c % a == 0:
...             b += 1
...         if a <= e:
...             a += 1
...     if b >= 2:
...         print('这是一个合数')
...     else:
...         print('这是一个质数')
...
请输入一个数字:12345678911111111
这是一个合数
请输入一个数字:

这回对了,看来程序有问题,应该是:b>=2.
#21
ysr28572023-01-31 11:35
回复 18楼 东海ECS
while True:
...     try:
...         a = 1
...         b = 0
...         c = input('请输入一个数字:')
...         c = eval(c)
...         for i in range(c):
...             if c % a == 0:
...                 b += 1
...             if a < c:
...                 a += 1
...         if b > 2:
...             print('这是一个合数')
...         else:
...             print('这是一个质数')
...     except:
...         print("错误")
...         exit()
...
请输入一个数字:997
这是一个质数
请输入一个数字:

这个程序可以运行,速度仍然是太慢,输入12345678911111111十几分钟过去了也没有算出来只好强行停止了
#22
ysr28572023-01-31 11:45
while True:
...     try:
...         a = 1
...         b = 0
...         c = input('请输入一个数字:')
...         c = eval(c)
...         d=c**0.5
...         e=int(d)
...         for i in range(e):
...             if c % a == 0:
...                 b += 1
...             if a < c:
...                 a += 1
...         if b > 2:
...             print('这是一个合数')
...         else:
...             print('这是一个质数')
...     except:
...         print("错误")
...         exit()
...
请输入一个数字:12345678911111111
这是一个质数
请输入一个数字:

这样速度快了,仍然是错误的,应该是:b>=2
#23
东海ECS2023-01-31 11:56
回复 22楼 ysr2857
没看懂,输入数字的0.5次幂什么意思?望赐教.
#24
东海ECS2023-01-31 12:02
程序代码:

while True:
    try:
        c = input('请输入一个数字:')
        c = eval(c)
        if c <= 1:
            print("无法计算.")
            exit()
        b = 0
        list1 = [2,3,5,7,11,13,17,19]
        for i in range(7):
            if c % list1[i] == 0:
                b = b + 1
        if b >= 2:
            print("合数")
        else:
            print("质数")
    except:
        print("错误")
        exit()

这个快很多,但是有些特殊的数字会出错
#25
ysr28572023-01-31 12:04
while True:
    try:
        a = 1
        b = 0
        c = input('请输入一个数字:')
        c = eval(c)
        d=c**0.5
        e=int(d)
        for i in range(e):
            if c % a == 0:
                b += 1
            if a < c:
                a += 1
        if b >= 2:
            print('这是一个合数')
        else:
            print('这是一个质数')
    except:
        print("错误")
        exit()

[此贴子已经被作者于2023-1-31 12:07编辑过]

#26
东海ECS2023-01-31 12:09
由于1既不是质数也不是合数,而且质合数一般是自然数(不包括0)
所以要加检验代码:
程序代码:

if c <= 1:
    print("无法计算.")
    exit()
#27
ysr28572023-01-31 12:12
while True:
...     try:
...         a = 1
...         b = 0
...         c = input('请输入一个数字:')
...         c = eval(c)
...         d=c**0.5
...         e=int(d)
...         for i in range(e):
...             if c % a == 0:
...                 b += 1
...             if a < c:
...                 a += 1
...         if b >= 2:
...             print('这是一个合数')
...         else:
...             print('这是一个质数')
...     except:
...         print("错误")
...         exit()
...
请输入一个数字:12345678911111111
这是一个合数
请输入一个数字:
#28
ysr28572023-01-31 12:16
回复 24楼 东海ECS
while True:
...     try:
...         c = input('请输入一个数字:')
...         c = eval(c)
...         if c <= 1:
...             print("无法计算.")
...             exit()
...         b = 0
...         list1 = [2,3,5,7,11,13,17,19]
...         for i in range(7):
...             if c % list1[i] == 0:
...                 b = b + 1
...         if b >= 2:
...             print("合数")
...         else:
...             print("质数")
...     except:
...         print("错误")
...         exit()
...
请输入一个数字:997
质数
请输入一个数字:12345678911111111
质数
请输入一个数字:12345678911111113
质数
请输入一个数字:14629
质数
请输入一个数字:
这个快,需要列全素数表,否则就输出错误结果了。
#29
东海ECS2023-01-31 12:17
回复 27楼 ysr2857
[原内容已被撤销]

[此贴子已经被作者于2023-1-31 12:19编辑过]

#30
ysr28572023-01-31 12:21
回复 23楼 东海ECS
求平方根的,试除方根内的整数。
这样速度就快了,否则太慢了!
#31
ysr28572023-01-31 12:25
回复 26楼 东海ECS
对,这样是可以的,如何做成可调用程序呢?我是外行,一点也不懂,语句和vb区别很大啊!

谢谢老师指导!
#32
东海ECS2023-01-31 12:31
回复 30楼 ysr2857
求平方根:
y根号x:

import math
math.pow(x,1/y)
#33
东海ECS2023-01-31 12:33
回复 31楼 ysr2857
您是说.exe?
#34
ysr28572023-01-31 14:23
回复 33楼 东海ECS
.exe就是可执行程序吧?
我是说程序中的语句,二者是不同的,表达方法是有区别的。

vb可以这样表示求方根:x=a^(1/2).

可调用程序就是做好的程序,用主程序来掉用,比如我做了个大数除法程序,命名为MCC(),求某个大数a除以b的商x,在vb中就是直接调用这个程序:x=MCC(a,b)

[此贴子已经被作者于2023-1-31 14:33编辑过]

#35
ysr28572023-01-31 14:26
回复 32楼 东海ECS
谢谢指导!明白了,这就求x的y次方根吧?

这样表示还是很方便的,谢谢!
#36
东海ECS2023-01-31 16:50
回复 34楼 ysr2857
您是说在其他语言中调用Python语句,还是把Python的一些语句封装起来,在不同的Python文件中调用?

[此贴子已经被作者于2023-1-31 17:08编辑过]

#37
ysr28572023-01-31 18:05
回复 36楼 东海ECS
在不同的Python文件中调用就行,能在其他语言中调用Python语句则更好!

谢谢指导!
#38
东海ECS2023-01-31 19:39
回复 37楼 ysr2857
模块
Python支持自定义模块,自定义模块有两个作用:一个是规范代码,让代码更加易于阅读;另一个是方便其他程序可使用已经编好的模块,提高效率.自定义模块主要分为两个部分:1.创建模块2.使用模块.
1.创建模块
Python中,扩展名.py就是个模块.
下面一个例子来创建模块.
程序代码:

#D:\编程\Python\maths.py
def mydef():
    while True:
        try:
            a = 1
            b = 0
            c = input('请输入一个数字:')
            c = eval(c)
            d=c**0.5
            e=int(d)
            for i in range(e):
                if c % a == 0:
                    b += 1
                if a < c:
                    a += 1
            if b >= 2:
                print('这是一个合数')
            else:
                print('这是一个质数')
        except:
            print("错误")
            exit()


保存下来就是个判断质合数的模块了.
2.使用import导入模块

import moduleName (可选)as alias

moduleName:模块名.
as alias:可选,在该程序中引用该模块的别名.
下面演示导入刚刚的模块maths,并使用里面的函数mydef:
程序代码:

#D:\编程\Python\模块示例.py
import maths as ma        #导入maths模块,别名ma
ma.mydef()                #执行maths模块的mydef函数,这里用别名ma

程序运行结果:
只有本站会员才能查看附件,请 登录


[此贴子已经被作者于2023-2-1 10:05编辑过]

#39
ysr28572023-02-01 01:01
回复 38楼 东海ECS
谢谢老师,学习了,真的很好!

我好好学习一下,非常感谢!
#40
ysr28572023-02-01 01:31
#D:\编程\Python\maths.py
def mydef():
    while True:
        try:
            a = 1
            b = 0
            c = input('请输入一个数字:')
            c = eval(c)
            d=c**0.5
            e=int(d)
            for i in range(e):
                if c % a == 0:
                    b += 1
                if a < c:
                    a += 1
            if b >= 2:
                print('这是一个合数')
            else:
                print('这是一个质数')
        except:
            print("错误")
            exit()

mydef()                #执行maths模块的mydef函数,这里用别名ma
#41
ysr28572023-02-01 01:35
请输入一个数字:1234567891111111
这是一个质数
请输入一个数字:137
这是一个质数
请输入一个数字:127
这是一个质数
请输入一个数字:227
这是一个质数
请输入一个数字:167
这是一个质数
请输入一个数字:131
这是一个质数
请输入一个数字:2857
这是一个质数
请输入一个数字:14629
这是一个质数
请输入一个数字:
#42
ysr28572023-03-19 06:31
while True:
    try:
        a = 2
        b = 0
        c = input('请输入一个数字:')
        c1=c[-1]
        c = eval(c)
        d=c**0.5
        e=int(d)
        if c == 2:print('这是一个质数')   
        elif eval(c1) % 2 == 0 :
               print('这是一个合数')
        else :
               for i in range(3,e,2):
                 if c % i == 0:
                    b = 2
                    break
                 
               if b >= 2:
                    print('这是一个合数')
               else:
                    print('这是一个质数')
    except:exit()
#43
mrexcel2023-03-19 16:53
from sympy import isprime
print(isprime(1234567891111111))

#44
ysr28572023-03-20 08:17
回复 43楼 mrexcel
谢谢老师光临指导!向您学习了!
#45
mrexcel2023-03-20 08:25
虽然道理相通,但对于数值计算,VB6与 PYTHON 和MATHEMATICA不是一个量级
#46
东海ECS2023-04-02 12:26
请输入一个数字:997
这是一个质数
请输入一个数字:9999999997
这是一个质数
请输入一个数字:123456787
这是一个合数
请输入一个数字:12345678911
这是一个质数
请输入一个数字:
1