鱼C论坛

 找回密码
 立即注册
查看: 2440|回复: 5

[已解决]带你学c带你飞测试题第2 题

[复制链接]
发表于 2022-4-23 15:21:30 | 显示全部楼层 |阅读模式
10鱼币
#include<stdio.h>
#include<math.h>

int main()
{
        long long a,b,c,i;
        b=1;
        while(b!=600851475143)
        {
                a=2;
                i=1;
                for(;i<=a-1;i++,a++)
                {
                        if(a%i==0)
                        {
                                c=a;
                                b=b*a;
                        }
                }
        }
        printf("600851475143最大质数为%lld\n",c);
        return 0;
       
}
和小甲鱼的解题思路不同,但运行不了,想知道为啥 微信图片_20220423151932.png
最佳答案
2022-4-23 15:21:31
本帖最后由 傻眼貓咪 于 2022-4-23 17:46 编辑
不知君 发表于 2022-4-23 17:20
大佬,就是这种情况,应该用怎么样的思路呢


反向思路,一般都会先判断因数,再判断是否为质数,这样做只会重复很多次同样的循环。
可以试试先找质数,从 2 开始,再判断是否是因数(与 600851475143 除整)便可。
  1. #include <stdio.h>

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

  9. int foo (long long n) {
  10.     int prime = 2;
  11.     while (n > 1) {
  12.         while (!(n % prime)) {
  13.             n /= prime;
  14.         }
  15.         if (n == 1) break;
  16.         do {
  17.             prime++;
  18.         } while (!isPrime(prime));
  19.     }
  20.     return prime;
  21. }

  22. int main()
  23. {
  24.     printf("%d", foo(600851475143));

  25.     return 0;
  26. }
复制代码

最佳答案

查看完整内容

反向思路,一般都会先判断因数,再判断是否为质数,这样做只会重复很多次同样的循环。 可以试试先找质数,从 2 开始,再判断是否是因数(与 600851475143 除整)便可。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-4-23 15:21:31 | 显示全部楼层    本楼为最佳答案   
本帖最后由 傻眼貓咪 于 2022-4-23 17:46 编辑
不知君 发表于 2022-4-23 17:20
大佬,就是这种情况,应该用怎么样的思路呢


反向思路,一般都会先判断因数,再判断是否为质数,这样做只会重复很多次同样的循环。
可以试试先找质数,从 2 开始,再判断是否是因数(与 600851475143 除整)便可。
  1. #include <stdio.h>

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

  9. int foo (long long n) {
  10.     int prime = 2;
  11.     while (n > 1) {
  12.         while (!(n % prime)) {
  13.             n /= prime;
  14.         }
  15.         if (n == 1) break;
  16.         do {
  17.             prime++;
  18.         } while (!isPrime(prime));
  19.     }
  20.     return prime;
  21. }

  22. int main()
  23. {
  24.     printf("%d", foo(600851475143));

  25.     return 0;
  26. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-4-23 16:13:51 | 显示全部楼层
首先,你先要明白为什么这么多数字不用,偏偏要用 600851475143 这个数字?
因为这个数字足够大,其质数因子也相当大,这表示一般算法肯定不通,循环肯定超时(你试想想,需要循环多少次?)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-4-23 17:20:20 | 显示全部楼层
傻眼貓咪 发表于 2022-4-23 16:13
首先,你先要明白为什么这么多数字不用,偏偏要用 600851475143 这个数字?
因为这个数字足够大,其质数因 ...

大佬,就是这种情况,应该用怎么样的思路呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-4-23 17:50:13 | 显示全部楼层
前来学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-4-23 22:53:27 | 显示全部楼层
傻眼貓咪 发表于 2022-4-23 17:42
反向思路,一般都会先判断因数,再判断是否为质数,这样做只会重复很多次同样的循环。
可以试试先找质 ...

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-19 20:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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