鱼C论坛

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

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

  [复制链接]
发表于 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
复制代码
小甲鱼最新课程 -> https://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)
复制代码

很费劲。。找质数的循环写的太烂
小甲鱼最新课程 -> https://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。
小甲鱼最新课程 -> https://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])

复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-20 07:00:43 | 显示全部楼层
本帖最后由 0mrli0 于 2017-2-20 07:02 编辑
  1. /*找一个合数的最大质数因子
  2. 600851475143的最大质数因子是多少?
  3. 分析:先分解质因式,再输出最大结果。*/

  4. #include <stdio.h>
  5. #define N 600851475143

  6. int main()
  7. {
  8.     unsigned long long i, maxfactor;
  9.     unsigned long long n = N;
  10.     for(i=2; i<=n; i++)  
  11.     {
  12.         while(n%i == 0)
  13.         {
  14.             printf("%u ", i);
  15.             n = n / i;
  16.             maxfactor = n==1 ? maxfactor : n;
  17.         }
  18.     }
  19.     printf("\nmaxfactor = %u\n",maxfactor);
  20.     return 0;
  21. }
复制代码

71 839 1471 6857
maxfactor = 6857

Process returned 0 (0x0)   execution time : 0.014 s
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2017-2-20 21:12:25 | 显示全部楼层
  1. print("""问题: 13195 的质数因子有 5, 7, 13 和 29。
  2. 600851475143 的最大质数因子是多少?
  3. -------------------------------------------------""")

  4. # 数字除以2,若能被整除,取结果继续除以 i = 2,若不能则除以 i+1:
  5. # 依序递增,直到被自己除,此时的数字即为所求的最大质因子。

  6. def zhiyinzi(x):
  7.     i=2
  8.     while x != 1 :              # x 不等于 1
  9.         if x % i == 0:           # 能除尽2
  10.             x = x/i               # 继续除
  11.             zhiyinzi = i           # 得到最大质因子
  12.         else:
  13.             i += 1                  # 除不尽就 +1

  14.     return  zhiyinzi

  15. print("答案是: " + str(zhiyinzi(600851475143)))
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-25 15:34:38 | 显示全部楼层
  1. n = 600851475143
  2. i = 2
  3. while i <= n/2:     # 最大的质因数不大于被2除后的商
  4.     while n%i == 0: #能被i除尽
  5.         n = n/i     #能被i除尽,将商赋予n,继续除,直至除尽重复的约数
  6.     i += 1          #若除不尽,i+1,外侧循环
  7. print(n)            #直至最后,约数是其本身,则为质因数,且最大
复制代码


我的答案是 6857
也有其他鱼油推荐了,能够可视化python程序执行的网站,再推荐之   http://www.pythontutor.com/
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-27 11:16:19 | 显示全部楼层
def pm(n):
    if n==1:
        return 1
    else:
          for i in range(1,((n//2)+1)):
              if n%i ==0:
                  #print(i)
                  n=n//i
                  return (pm(n))
          else:
                return n
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-1 16:05:45 | 显示全部楼层
不严谨的解法
  1. zhishu=[2,3]
  2. def jc(i):
  3.     for x in zhishu:
  4.         if i%x==0:return 1
  5. for i in range(5,10000,2):
  6.     if jc(i):continue
  7.     if i not in zhishu:zhishu.append(i)
  8. zhishu.reverse()
  9. for i in zhishu:
  10.     if 600851475143%i==0:
  11.         print(i)
  12.         break
复制代码

  1. >>>
  2. == RESTART: C:\Users\ASUS\AppData\Local\Programs\Python\Python35-32\test.py ==
  3. 6857
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-6 11:26:16 | 显示全部楼层
  1. l=[]
  2. a=600851475143
  3. for i in range(2,a//2):
  4.     if a%i==0:
  5.         l.append(i)
  6. print(max(l))
  7.    
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-14 11:54:35 | 显示全部楼层
Liu_xy 发表于 2016-5-4 22:23
6857
[71, 839, 1471, 6857]
read:0.209758 s

int(math.sqrt(x)要+1,不然你试试13195?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-20 17:13:31 | 显示全部楼层
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. int main()
  4. {
  5. long long num = 0;
  6. printf("***input the number:\n");
  7. scanf("%lld",&num);
  8. long long flag = 0;       //存放最大质因数

  9. //对于偶合数先进行转换成奇数操作
  10. while(num % 2 == 0)
  11. {
  12. num = num / 2;
  13. flag = 2;
  14. }

  15. //对于奇合数进行操作,模上从3开始的奇数
  16. while(1)
  17. {
  18. if(num % i == 0)
  19. {
  20. //对于合数中的因数进行质数判断,是质数的存放到flag中
  21. long long j = 2;
  22. for(; j <= i / 2; j++){
  23. if(i % j == 0)
  24. break;
  25. }
  26. if(j > i / 2){
  27. flag = i;
  28. num = num / i;
  29. }
  30. }
  31. if(num < i)
  32. break;
  33. i = i + 2;
  34. }
  35. printf("***the largest prime factor is %lld",flag);
  36. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-26 16:40:54 | 显示全部楼层
  1. #include <stdio.h>
  2. #include <math.h>

  3. int main(void)
  4. {
  5.     long int number;
  6.     int factor;

  7.     // number = 13195;
  8.     number = 600851475143;

  9.     for(factor = 2; factor <= sqrt(number); factor++)
  10.     {
  11.         if(!(number % factor))
  12.         {
  13.             number /= factor;
  14.             printf("%d ", factor);
  15.         }
  16.     }
  17.     printf("\n");

  18.     printf("%ld\n", number);

  19.     return 0;
  20. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-26 16:42:11 | 显示全部楼层
  1. import math

  2. # number = 13195
  3. number = 600851475143

  4. factor = 2
  5. largest = int(math.sqrt(number))

  6. while factor <= largest:
  7.     if not (number % factor):
  8.         number /= factor
  9.         print(factor, end = ' ')

  10.         factor = 1
  11.         largest = int(math.sqrt(number))

  12.     factor += 1

  13. print("\nThe largest prime factor is:", int(number))
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-16 02:03:19 | 显示全部楼层
本帖最后由 Eagle.Tong 于 2017-4-16 02:12 编辑

Python
#求600851475143的最大质数因子

  1. import math
  2. import time


  3. def ifprime(n):
  4.         r = int(math.sqrt(n))
  5.         for i in range(2,r+1):
  6.             if n%i == 0:
  7.                 return 0
  8.         return 1

  9. start = time.time()
  10. number = 600851475143
  11. dividend = int(math.sqrt(number)) + 1
  12. Flag = 0
  13. while dividend > 1:
  14.     if number%dividend == 0:
  15.         Flag = ifprime(dividend)
  16.         if Flag == 1:
  17.             print(dividend)
  18.             break
  19.     dividend -= 1

  20. end = time.time()
  21. print(end-start)
复制代码




6857
0.4s
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-30 18:58:06 | 显示全部楼层
  1. #include<stdio.h>

  2. int main(void)
  3. {
  4.         long long x = 600851475143;
  5.         long long maxF = x;
  6.         for (int i = 2; i * i < maxF; i++)
  7.         {
  8.                 while (maxF%i == 0) {
  9.                         maxF /= i;
  10.                 }
  11.         }
  12.         printf("%ld\n", maxF);

  13.         return 0;
  14. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-5-4 13:15:57 | 显示全部楼层
答案是688543

我的代码非常简单,借助比较好的思路;将Num从2到Num/2往下除,如果能除2就循环除2直到除不动为止,同时Num借此机会可以迅速缩小,缩小的结果不但计算变快,同时2到Num/2的范围也在急速缩小,把小因数都除完最后剩下的大块就是最大的因数了。

  1. #include<stdio.h>

  2. int main(void)
  3. {
  4.         int i;
  5.         unsigned long Num=600851475143;
  6.         for(i=2;i<(Num/2);++i)
  7.         {
  8.                 if(Num%i==0)
  9.                 {
  10.                         while(Num%i==0)        Num=Num/i;
  11.                 }
  12.         }
  13.         printf("%d\n",Num);
  14.         return 0;
  15. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-20 23:43:15 | 显示全部楼层
  1. bool IsPrime(int num)
  2. {
  3.         int count = (int)sqrt(num);
  4.         int flag = 0;

  5.         for (int i = 2;i <= count && !flag;++i)
  6.         {
  7.                 if(num % i == 0)
  8.                         flag = 1;
  9.         }
  10.         if(flag)
  11.                 return false;
  12.         else
  13.                 return true;
  14. }

  15. int three(int num)
  16. {
  17.         int fact = 1;

  18.         for(int i = 2;i <= num - 1;++i)
  19.         {
  20.                 if(num % i == 0 && i > fact && IsPrime(i))
  21.                         fact = i;
  22.         }
  23.         return fact;
  24. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-21 23:06:02 | 显示全部楼层
#include <stdio.h>

int main(void){
        
        int prime, i;
        long long int n = 600851475143;
        for (i = 2; i < n; i++){
                if (n / i == 0){
                        break;
                }else if (n % i == 0){
                        n = n / i;
                }
        }
        
        printf("answer = %d", i);
        return 0;
}
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-8 15:02:38 | 显示全部楼层
  1. def checkprime(target):
  2.     for i in range(2,int(target/2 + 1)):
  3.         if not(target % i):
  4.             return False
  5.         elif i > int(target/2 - 1):
  6.             return True
  7.         
  8. def maxprime(tar):
  9.     fact = int(tar/2 + 1)
  10.     while fact > 2:
  11.         if not(tar % fact):
  12.             if checkprime(fact):
  13.                 break
  14.         fact -= 1
  15.     print(str(tar)+'的最大质数因子是:' + str(fact))
  16. #maxprime(5555)   
  17. maxprime(600851475143)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-10-8 06:00

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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