鱼C论坛

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

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

  [复制链接]
发表于 2022-1-27 14:03:24 | 显示全部楼层
  1. #include <cstdio>
  2. #include <cmath>
  3. #include <vector>
  4. using std::vector;
  5. int main()
  6. {
  7.     vector<long long> factor;
  8.     long long num = 600851475143;
  9.     int i = 2;
  10.     while(1)
  11.     {
  12.         for(i=2;i<sqrt(num)+1;i++)
  13.         {
  14.             if(num%i==0)
  15.             {
  16.                 factor.push_back(i);
  17.                 num /= i;
  18.                 goto continuetodo;
  19.             }
  20.         }
  21.         factor.push_back(num);
  22.         break;
  23.         continuetodo:;
  24.     }
  25.     long long max = 0;
  26.     vector<long long>::iterator it;
  27.     for(it=factor.begin();it!=factor.end();it++)
  28.         if(*it>max)
  29.             max = *it;
  30.     printf("%d",max);
  31. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-2-22 22:05:39 | 显示全部楼层
  1. package main

  2. import (
  3.         "fmt"
  4.         "math"
  5.         "time"
  6. )

  7. //题目3:
  8. //
  9. //13195 的质数因子有 5, 7, 13 和 29。
  10. //
  11. //600851475143 的最大质数因子是多少?
  12. func main() {
  13.         t := time.Now()
  14.         limit := int64(math.Sqrt(600851475143))
  15.         var remain int64 = 600851475143
  16.         var max int64 = 2
  17.         var i int64
  18.         fmt.Println("分解质因数:")
  19.         for i = 2; i < limit; i++ {
  20.                 if remain%i == 0 {
  21.                         remain /= i
  22.                         fmt.Println(i)
  23.                         if i > max {
  24.                                 max = i
  25.                         }
  26.                         i = 2
  27.                 }
  28.         }
  29.         if remain > max {
  30.                 max = remain
  31.         }
  32.         fmt.Println("最大质因数是: ", max)
  33.         tt := time.Now()
  34.         fmt.Println("耗时:", (tt.Nanosecond()-t.Nanosecond())/1e6, "ms")
  35. }
复制代码

输出:
  1. GOROOT=C:\Program Files\Go #gosetup
  2. GOPATH=C:\Users\Administrator\go #gosetup
  3. "C:\Program Files\Go\bin\go.exe" build -o C:\Users\Administrator\AppData\Local\Temp\GoLand\___2go_build_GoProject_src.exe C:\Users\Administrator\Documents\GoProject\src\Euler03.go #gosetup
  4. C:\Users\Administrator\AppData\Local\Temp\GoLand\___2go_build_GoProject_src.exe
  5. 分解质因数:
  6. 71                  
  7. 839                  
  8. 1471                 
  9. 6857                 
  10. 最大质因数是:  6857
  11. 耗时: 2 ms         

  12. 进程 已完成,退出代码为 0
复制代码

Go语言果然运行速度比Python快非常多
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-16 15:27:43 | 显示全部楼层
本帖最后由 B1tetheDust 于 2022-3-16 15:46 编辑
  1. import math
  2. import time


  3. class FindPrimeFactor:

  4.     def __init__(self, num):
  5.         self.num = self.max_prime = num
  6.         self.find_factor()
  7.         print(self.max_prime)

  8.     @staticmethod
  9.     def find_prime(a_num):
  10.         is_prime = 1
  11.         for i in range(2, int(math.sqrt(a_num) + 1)):
  12.             if a_num % i == 0:
  13.                 is_prime = 0
  14.         return is_prime

  15.     def find_factor(self):
  16.         divisor = int(math.sqrt(self.num))
  17.         while (divisor - 1):
  18.             if self.num % divisor == 0:
  19.                 if self.find_prime(divisor):
  20.                     self.max_prime = divisor
  21.                     break
  22.             divisor -= 1


  23. start = time.perf_counter()
  24. test = FindPrimeFactor(600851475143)
  25. end = time.perf_counter()
  26. print((end - start))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-21 11:53:34 | 显示全部楼层
import math


def prime_calc(num):
    """计算这个数字是否是质数
    质数:除了1和本身因数以外无其他
    """
    for x in range(2, int(math.sqrt(num) + 1)):
        if num % x == 0:
            return -1

    return num


def max_prime(num):
    """
    : 这里面最大的收获是一个数的质因数 肯定是在更号区间前一个 和更号区间后一个
    :如此即可将数据范围缩小一个幂次方  加速计算效率
    :param num:
    :return:
    """
    prime_list = []
    for x in range(2, int(math.sqrt(num))):
        if num % x == 0 and prime_calc(x) != -1:
            prime_list.append(x)
    print(prime_list)
    print('最大质数因子:', max(prime_list))


if __name__ == '__main__':
    max_prime(600851475143)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-6-28 17:41:55 | 显示全部楼层
num = 13195
list = []
list1 = []
#先用for循环寻找所有的因子并存储list
for i in range(1, num):
    if num % i == 0:
        list.append(i)
print(list)
# 用两个for循环来判断list中的因子那些是质数
for j in list:
    if (j != 1) and (j != num):
        for k in range(2, j):
            if j % k == 0 :
                break
        else:
            list1.append(j)
print(list1)
print("最大质数因子为%d"%list1[-1])
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-8 11:15:20 | 显示全部楼层
  1. use rayon::prelude::*;
  2. use std::time::Instant;

  3. const N: i64 = 600851475143;

  4. fn main() {
  5.     let now = Instant::now();
  6.     let primes = make_prime();
  7.     let num = primes
  8.     .into_par_iter()
  9.     .filter(|x| N % x == 0)
  10.     .max()
  11.     .unwrap();
  12.     println!("{}", num);
  13.     println!("耗时{}秒。", now.elapsed().as_secs_f32())
  14. }

  15. fn make_prime() -> Vec<i64> {
  16.     let mut primes = Vec::new();
  17.     let mut cur = 10;
  18.     // bootstrap
  19.     for i in 2..cur {
  20.         if primes.iter().all(|p| i % p != 0) {
  21.             primes.push(i);
  22.         }
  23.     }
  24.     let n = (N as f64).sqrt() as i64 + 1;
  25.     while cur < n {
  26.         let next = std::cmp::min(cur * cur, n);
  27.         let mut addition: Vec<_> = (cur..next)
  28.             .into_par_iter()
  29.             .filter(|x| {
  30.                 for p in primes.iter() {
  31.                     if x % p == 0 {
  32.                         return false;
  33.                     }
  34.                     if x / p < *p {
  35.                         break;
  36.                     }
  37.                 }
  38.                 true
  39.             })
  40.             .collect();
  41.         primes.append(&mut addition);
  42.         cur = next;
  43.     }
  44.     primes
  45. }
复制代码

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

使用道具 举报

发表于 2022-11-8 20:11:05 | 显示全部楼层
  1. long long factor(long long n) {//找出一个合数的最大质数因子
  2.         if (n == 2)return 2;
  3.         if (n % 2 == 0) return factor(n / 2);
  4.         for (int i = 3; i <= (sqrt(n)); i=i+2) {
  5.                 if (n % i == 0) return factor(n / i);
  6.         }
  7.         return n;
  8. }
复制代码


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

使用道具 举报

发表于 2023-2-10 15:36:42 | 显示全部楼层
for i in range(2,int(x**0.5)+1):
        if x%i==0:
                for m in range(2,i):
                        if i%m==0:
                                break
                        if m==i-1:
                                print(i)
                                max=i
                for k in range(2,int(pow(x/i,0.5))+1):
                        if i%k==0:
                                break
                        if k==int(pow(x/i,0.5)):
                                print(i)
                                max=i
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-6 15:24:38 | 显示全部楼层
#include <stdio.h>

int main() {
        long long int n;
        scanf("%lld", &n);
        printf("%lld=1", n);
        for (int i = 2; i <= n + 1; i++) {
                if (n % i == 0) {
                        printf("*%lld", i);
                        n /= i;
                }
        }

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

使用道具 举报

发表于 2023-5-11 11:09:20 | 显示全部楼层
1ms
  1. #include <bits/stdc++.h>
  2. using namespace std;

  3. typedef long long LL;
  4. LL x = 600851475143,ans;

  5. int main()
  6. {
  7.     for(LL i=2;i<=x;i++)
  8.         if(x%i==0)
  9.         {
  10.             ans = max(ans,i);
  11.             while(x%i==0) x /= i;
  12.         }
  13.     if(x>1) ans = x;
  14.     cout<<ans<<endl;
  15.     return 0;
  16. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-18 09:50:33 | 显示全部楼层
#include<stdio.h>
#include<math.h>

int Determine(int i);
int Determine(int i)
{
        int n;
        if(i==1)
        {
                return 0;
        }
        if(i==2)
        {
                return i;
        }
        else if(i%2==0)
        {
                return 0;
        }
        else
        {
                for(n=2;n<=pow(i,0.5);n++)
                {
                        if(i%n==0)
                        {
                                return 0;
                        }
                }
                return i;
        }
}

int main(void)
{
        int i,k;
        unsigned long long int sum=1;
       
        for(i=1;i<=20;i++)
        {
                k=Determine(i);
                if(k)
                {
                        for(k;k*k<=20;k=k*k)
                        {
                                ;
                        }
                        printf("%d\n",k);
                        sum=sum*k;
                }
        }
        printf("最小的能被 1-20 中每个数整除的正整数是%lld\n",sum);
        return 0;
}

//思路
/*
2->2
3->3
2->4
5->5

7->7
2->8
3->9

11->11

13->13


2->16
17->17

19->19

利用一个定理,任何一个合数都可以拆成 质数积 形式,用集合(且可以多同一元素)取并集

还可以质数的次方判断
但必须引入一个纯合数的概念,质数积 形式=全部为同一个质数。
在它的前面,不可能有比它还需要(在数量上)这同一个质数的数了
*/
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-18 09:51:21 | 显示全部楼层

应该算是最简单的了,笔算可以出
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-13 03:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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