鱼C论坛

 找回密码
 立即注册
查看: 1575|回复: 6

[已解决]C语言编程遇到的问题

[复制链接]
发表于 2019-7-22 17:50:11 | 显示全部楼层 |阅读模式

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

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

x
求出num的最大质数因子。

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

  3. int main()
  4. {
  5.     long long i, j, k, num = 600851475143;
  6.     _Bool flag1 = 1;//判断质数
  7.     _Bool flag2 = 0;//判断约数
  8.        
  9.     for (i = num; i > 2; i--)
  10.     {
  11.         if (num % i == 0)
  12.         {
  13.                 flag2 = 1;
  14.             k = sqrt((double)i);
  15.             for (j = 2; j <= k; j++)
  16.             {
  17.                 if (i % j == 0)
  18.                 {
  19.                     flag1 = 0;
  20.                     break;
  21.                 }
  22.             }
  23.             if (flag1 == 1 && flag2 == 1)
  24.             {
  25.                 break;
  26.             }
  27.             else
  28.             {
  29.                     flag2 = 0;
  30.                     flag1 = 1;
  31.                         }
  32.         }
  33.     }

  34.     printf("最大质数因子为%lld\n", i);

  35.     return 0;
  36. }
复制代码


运行没有结果
哪位大神帮忙看看错误在哪,并给出修改建议。
最佳答案
2019-7-22 20:33:38
思路没问题  
应该是超时吧
你那个不用从600851475143判断
假设一下 如果有一个数10000 那么这个数的最大质因子要么它本身 要么小于等于他的根号也就是100 这个你要想一下为什么比较好
题目说了 它是合数 所以不用判断它是否是质数
所以我判断1000000内的数就可以了

那个欧拉计划我也有做过这道题

#include<stdio.h>
int a[1000001];
int main(){
        int i,j;
        for(i = 2; i <= 500000;i++){
                for(j = i * 2;j <=1000000;j += i)
                        a[j] = 1;
        }
        for(i = 999999;i >= 2; i-- )
        if(a[i] == 0 && 600851475143%i == 0){
                printf("%d",i);
                return 0;
        }
        
        printf("600851475143");
        
        return 0;
}

我是先筛选素数在判断是不是因子
筛选素数的思路很简单 素数的倍数不是素数 用数组辅助  求得一定范围内的素数然后判断
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-7-22 18:08:29 | 显示全部楼层
如果我没有理解错的话,应该是这里有问题,上面第一个break意思是找到了答案吧,那时候你的flag1赋值为0,下面这里却判断它是不是为1,那当然就跳不出循环了。你想一下,修改修改。
  1. if (flag1 == 1 && flag2 == 1)
  2.             {
  3.                 break;
  4.             }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-7-22 20:33:38 | 显示全部楼层    本楼为最佳答案   
思路没问题  
应该是超时吧
你那个不用从600851475143判断
假设一下 如果有一个数10000 那么这个数的最大质因子要么它本身 要么小于等于他的根号也就是100 这个你要想一下为什么比较好
题目说了 它是合数 所以不用判断它是否是质数
所以我判断1000000内的数就可以了

那个欧拉计划我也有做过这道题

#include<stdio.h>
int a[1000001];
int main(){
        int i,j;
        for(i = 2; i <= 500000;i++){
                for(j = i * 2;j <=1000000;j += i)
                        a[j] = 1;
        }
        for(i = 999999;i >= 2; i-- )
        if(a[i] == 0 && 600851475143%i == 0){
                printf("%d",i);
                return 0;
        }
        
        printf("600851475143");
        
        return 0;
}

我是先筛选素数在判断是不是因子
筛选素数的思路很简单 素数的倍数不是素数 用数组辅助  求得一定范围内的素数然后判断
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-7-22 20:36:47 | 显示全部楼层
我帮你试了 你把i的范围改小一点就可以了 要大于等于sqrt( 600851475143) (我用的是1000000)
答案就出了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-7-22 20:43:30 | 显示全部楼层
然后我也发现我的错误 我做多余了 判断素数还不如判断因子来的快 谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-23 10:43:33 | 显示全部楼层
本帖最后由 fishc098 于 2019-7-23 11:14 编辑

谢谢大家的帮助,我已经得出结果啦!
代码修改如下
  1. #include <stdio.h>
  2. #include <math.h>

  3. int main()
  4. {
  5.     long long i,max,num = 600851475143;
  6.         
  7.     for (i = 2; i <= sqrt((double)num); i++)//从2到根号n求其质因数
  8.     {
  9.         while(num % i == 0)//因为一个质因数可能会乘多次,所以应该用while,而不是if
  10.         {
  11.                 max = i;                //让max指向当前最大值
  12.                 num /= i;                //除以质因数
  13.                 }
  14.                 if(1 == num)
  15.                 break;
  16.     }
  17.    
  18.     if(num != 1)//如果n不等于1,说明存在一个大于根号num的质因数,有且仅有一个,即等于当前的num
  19.     max = num;

  20.     printf("最大质数因子为%lld\n", max);

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

使用道具 举报

 楼主| 发表于 2019-7-23 11:16:21 | 显示全部楼层
这种算法可以很好地提高程序运行效率,但是其中的思想我不是很能理解,希望能够互相交流学习!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-24 12:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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