鱼C论坛

 找回密码
 立即注册
查看: 15796|回复: 145

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

  [复制链接]
发表于 2015-4-20 23:21:44 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 欧拉计划 于 2017-1-14 17:43 编辑
Largest prime factor

The prime factors of 13195 are 5, 7, 13 and 29.

What is the largest prime factor of the number 600851475143 ?


题目:

13195 的质数因子有 5, 7, 13 和 29。

600851475143 的最大质数因子是多少?



评分

参与人数 1贡献 +1 收起 理由
cwhsmile + 1 6857用时0.15s

查看全部评分

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

使用道具 举报

发表于 2015-5-17 19:24:23 | 显示全部楼层
>>> def pr(i):
        for x in range(2,i//2):
                if i % x == 0:
                        return False
        else :
                return True


>>> def pf(x):
        i=x//2
        while i:
                if (x % i == 0):
                        if pr(i):
                                return i
                i -= 1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-6-29 16:25:45 | 显示全部楼层
本帖最后由 翅膀团 于 2015-11-16 14:08 编辑

#include <stdio.h>

int main(void)
{
    int i,j,max=0,temp;
   
  for(i=2;i<600851475143;i++)
    {
        if(600851475143 % i == 0)
        {
            for(j=2;j<i;j++)
            {
            if(i % j ==0)
            {
                goto z;
            }
            }
            max = i;
z:         temp = 0;
        }
    }
    printf("%d\n",max);
}

如果有错误希望指出
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2015-7-9 13:12:20 | 显示全部楼层
本帖最后由 无名侠 于 2015-7-9 13:18 编辑

求大神优化。。
factor(600851475143)  跑了几分钟了,。。。。。:huffy:

71
839
1471
6857
输出上面内容后就很久没有再次输出了  先挂一天吧。

@小甲鱼

  1. def prime (x):
  2.         if x<=1:
  3.                 return False
  4.         for j in range(2,x):
  5.                 if not(x%j):
  6.                         return  False
  7.         return True
  8. def factor(x):
  9.         for j in range(1,x+1):
  10.                 if not(x%j):
  11.                         if(prime(j)):
  12.                                 print(j)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-7-9 13:20:19 | 显示全部楼层
Mikel 发表于 2015-5-17 19:24
>>> def pr(i):
        for x in range(2,i//2):
                if i % x == 0:

你这个算法有些慢。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-7-19 22:04:58 | 显示全部楼层
不废话 用支持C99标准的编译器 使用unsigned long long int 即可装下600851475143
  1. #include <stdio.h>
  2. void main()
  3. {
  4.         unsigned long long int n,i;
  5.         printf("\nplease input a number:\n");
  6.         scanf("%llu",&n);
  7.         printf("%llu=",n);
  8.         for(i=2;i<=n;i++)/*从小数除起可以确保该数为质数所以不必判断是否为质数*/
  9.                 while(n!=i)/*如果除数不等于被除数就判断能否整除*/
  10.                 {
  11.                         if(n%i==0)/*如果可以整除就将除数输出并被除数 = 商*/
  12.                         {
  13.                                 printf("%llu*",i);
  14.                                 n=n/i;
  15.                         }
  16.                         else
  17.                                 break;/*如果除数等于被除数说明已经是最后一个质因数结束循环将其输出*/
  18.                 }
  19.                 printf("%llu",n);
  20. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 2 反对 1

使用道具 举报

发表于 2015-10-8 16:32:56 | 显示全部楼层

def prime(x):
    is_prime = 1
   
    if x == 1:
     #   print('%d不是质数'%x)
        is_prime = 0
    else:
        for i in range(2,x):
            if x % i ==0:
                is_prime = 0
                break
    #    if is_prime == 1 :
    #        print('%d是质数'%x)
    #    else:
    #        print('%d不是质数'%x)
    return is_prime

def list_prime(x):
    s=[]

    for i in range(1,x+1):
        if prime(i) == 1:
            s.append(i)
    #print('%d'%x + '前的质数序列:%s'%str(s))
    return s
        


def last_prime(x):

    if prime(x) == 1:
        print('%d'%x+'的最大质数因子为:%d'%x)
    else:
        s1 = []

        for i in list_prime(x):
            if x % i == 0:
                s1.append(i)
        print('%d'%x + '的质数因子是:%s'%str(s1))
               
        print('%d'%x + '的最大质数因子是:%d'%(s1[len(s1)-1]))
   
=================================
发现自己写的好复杂呀,差距还是很大的和别人的代码!求指教
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

匿名鱼油  发表于 2015-10-30 16:07:55
大数用了__int64类型

输出结果:
please input a Composite number:600851475143
the No.1 number is 7
the No.2 number is 17
the No.3 number is 47
the No.4 number is 688543


  1. #include <stdio.h>
  2. #include <math.h>


  3. bool IsPrimeNumber(__int64);

  4. int main()
  5. {
  6.         __int64 a = 1; //合数
  7.         __int64 i = 0; //可能的质数因子
  8.         __int64 j = 1; //质数因子序号

  9.         printf("please input a Composite number:");
  10.         scanf ("%l64d",&a);

  11.         for(i = 2;i < a;i ++)
  12.         {
  13.                 if(a % i == 0)
  14.                 {
  15.                        
  16.                         if(IsPrimeNumber(i) == 1)
  17.                         {
  18.                                 printf("the No.%I64d number is %I64d \n",j,i);
  19.                                 j ++;
  20.                         }

  21.                 }
  22.                        
  23.         }
  24.         return 0;
  25. }

  26. // 判断n是否为质数
  27. bool IsPrimeNumber(__int64 n)
  28. {
  29.     if (n==2)
  30.     {
  31.         return true;
  32.     }

  33.     if (n%2==0)
  34.     {
  35.         return false;
  36.     }

  37.     int sqrtn=(int)sqrt((double)n);
  38.     bool flag=true;

  39.     for (int i=3;i<=sqrtn;i+=2)
  40.     {
  41.         if (n%i==0)
  42.         {
  43.             flag=false;
  44.         }
  45.     }
  46.     return flag;
  47. }
复制代码


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

使用道具

发表于 2016-3-16 10:57:16 | 显示全部楼层
本帖最后由 ianv 于 2016-3-16 11:28 编辑
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<math.h>
  4. #include<time.h>
  5. int isprime(unsigned long long int num)
  6. {
  7.         unsigned long long int i=2;
  8.         for (i;i<=(int)sqrt((double)num);i++)
  9.         {
  10.                 if (num%i==0)
  11.                         return 0;
  12.         }
  13.         return 1;
  14. }
  15. int findmaxprimefactor(unsigned long long int num)
  16. {

  17.         unsigned long long int Maxfactor=(int)sqrt((double)num);
  18.         unsigned long long int lastfactor,factor;
  19.         if (num%2==0)
  20.         {
  21.                 lastfactor=2;
  22.                 num=num/2;
  23.                 while (num%2==0)
  24.                         num=num/2;
  25.         }
  26.         else
  27.                 lastfactor=1;
  28.         factor=3;
  29.         while((num>1)&&(factor<Maxfactor))
  30.         {
  31.                 if ((num%factor==0)&&(isprime(factor)))
  32.                 {
  33.                         /*printf("%u\n",i);*/
  34.                         num/=factor;
  35.                         lastfactor=factor;
  36.                         while(num%factor==0)
  37.                                 num/=factor;       
  38.                         Maxfactor=(int)sqrt((double)num);
  39.                 }
  40.                 factor+=2;
  41.         }
  42.         if (num==1)
  43.                 return lastfactor;
  44.         else
  45.                 return num;
  46. }

  47. int main()
  48. {
  49.         double start, finish;
  50.         start = clock();//取开始时间
  51.         printf("%d",findmaxprimefactor(600851475143));
  52.         finish = clock();//取结束时间
  53.         printf( "\n%f seconds\n",(finish - start) / CLOCKS_PER_SEC);//以秒为单位显示之
  54.         getchar();
  55. }
复制代码

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

使用道具 举报

发表于 2016-4-19 11:02:10 | 显示全部楼层
import math as m
def isprime(n):
    if n <= 1:
        return 0
    i=2
    while i * i <= n:
        if n % i == 0:
            return 0
        i += 1
    return 1

a = int(input('please enter a number'))
b =int(m.sqrt(a))
while b > 0:
    s = isprime(b)
    if (a % b ==0) and (s == 1):
        break
    b -=1


print(b)

将近一分钟,有没有好的算法
从小的开始
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-5-1 22:39:42 | 显示全部楼层
  1. from math import sqrt, floor

  2. def is_prime(num):
  3.     for i in range(2, floor(sqrt(num)) + 1):
  4.         if num%i == 0:
  5.             return False
  6.     return True

  7. def largest_prime_factor(num=600851475143):
  8.     n = floor(sqrt(num))
  9.     while n > 1:
  10.         if is_prime(n) and num%n == 0:
  11.             return n
  12.         n -= 1
  13.     return -1
  14.    
  15. print(largest_prime_factor())
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 0 反对 2

使用道具 举报

发表于 2016-5-4 22:23:05 | 显示全部楼层
本帖最后由 Liu_xy 于 2016-5-4 22:26 编辑
  1. import math
  2. import time
  3. start = time.clock()
  4. list1 = []
  5. Num = 600851475143
  6. def isPrime(x):
  7.     ret = 0
  8.     for i in range(2, int(math.sqrt(x))):
  9.         if x%i==0:
  10.             ret = 1
  11.     return ret

  12. for i in range(2, int(math.sqrt(Num))):
  13.     if Num % i == 0:
  14.         if isPrime(i) == 0:
  15.             list1.append(i)
  16.         men1 = Num/i
  17.         if isPrime(men1) == 0:
  18.             list1.append(men1)
  19. print(max(list1))
  20. print(list1)
  21. end = time.clock()
  22. print("read:%f s" %(end - start))
复制代码



6857
[71, 839, 1471, 6857]
read:0.209758 s
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 1

使用道具 举报

发表于 2016-6-10 16:00:45 | 显示全部楼层
本帖最后由 飘飞的白杨 于 2016-6-10 16:15 编辑
  1. n = 600851475143*71
  2. i = 2
  3. l = []
  4. while i<=n:
  5.         if n%i==0:
  6.                 while n%i==0:
  7.                         n=n//i
  8.                 l.append(i)
  9.         i+=1
  10. print(l)
  11. print(l[-1])
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 2 反对 0

使用道具 举报

发表于 2016-6-13 13:30:09 | 显示全部楼层
  1. shu=600851475143
  2. zhishu=[2]
  3. x=1
  4. xx=0
  5. while 1:
  6.     x+=2
  7.     z=1
  8.     for i in zhishu:
  9.         if x%i==0: z=0
  10.     if z:
  11.         zhishu.append(x)
  12.     if shu%x==0:
  13.         xx=x
  14.         shu=shu/x
  15.     if x>=shu:
  16.         break

  17. print(xx)
复制代码

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

使用道具 举报

发表于 2016-7-4 15:57:31 | 显示全部楼层
n=600851475143
a=2
while n!=a:
        if n%a==0:
                n=int(n/a)
        a+=1
        if n==a:
                print('最大质数是',a)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

发表于 2016-7-4 16:05:44 | 显示全部楼层
  1. def primer(x):
  2.     for n in range(2,x + 1 // 2):
  3.         if x % n == 0:
  4.             return 0
  5.     return x
  6.    

  7. num = 600851475143

  8. for i in range(2,num + 1):
  9.     if primer(i):
  10.         if num % i == 0:
  11.             print(i)
复制代码

  1. #include <stdio.h>

  2. unsigned long long primer_factor(unsigned long long n)
  3. {
  4.     unsigned long long x;
  5.     for(x = 2; x <= n / 2; x++)
  6.     {
  7.         if(n % x == 0)
  8.         return 0;
  9.     }
  10.     return n;
  11. }
  12. int main()
  13. {
  14.     unsigned long long num = 600851475143;
  15.     unsigned long long i, j;
  16.     for(i = 2; i <= num; i++)
  17.     {
  18.         //printf("0");
  19.         if (j = primer_factor(i))
  20.         {
  21.             if(num % j == 0)
  22.                 printf("%u\n",j);
  23.         }
  24.     }
  25.     return 0;
  26. }
复制代码


71/839/1471/6857   之后就没有反应了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-7 17:44:53 | 显示全部楼层
#/usr/bin/env python
#coding:utf-8
'''
13195的质数因子有5,7,13和29.

600851475143的最大质数因子是多少?

'''
num=600851475143

def isPrime(number):
    '''判断一个数是不是质数,如果是返回真,否则返回假'''
    if number<2:
        return False
    if number == 2:
        return True
    for i in range(2,int(number**0.5)+1):
        if number%i==0:
            return False
    return True

def largestPrimeFactor(num):

    for m in range(int(num**0.5),0,-1):
        if num%m==0:
            if isPrime(m):
                return m
    return None


m=largestPrimeFactor(num)
print(m)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-7 17:49:48 | 显示全部楼层
  1. #/usr/bin/env python
  2. #coding:utf-8
  3. '''
  4. 13195的质数因子有5,7,13和29.

  5. 600851475143的最大质数因子是多少?

  6. '''
  7. num=600851475143

  8. def isPrime(number):
  9.     '''判断一个数是不是质数,如果是返回真,否则返回假'''
  10.     if number<2:
  11.         return False
  12.     if number == 2:
  13.         return True
  14.     for i in range(2,int(number**0.5)+1):
  15.         if number%i==0:
  16.             return False
  17.     return True

  18. def largestPrimeFactor(num):

  19.     for m in range(int(num**0.5),0,-1):
  20.         if num%m==0:
  21.             if isPrime(m):
  22.                 return m
  23.     return None


  24. m=largestPrimeFactor(num)
  25. print(m)
复制代码

1秒钟就出结果  还发现一个规律如果如果一个数没有质因数,那么它本身肯定是一个质数
正如算数基本定理:每一个合数都可以以唯一形式被写成质数的乘积,即分解质因数。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-11 10:46:41 | 显示全部楼层
好吧数据太大,,只能用long long了
  1. #include <iostream>
  2. #include <cmath>

  3. using namespace std;

  4. bool IsPrime(const unsigned long long & data)
  5. {
  6.     unsigned long long i;
  7.     for (i = 2; i <= sqrt(data); i++)
  8.     {
  9.         if (data % i == 0)
  10.         {
  11.             return false;
  12.         }
  13.     }
  14.     return true;
  15. }

  16. unsigned long long MaxFact(const unsigned long long & data)
  17. {
  18.     unsigned long long i;
  19.     for (i = data-1; i > 1; i--)
  20.     {
  21.         if (data % i == 0 && IsPrime(i))
  22.         {
  23.             return i;
  24.         }
  25.     }
  26.     return 1;
  27. }

  28. int main()
  29. {
  30.     unsigned long long n;
  31.     cout<<"输入数据:";
  32.     cin>>n;
  33.     if (n <= 0)
  34.     {
  35.         cout<<"输入必须大于1"<<endl;
  36.         return 1;
  37.     }
  38.     cout<<n<<"的最大质因数为:"<<MaxFact(n)<<endl;
  39.     return 0;
  40. }
复制代码


期待更好的思路。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-18 15:28:57 | 显示全部楼层
71
839
1471
6857
  1. import math
  2. def judgePrimes(num):         #剽窃了鱼哥的素数判断算法
  3.     if num%2 == 0:
  4.         return False
  5.     for i in range(3,int(math.sqrt(num))+1,2):
  6.         if not num%i:
  7.             return False
  8.     else:
  9.         return True

  10. def bigPrimeNum(num):          #用了递归的方法
  11.     if judgePrimes(num):
  12.         return num
  13.     for i in range(3,num):
  14.         if num%i == 0:
  15.             print(i)
  16.             return bigPrimeNum(num//i)

  17. if __name__ == '__main__':
  18.     print(bigPrimeNum(600851475143))
复制代码


算法效率不错,几秒钟出结果
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 3 反对 0

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-25 19:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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