鱼C论坛

 找回密码
 立即注册
查看: 3051|回复: 41

[技术交流] Python:每日一题 187

[复制链接]
发表于 2018-7-19 19:52:53 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 冬雪雪冬 于 2018-7-22 19:58 编辑

我们的玩法做了一下改变:

1. 楼主不再提供答案。
2. 请大家先独立思考,再参考其他鱼油的解答,这样才有助于自己编程水平的提高。开始阶段是看不到其他人的回帖的,等答题完成,开始评分时再取消限制。
3. 鼓励大家积极答题,奖励的期限为出题后24小时内。
4. 根据答案的质量给予1~3鱼币的奖励。

题目:
这次来个简单的。一个合数可以分解为两个数乘,例如24可以分成2*12,3*8,4*6,求出数字相差最小的两个乘数,如本例是4和6。

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-7-19 19:57:31 | 显示全部楼层
本帖最后由 凌九霄 于 2018-7-21 20:18 编辑
  1. def comnum(num):
  2.     if num > 1:
  3.         tmp = num
  4.         for i in range(1, num):
  5.             result = divmod(num, i)
  6.             if result[ 1 ] == 0:
  7.                 if 0 <= result[ 0 ] - i < tmp:
  8.                     tmp = result[ 0 ] - i
  9.                     D1, D2 = i, result[ 0 ]
  10.                 else:
  11.                     break
  12.         return [ D1, D2 ]
  13.     else:
  14.         return None
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-19 20:12:20 | 显示全部楼层
  1. def fun187(x):
  2.     z=int(x**0.5)
  3.     if z==x**0.5:
  4.         return z,z
  5.     else:
  6.         while 1:
  7.             if x%z==0:
  8.                 return z,x//z
  9.             z-=1
复制代码

点评

从中间算起效率高  发表于 2018-7-22 20:02

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
冬雪雪冬 + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-19 20:31:03 | 显示全部楼层
  1. def minMul(n):
  2.         result=[]
  3.         c=n
  4.         for i in range(1,n//2):
  5.                 for j in range(1,n+1):
  6.                         if i*j==n and abs(j-i)<c:
  7.                                 result=sorted([i,j])
  8.                                 c=abs(j-i)
  9.         print('%d相差最小的两个乘数分别为%d和%d' % (n,result[0],result[1]))
  10.                                
  11. minMul(101)
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-19 21:01:34 | 显示全部楼层
  1. import math
  2. num = int(input('Please input a  composite number:  '))
  3. for i in range(int(math.sqrt(num)), 2, -1):
  4.     if num % i == 0:
  5.         tmp1, tmp2 = i, num // i
  6.         print(f'The result is:{num} = {tmp1} * {tmp2}')
  7.         break
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
冬雪雪冬 + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-19 21:18:08 | 显示全部楼层
本帖最后由 天圆突破 于 2018-7-19 21:26 编辑
  1. from math import ceil

  2. def func(num):
  3.     lst = [(i,num//i) for i in range(1,num//2+1) if int(num/i)==ceil(num/i)]
  4.     lst2 = list(map(lambda x:abs(x[0]-x[1]),lst))
  5.     dct = dict(zip(lst2,lst))
  6.     return  dct[min(dct.keys())]

  7. print(func(24))
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2018-7-19 21:26:01 | 显示全部楼层
  1. >>> def fun( n ):
  2.         t = int(n**0.5)
  3.         while t > 0:
  4.                 if n % t == 0:
  5.                         return t,n//t
  6.                 t -= 1

  7.                
  8. >>> fun(24)
  9. (4, 6)
  10. >>> fun(17)
  11. (1, 17)
  12. >>> fun(0)
  13. >>>
  14. >>>
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
冬雪雪冬 + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-19 21:26:13 | 显示全部楼层
明白
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-7-19 21:40:23 | 显示全部楼层
假设输入都是自然数
  1. def fun(n):
  2.     for i in range(int(n**0.5), 0, -1):
  3.         if not n%i:
  4.             return i, n//i
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
冬雪雪冬 + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-19 22:26:02 | 显示全部楼层
  1. def fun187(number):  
  2.     if number==0 or number==1:
  3.         print('%d既不是质数也不是合数!'% number)
  4.     else:
  5.         i=1
  6.         ss=number
  7.         while i<=number:
  8.             if number % i==0:
  9.                 tt=abs(number//i-i)
  10.                 if tt<ss:
  11.                     ss=tt
  12.                     result=i
  13.             i+=1
  14.         if result==1 or result==number:
  15.             print('%d是一个质数,请输入一个合数!'% number)
  16.         else:
  17.             print('相差最小的两个乘数是:%d和%d'%(result,number//result))

  18. fun187(255)
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-19 22:52:12 | 显示全部楼层
  1. def fun187(num):
  2.     for i in range(int(num ** 0.5), 0, -1):
  3.         if not num % i:
  4.             return '%d = %d * %d' % (num, i, num // i)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-20 08:44:22 | 显示全部楼层
  1. def func187(num):
  2.     temp = []
  3.     flag = num
  4.     result = [1,2]
  5.     for i in range(2,num//2):
  6.         if num % i == 0 :
  7.             j = num//i
  8.             temp.append(i)
  9.             temp.append(j)
  10.             
  11.     for k in range(0,len(temp),2):
  12.         if flag > abs(temp[k+1]-temp[k]):
  13.             flag = abs(temp[k+1]-temp[k])
  14.             result[0] = temp[k]
  15.             result[1] = temp[k+1]
  16.     return result
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

头像被屏蔽
发表于 2018-7-20 10:55:38 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-20 10:59:46 | 显示全部楼层
  1. def fun186(num):
  2.     if isinstance(num, int):
  3.         mid = num ** 0.5
  4.         if mid % 1 == 0:
  5.             return mid, mid
  6.         low = round(mid, 0) - 1
  7.         while 1:
  8.             high = num / low
  9.             if high % 1 == 0:
  10.                 return round(low), round(high)
  11.             low -= 1

  12. print(fun186(24))
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
冬雪雪冬 + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-20 15:06:46 | 显示全部楼层
本帖最后由 Wangzy1025 于 2018-7-20 15:12 编辑

def day187(n):
    all_list = []
    for i in range(2, n//2):
        if n//i == n/i:
            all_list.append((i, n//i))
    if all_list:
        index_flag, temp = 0, all_list[0][1] - all_list[0][0]
        for j in range(len(all_list)):
            if 0 <= all_list[j][1] - all_list[j][0] < temp:
                index_flag = j
                temp = all_list[j][1] - all_list[j][0]
        return all_list[index_flag]
    else:
        print('输入的不是合数')
        return


print(day187(24))

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-20 16:10:26 | 显示全部楼层
  1. def fun187(num):
  2.     count = num
  3.     for each in range(1,10):
  4.         if num / each == int(num / each) and num / each > 0:
  5.             if abs(each - num) / each < count:
  6.                 count = abs(each - num / each)
  7.                 num1 = each
  8.                 num2 = num / each
  9.     print ('最小的一组乘积为%d * %d' % (num1,num2))
复制代码

点评

测试255不正确  发表于 2018-7-22 20:11
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-20 17:56:22 | 显示全部楼层
  1. import math
  2. num = int(input('Please input a num:'))
  3. snum = int(math.sqrt(num))+1
  4. while snum>0:
  5.     if num%snum==0:
  6.         a=int(num/snum)
  7.         b=snum
  8.         break
  9.     else:
  10.         snum-=1
  11. print('%d的合数中最小合数差值是%d-%d=%d'%(num,a,b,a-b))
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
冬雪雪冬 + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-21 09:00:25 | 显示全部楼层
num=input(‘请输入一个整数:’)
While not num.isdigit():
    num=input(‘输入错误,请确认输入的是一个整数!’)
num=int(num)
list1=[]
dict1={}
for i in range(1,num+1):
    if num%i==0:
        a=num/i    #a和i为num的乘数
        c=abs(a-i)  #c为两个数的差
        list1.append(c)
        dict1[c]=(a,i)
list1.sort()
x=dict1[list1[0]][0]        #记录第一个乘数
y=dict1[list1[0]][1]        #记录第二个乘数
print(‘%d数字相差最小的两个乘数是%d和%d’ % (num,x,y))

点评

用了中文引号,while不能大写。  发表于 2018-7-22 20:15

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
冬雪雪冬 + 1 + 1

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-21 16:15:46 | 显示全部楼层
  1. def f(data):
  2.     list0 = []
  3.     for i in range(1,data//2+1):
  4.         for j in range(1,i+1):
  5.             if i * j == data:
  6.                 list0.append((i,j))
  7.     return list0[0]
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-22 10:50:07 | 显示全部楼层
def test(n):
        list1 = []
        s = 999999
        for i in range(1,int(n/2)):
                if n % i == 0:
                        list1.append((i,int(n/i)))
        for j in list1:
                if abs(j[0] - j[1]) < s:
                        s = abs(j[0] - j[1])
                        nt = j
        print(nt,s)


test(24)

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-28 18:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表