鱼C论坛

 找回密码
 立即注册
楼主: 欧拉计划

题目3:找出一个合数的最大质数因子

  [复制链接]
发表于 2016-8-11 00:11:06 | 显示全部楼层
我好像来到了一个神奇的地方
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-8-12 02:24:20 | 显示全部楼层
  1. import math

  2. def is_prime(n):
  3.     i = 2
  4.     while i < n:
  5.         if n % i == 0:
  6.             return False
  7.         i += 1
  8.     return True


  9. def max_prime(num):
  10.     i = 2
  11.     tmp = int(math.sqrt(num)) + 1
  12.     m = n = 0
  13.     while i <= tmp:
  14.         if num % i == 0:
  15.             if is_prime(i):
  16.                 n = i
  17.             if is_prime(int(num / i)):
  18.                 m = int(num / i)
  19.         i += 1
  20.     if m != 0 or n != 0:
  21.         return max(m, n)
  22.     else:
  23.         return None

  24. print(max_prime(600851475143))
复制代码

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

使用道具 举报

发表于 2016-8-25 20:43:31 | 显示全部楼层
n = 600851475143
m = []
j = 2
while n != 1:
    for i in range(j,n+1):
        if n%i == 0:
            j = i
            m.append(i)
            break
    n = n//j

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

使用道具 举报

发表于 2016-9-6 16:54:30 | 显示全部楼层
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. int main()
  4. {
  5.     long long a = 600851475143;
  6.     int i;
  7.     for(i = 3;i <= a/3;)
  8.         {
  9.                 if(a % i==0)
  10.                 {
  11.                         a = a/i;
  12.                 }
  13.                 else
  14.                 {
  15.                         i++;
  16.                 }
  17.         }
  18.         printf("%d\n",a);
  19. }
复制代码

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

使用道具 举报

发表于 2016-9-6 16:56:18 | 显示全部楼层
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. int main()
  4. {
  5.     long long a = 600851475143;
  6.     int i;
  7.     for(i = 3;i <= a/3;)
  8.         {
  9.                 if(a % i==0)
  10.                 {
  11.                         a = a/i;
  12.                 }
  13.                 else
  14.                 {
  15.                         i++;
  16.                 }
  17.         }
  18.         printf("%d\n",a);
  19. }
复制代码

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

使用道具 举报

发表于 2016-9-22 18:49:38 | 显示全部楼层
本帖最后由 dodopromi 于 2016-9-22 18:52 编辑
  1. def maxy(n):  
  2.     for i in range(2,n//2+1):  
  3.         if n%i==0:
  4.             print(int(n/i))  #这行把过程都写出来了,我要是只求答案,这行放外边,就变成none了
  5.             return maxy(int(n/i))

  6. n=int(input('请输入一个数:'))      
  7. maxy(n)
复制代码


有人帮帮我吗?中间的那个print放哪儿都不行啊。
现在的结果是
  1. 请输入一个数:600851475143
  2. 8462696833
  3. 10086647
  4. 6857
  5. >>>
复制代码


但是要是我print领出来就报错  invalid character in identifier

if加else也加不来。 我要哭死了,大神们帮帮我也
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-9-27 15:21:32 | 显示全部楼层
  1. public class LargestPrimeFactor
  2. {
  3.         // 求一个数的最小素数因子
  4.         public static long primeFactor(long n)
  5.         {
  6.                 long i = 2L;
  7.                 while(n%i != 0)
  8.                 {
  9.                         i++;
  10.                 }
  11.                 return i;
  12.         }
  13.         
  14.         public static void main(String[] args)
  15.         {
  16.                 long n = 600851475143L;
  17.                
  18.                 // 最后跳出循环的n值为最大的素数因子
  19.                 while(primeFactor(n) != n)
  20.                 {
  21.                         long f = primeFactor(n);
  22.                         n = n / f;
  23.                 }
  24.                
  25.                 System.out.println("所求数的最大素数因子为:" + n);        
  26.         }
  27. }
复制代码


primeFactor函数的参数确定为long类型,总感觉不太合适,不知道大神门有没有好的改进?求不吝赐教。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-10 09:45:40 | 显示全部楼层
  1. [71, 839, 1471, 6857L]
  2. [Finished in 0.1s]

  3. def devide(n,j=0):
  4.         s = 0
  5.         for i in range(2,int(n**0.5+1)):
  6.                 if n%i == 0:
  7.                         s,j = n/i,i
  8.                         break
  9.         return (s,j)

  10. lst = []
  11. t = 600851475143
  12. k,j = devide(t)[0],devide(t)[1]
  13. while k != 0:
  14.         lst.append(j)
  15.         k,j = devide(k,j)[0],devide(k,j)[1]
  16. for e in lst:
  17.         f = t / e
  18.         t = f
  19. lst.append(f)
  20. print lst
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-11-2 18:48:39 | 显示全部楼层
本帖最后由 梦想绘制者 于 2016-11-2 18:54 编辑
  1. # Python 3.5 实现
  2. # 求600851475143的最大质数因子
  3. #
  4. # 求解思路:
  5. # 把整个问题分解成3个子问题,分别用函数实现
  6. # 这3个子问题依次为:
  7. # 1.求一个数的因子(序列)
  8. # 2.判断一个数为质数
  9. # 3.求一个序列的最大值

  10. def Factors(n):
  11.     f = []
  12.     if n <= 1 or (not isinstance(n, int)):
  13.         print('输入错误,请输入大于1的正整数!')
  14.         return f
  15.     else:
  16.         half = int(n ** 0.5)
  17.         for i in range(1,half + 1):
  18.             if n % i == 0:
  19.                 f.append(i)
  20.         return f
  21.    
  22. def isPrime(n):
  23.     if n == 1:
  24.         return False
  25.    
  26.     f = Factors(n)      
  27.     if len(f) - 1 > 1:
  28.         return False
  29.     else:
  30.         return True
  31.   
  32. def maxPrimeFactor(n):
  33.     f = Factors(n)
  34.     pf = []
  35.     for each in f:
  36.         if isPrime(each):
  37.             pf.append(each)
  38.     return max(f)

  39. n = 600851475143
  40. print('%d的最大质数因子为%d.'%(n, maxPrimeFactor(n)))

复制代码


>>>
600851475143的最大质数因子为486847.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2016-11-2 19:30:12 | 显示全部楼层
dodopromi 发表于 2016-9-22 18:49
有人帮帮我吗?中间的那个print放哪儿都不行啊。
现在的结果是

你这程序中因子应该是i而不是int(n/i)。我给你解释一下为什么输出这样的结果吧。
  1. def maxy(n):  
  2.     for i in range(2,n//2+1):  
  3.         if n%i==0:
  4.             print(int(n/i))  #这行把过程都写出来了,我要是只求答案,这行放外边,就变成none了
  5.             return maxy(int(n/i))

  6. n=int(input('请输入一个数:'))      
  7. maxy(n)
复制代码


你写的这个maxy()函数先一个for循环,其中要判断i是否是n的因子,是的话执行一条打印语句,同时还要在返回时调用这个函数自身,参数换成了int(n/i))也就是n是i的倍数。
你输入600851475143(奇数),调用maxy()函数。在i = 2的时候,n%2 == 0不满足。然后i变成了3,还不满足条件,直到第一个满足条件n%2 == 0的数i(71)为止,此时,你输出了一个int(n/i)也就是8462696833。然后return又调用maxy()函数,这次参数为int(n/i)也就是8462696833,然后又继续求8462696833与其第一个非1因子的商。如此继续下去。
你的程序可以这么改一下(但只是求n的最大因子,而没有质数的判断部分,你自己加上去吧):
  1. def maxy(n):
  2.     f = []
  3.     for i in range(2,n//2+1):
  4.         if n%i == 0:
  5.             f.append(i)
  6.     return max(f)

  7. n=int(input('请输入一个数:'))
  8. maxy(n)
复制代码

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

使用道具 举报

发表于 2016-11-6 22:31:03 | 显示全部楼层
#include<stdio.h>
#include<stdlib.h>


int main()
{
    long long a[100],num,i,n;
    printf("请输入一个正整数:  ");
    while(scanf("%I64d",&n))
    {
        num=0;
        for(i=2; i*i<=n; i++)
        {
            if(n%i==0)
                a[num++]=i;
            while(n%i==0)
                n/=i;
        }
        if(n>1)
            a[num++]=n;
        for(i=0; i<num; i++)
            printf("%I64d ",a[i]);
        printf("\n");
    }
    system("color 3f");
    return 0;
}

结果:
请输入一个正整数:  600851475143
71 839 1471 6857
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-11-7 12:28:07 | 显示全部楼层
  1. import time
  2. import math
  3. def isPrime(n):
  4.     if n<2:
  5.         return False
  6.     elif n==2:
  7.         return True
  8.     else:
  9.         m=int(math.sqrt(n))
  10.         for i in range(2,m+1):
  11.             if n%i==0:
  12.                 return False
  13.         return True

  14. """
  15. 思路:
  16. 从小到大逐数判断是否为因数,再判断该因数是否为质数,加入质因数列表
  17. 再判断该因数对应的因数是否为质数,如是,加入质因数列表
  18. """
  19. def findMaxpn(n):
  20.     list=[]
  21.     m=int(math.sqrt(n))
  22.     for i in range(2,m+1):
  23.         if n%i==0:
  24.             if isPrime(i):
  25.                 list.append(i)
  26.             if isPrime(n/i):
  27.                 list.append(n/i)
  28.     if list:
  29.         list.sort()
  30.         print(list)
  31.         return list[-1]
  32.     else:
  33.         print("参数为质数,不符合条件!!")
  34.         return 0

  35. start1=time.clock()

  36. print(findMaxpn(600851475143))

  37. end1=time.clock()
  38. print("方法一耗时"+str(end1-start1)+"s")
  39.         


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

使用道具 举报

发表于 2016-11-15 22:38:45 | 显示全部楼层
  1. def euler03(num=100):
  2.     """
  3.     13195的质数因子有5,7,13,29, 600851475143 的最大质数因子是多少
  4.     """
  5.     def isprime(n):
  6.         if n%2 == 0: return False
  7.         for x in range(3,int(n**0.5)+1,2):
  8.             if n%x==0: return False
  9.         else: return True

  10.     def ismaxnum(n):
  11.         tmp = []
  12.         for i in range(3,int(n**0.5)+1,2):
  13.             if isprime(i) and n%i == 0: tmp.append(i)
  14.         return max(tmp)

  15.     return ismaxnum(num)

  16. print(euler03(600851475143))
复制代码


参考了好多人的写法,自己再默写了一次
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-11-26 15:58:21 | 显示全部楼层
  1. import math


  2. def IsPrime(n = 1):
  3.     if n == 0:
  4.         return False
  5.     elif n == 1:
  6.         return True
  7.     elif n < 4:
  8.         return True
  9.     else:
  10.         r = int(math.floor(math.sqrt(n)))
  11.         for i in range(2,r+1):
  12.             if n % i == 0:
  13.                 return False
  14.         return True



  15. def largestPrime(n):
  16.     largest =0
  17.     tmp = int(math.floor(math.sqrt(n)))
  18.     for i in range((tmp),1,-1):
  19.         #print('i = ',i)
  20.         if IsPrime(i) and n%i == 0:
  21.             largest = i
  22.             break

  23.     #print('largest = ',largest)
  24.     return largest



  25. print(largestPrime(600851475143 ))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-12-4 20:40:31 | 显示全部楼层
python5行代码搞定 但是那运行效率真是日了狗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-1-6 12:37:24 | 显示全部楼层
本帖最后由 芒果加黄桃 于 2017-1-6 14:17 编辑
  1. # encoding:utf-8
  2. # 600851475143 最大质数银子
  3. from time import time
  4. def isPrime(n):
  5.     if n < 4:
  6.         return True
  7.     if n % 2 == 0 or n % 3 == 0:
  8.         return False
  9.     sqr = int(n ** 0.5)
  10.     l_pn = [3]
  11.     ispn = True
  12.     while max(l_pn) < sqr:
  13.         for i in range(max(l_pn) + 2, n, 2):
  14.             ispn = True
  15.             sqr_i = int(i ** 0.5) + 1
  16.         
  17.             for pn in l_pn:
  18.                 if i % pn == 0:
  19.                     ispn = False
  20.                     break
  21.                 if pn > sqr_i:
  22.                     break
  23.             if ispn:
  24.                 if n % i == 0:
  25.                     return False;
  26.                 l_pn.append(i)
  27.                 break   
  28.     return True

  29. start = time()
  30. number = 600851475143;
  31. sqr_n = int(number ** 0.5)
  32. for n in range(3, sqr_n):
  33.     if number % n == 0:
  34.         if isPrime(n):
  35.             print('600851475143的质数因子包含:', str(n))
  36. print('cost %.3f sec' % (time() - start))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-1-22 13:06:02 | 显示全部楼层
此代码使用matlab编程
Problem3所用时间为0.58204秒
Problem3的答案为6857
  1. %题目3:找出一个合数的最大质数因子  
  2. function Output=Problem3(Input)
  3. tic
  4. if nargin==0
  5. Input=600851475143;
  6. end
  7. for ii=floor(sqrt(Input)):-1:2
  8.     temp=mod(Input,ii);
  9.     if temp==0
  10.         if Prime_Judge(ii)==1
  11.             Output=ii;
  12.             break
  13.         end
  14.     end
  15. end
  16. toc
  17. disp('此代码使用matlab编程')
  18. disp(['Problem3所用时间为',num2str(toc),'秒'])
  19. disp(['Problem3的答案为',num2str(Output)])
  20. end
  21. %验证其是否为素数
  22. %若输入为素数则Judge为1,否则为0
  23. function Judge=Prime_Judge(Input)
  24. if mod(Input,2)==0
  25.     Judge=0;
  26. elseif mod(Input,3)==0
  27.     Judge=0;
  28. else
  29.     node=floor(sqrt(Input))+1;
  30.     Judge=1;
  31.     for ii=2:node
  32.         if  mod(Input,ii)==0
  33.             Judge=0;
  34.             break
  35.         else
  36.         end
  37.     end
  38. end
  39. end
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-1-22 15:06:37 | 显示全部楼层
  1. number=600851475143
  2. a=[1]
  3. b=1
  4. c=1
  5. def lung(number):
  6.     for i in range(2,number):
  7.         if number%i==0:
  8.             a.append(i)
  9.             break
  10. while number*b==600851475143:
  11.     lung(number)
  12.     number=int(number/(a[-1]))
  13.     b*=a[-1]
  14. for each in a:
  15.     c*=each
  16. if a[-1]>(600851475143/c):
  17.     print(a[-1])
  18. else:
  19.     print(600851475143/c)
复制代码

很费劲。。找质数的循环写的太烂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-2 01:30:40 | 显示全部楼层
  1. import time
  2. import math

  3. def largest_prime_factor(number):
  4.     '找出一个合数的最大质数因子'
  5.     largest_factor = 1
  6.     flag = True

  7.     for i in range(2, int(math.sqrt(number))):
  8.         if number % i == 0:
  9.             for j in range(2, int(math.sqrt(i))):
  10.                 if i % j == 0:
  11.                     flag = False
  12.                     break
  13.             if flag:
  14.                 largest_factor = i
  15.                 print(i)
  16.             flag = True

  17.     return largest_factor

  18. start = time.clock()
  19. print('600851475143的质数因子有:')
  20. print('最大质数因子为%d' %largest_prime_factor(600851475143))
  21. end = time.clock()
  22. print('程序执行了%fs。' %(end - start))
复制代码

执行结果:
600851475143的质数因子有:
71
839
1471
6857
最大质数因子为6857
程序执行了0.234420s。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-16 20:29:12 | 显示全部楼层
  1. from math import sqrt

  2. def ifprime(n):
  3.     k = 0
  4.     if n == 1 or n == 0:
  5.         k = 1
  6.     elif n % 2 == 0 and n != 2:
  7.         k = 1
  8.     else:
  9.         from math import sqrt
  10.         maxi = int(sqrt(n))
  11.         for i in range(3,maxi+1,2):
  12.             if n % i == 0:
  13.                 k = 1
  14.                 break
  15.     if k == 0:
  16.         return True
  17.     if k == 1:
  18.         return False
  19.    
  20. def fact(num):
  21.     f = []
  22.     while True:
  23.         maxi = int(sqrt(num))
  24.         for i in range(2,maxi+1):
  25.             if num % i == 0:
  26.                 f.append(int(i))
  27.                 num = num / i
  28.                 break
  29.         if ifprime(num):
  30.             f.append(int(num))
  31.             break
  32.         
  33.     return f


  34. if __name__ == '__main__':
  35.     n = fact(600851475143)
  36.     print(n[-1])

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-27 01:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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