fishc098 发表于 2019-7-22 17:50:11

C语言编程遇到的问题

求出num的最大质数因子。

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

int main()
{
    long long i, j, k, num = 600851475143;
    _Bool flag1 = 1;//判断质数
    _Bool flag2 = 0;//判断约数
       
    for (i = num; i > 2; i--)
    {
      if (num % i == 0)
      {
              flag2 = 1;
            k = sqrt((double)i);
            for (j = 2; j <= k; j++)
            {
                if (i % j == 0)
                {
                  flag1 = 0;
                  break;
                }
            }
            if (flag1 == 1 && flag2 == 1)
            {
                break;
            }
            else
            {
                    flag2 = 0;
                    flag1 = 1;
                        }
      }
    }

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

    return 0;
}

运行没有结果{:10_254:}
哪位大神帮忙看看错误在哪,并给出修改建议。

一木之禾 发表于 2019-7-22 18:08:29

如果我没有理解错的话,应该是这里有问题,上面第一个break意思是找到了答案吧,那时候你的flag1赋值为0,下面这里却判断它是不是为1,那当然就跳不出循环了。你想一下,修改修改。
if (flag1 == 1 && flag2 == 1)
            {
                break;
            }

micolar 发表于 2019-7-22 20:33:38

思路没问题
应该是超时吧
你那个不用从600851475143判断
假设一下 如果有一个数10000 那么这个数的最大质因子要么它本身 要么小于等于他的根号也就是100 这个你要想一下为什么比较好
题目说了 它是合数 所以不用判断它是否是质数
所以我判断1000000内的数就可以了

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

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

我是先筛选素数在判断是不是因子
筛选素数的思路很简单 素数的倍数不是素数 用数组辅助求得一定范围内的素数然后判断

micolar 发表于 2019-7-22 20:36:47

我帮你试了 你把i的范围改小一点就可以了 要大于等于sqrt( 600851475143) (我用的是1000000)
答案就出了

micolar 发表于 2019-7-22 20:43:30

然后我也发现我的错误 我做多余了 判断素数还不如判断因子来的快 谢谢

fishc098 发表于 2019-7-23 10:43:33

本帖最后由 fishc098 于 2019-7-23 11:14 编辑

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

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

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

    return 0;
}

fishc098 发表于 2019-7-23 11:16:21

这种算法可以很好地提高程序运行效率,但是其中的思想我不是很能理解,希望能够互相交流学习!
页: [1]
查看完整版本: C语言编程遇到的问题