鱼C论坛

 找回密码
 立即注册
查看: 2364|回复: 13

编写一个程序,求解 600851475143 的最大质数因子是多少

[复制链接]
发表于 2022-1-29 23:51:46 | 显示全部楼层 |阅读模式

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

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

x
#include <stdio.h>
int main()
{
       long long a;int flag=0;
       for(a=600851475142;a<600851475143;a--) //最大质数就是取余为0
       {
               if(600851475143%a==0)
               {
                       printf("%lld",a);
                       flag=1;
            }
                if(flag)     //找到了最大质数,flag就=1
                  break;    //跳出for循环
           }
          
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-1-30 09:08:37 | 显示全部楼层
这样做  ,首先你找不到最大质数,另外,就是循环次数太多了  
  1. s=600851475143
  2. a=[]
  3. def iss(n):
  4.     if n==1:return 0
  5.     for x in range(2,n):
  6.         if n%x==0:
  7.             return 0
  8.     return 1            

  9. for x in range(1,10001):
  10.     if iss(x):a.append(x)

  11. print(s,"=",end="")
  12. for y in a:
  13.     if s%y==0:
  14.         s//=y
  15.         if s==1:
  16.             print(y)
  17.         else:
  18.             print(y,"*",end="")     
  19. '''
  20. PS C:\Users\Administrator> & C:/Programs/Python/python.exe d:/wp/test7.py
  21. 600851475143 =71 *839 *1471 *6857
  22. '''
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-30 10:17:48 | 显示全部楼层
探测该数的所有因数:
  1. s=s1=600851475143
  2. a=[]
  3. def iss(n):
  4.     if n==1:return 0
  5.     for x in range(2,n):
  6.         if n%x==0:
  7.             return 0
  8.     return 1            

  9. for x in range(1,10001):
  10.     if iss(x):a.append(x)

  11. b=[]
  12. for y in a:
  13.     if s%y==0:
  14.         s//=y
  15.         b.append(y)

  16. import itertools
  17. m=[]
  18. for x in range(1,len(b)+1):
  19.     m.extend(list(itertools.combinations(b,x)))
  20. xh=1
  21. print("%2d: %12d = %d * %d"%(xh,s1,1,s1))
  22. for x in m:
  23.     t=1
  24.     for y in x:
  25.         t*=y
  26.     xh+=1   
  27.     print("%2d: %12d = %d * %d"%(xh,s1,t,s1//t))

  28. '''
  29. PS C:\Users\Administrator> & C:/Programs/Python/python.exe d:/wp/test7.py
  30. 1: 600851475143 = 1 * 600851475143
  31. 2: 600851475143 = 71 * 8462696833
  32. 3: 600851475143 = 839 * 716151937
  33. 4: 600851475143 = 1471 * 408464633
  34. 5: 600851475143 = 6857 * 87625999
  35. 6: 600851475143 = 59569 * 10086647
  36. 7: 600851475143 = 104441 * 5753023
  37. 8: 600851475143 = 486847 * 1234169
  38. 9: 600851475143 = 1234169 * 486847
  39. 10: 600851475143 = 5753023 * 104441
  40. 11: 600851475143 = 10086647 * 59569
  41. 12: 600851475143 = 87625999 * 6857
  42. 13: 600851475143 = 408464633 * 1471
  43. 14: 600851475143 = 716151937 * 839
  44. 15: 600851475143 = 8462696833 * 71
  45. 16: 600851475143 = 600851475143 * 1
  46. PS C:\Users\Administrator>
  47. '''   
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-30 11:57:42 | 显示全部楼层
本帖最后由 傻眼貓咪 于 2022-1-30 12:01 编辑

答案是 6857 吗?
  1. #include <stdio.h>

  2. int isPrime(long long n) {
  3.     if (n == 2 || n == 3) return 1;
  4.     for (long long i = 2; i * i < n; i++) if (!(n % i)) return 0;
  5.     return 1;
  6. }

  7. long long largestPrimeFactor(long long n) {
  8.     long long prime = 2;
  9.     while (n > 1) {
  10.         while (n % prime == 0) n /= prime;
  11.         if (n == 1) break;
  12.         do {
  13.             prime++;
  14.         } while (!isPrime(prime));
  15.     }
  16.     return prime;
  17. }

  18. int main()
  19. {
  20.     printf("%lld", largestPrimeFactor(600851475143));
  21.     return 0;
  22. }
复制代码
  1. 6857
复制代码


我的思路:
因为 600851475143 数字太大,不可能从 1 至 600851475143 测试是否为它的因数、质数两个测试,这样时间复杂度是不允许的。反方向思考,逐个找出小于 600851475143 的质数,然后再判断是否能除整,便是答案了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-30 12:11:50 | 显示全部楼层
Python
  1. from math import sqrt
  2. def isPrime(n):
  3.     if(n in (2, 3)): return True
  4.     for i in range(2, int(sqrt(n))):
  5.         if not n%i: return False
  6.     return True

  7. def largestPrimeFactor(n):
  8.     prime = 2
  9.     while n > 1:
  10.         while not n%prime: n /= prime
  11.         if n == 1: break
  12.         prime += 1
  13.         while not isPrime(prime):
  14.             prime += 1
  15.     return prime

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

使用道具 举报

 楼主| 发表于 2022-1-30 12:59:26 | 显示全部楼层
wp231957 发表于 2022-1-30 09:08
这样做  ,首先你找不到最大质数,另外,就是循环次数太多了

不好意思我才刚学c语言;你的是python吗;
我想问下为什么我的思路错了。比如36的最大质数不是18吗,取余为0吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-1-30 13:10:37 | 显示全部楼层
ksksasd 发表于 2022-1-30 12:59
不好意思我才刚学c语言;你的是python吗;
我想问下为什么我的思路错了。比如36的最大质数不是18吗,取 ...

就比如我把600851475143改成小一点的数就能计算出正确结果了

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

使用道具 举报

 楼主| 发表于 2022-1-30 13:22:47 | 显示全部楼层
ksksasd 发表于 2022-1-30 13:10
就比如我把600851475143改成小一点的数就能计算出正确结果了

我理解了这样不能算出质数因子;
我搞错定义了;
但为什么我的返回值是空白?
不应该打印最大除数吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-30 13:23:20 From FishC Mobile | 显示全部楼层
ksksasd 发表于 2022-1-30 12:59
不好意思我才刚学c语言;你的是python吗;
我想问下为什么我的思路错了。比如36的最大质数不是18吗,取 ...

18是质数吗,36的最大质因数就是3
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-1-30 14:51:43 | 显示全部楼层
wp231957 发表于 2022-1-30 13:23
18是质数吗,36的最大质因数就是3

谢谢你的回复!我搞错了质数定义了。
我的原代码中求的最大整除除数。返回值为空白。这个问题能帮我解决吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-1-30 14:52:55 | 显示全部楼层
ksksasd 发表于 2022-1-30 14:51
谢谢你的回复!我搞错了质数定义了。
我的原代码中求的最大整除除数。返回值为空白。这个问题能帮我解决 ...

但我把数字改小,就能得出正确答案。
long long 定义也应该没问题的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-30 18:39:22 | 显示全部楼层
本帖最后由 jhq999 于 2022-1-30 18:41 编辑
  1. int main()
  2. {
  3.         unsigned long long val=0,yinzi=2,s=1;
  4.         printf("输入一个数字:");
  5.         scanf_s("%llu",&val);

  6.         getchar();
  7.         for (int i = yinzi; i < val/yinzi ;i++)//任何一个数都可以分解成全部质数因子的积
  8.         {
  9.                 while(val%yinzi)//最小的因子一定是质数因子,最大的因子对应的一定是最小因子
  10.                 {
  11.                         yinzi++;
  12.                 }
  13.                 s*=yinzi;
  14.                 printf("%llu×",yinzi);
  15.                 val/=yinzi;
  16.                 while(!(val%yinzi))
  17.                 {
  18.                     val/=yinzi;
  19.                         s*=yinzi;
  20.                         printf("%llu×",yinzi);
  21.                 }
  22.         }

  23.         if(val>1)s*=val,printf("%llu=%llu",val,s);//质数因子的积
  24.         else
  25.                 printf("=%llu",s);
  26.         printf("最大质数因子:%llu",val>yinzi?val:yinzi);
  27.         return 0;
  28. }
复制代码

例如:98
2×49=2×7×7=98
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-30 22:47:27 | 显示全部楼层
ksksasd 发表于 2022-1-30 14:52
但我把数字改小,就能得出正确答案。
long long 定义也应该没问题的。

数字太大了,计算机得跑一段时间
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-28 22:41:24 | 显示全部楼层
  1. int func2(long long num){
  2.         long long i=2;
  3.         while(i!=num){
  4.                 if(num%i==0)
  5.                         num=num/i;
  6.                 else{
  7.                         i++;
  8.                 }
  9.         }
  10.         return num;
  11. }
复制代码

大概就是依次拆解掉最小的因子,最后得到的质数商就是要求的最大质数因子
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-25 02:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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