鱼C论坛

 找回密码
 立即注册
查看: 2326|回复: 7

[已解决]求助,质因数问题!!

[复制链接]
发表于 2022-10-11 10:18:38 | 显示全部楼层 |阅读模式

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

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

x
给出一个正整数n,请问它的最大质因数是多少?

我的代码如下:
#include<stdio.h>
int main()
{
    int n,i,x,y,f[100],j=0;
    _Bool flag=1;
    for(i=n/2;i;i--)
    {
        if(!(n%i))
        {
            for(x=2;x<i;x++)
            {
                if(i%x==0)
                {
                    flag=0;
                }
            }
        }
        if(flag)
        {
            printf("%d",i);
        }
    }
    return 0;
   
}

不知道哪错了。。求大佬指正!!
最佳答案
2022-10-11 10:33:57
本帖最后由 jackz007 于 2022-10-11 13:45 编辑
  1. #include<stdio.h>
  2. int main()
  3. {
  4.     int n,i,x,y,f[100] , j=0 ;
  5.     int flag                 ;       // 用 int 就可以,免得麻烦
  6.     scanf("%d" , & n)        ;
  7.     for(i = n / 2 ; i ; i --) {
  8.         if(! (n % i)) {
  9.             flag = 1         ;       // 对于每一个 i 都需要事先假设其为素数
  10.             for(x = 2 ; x < i ; x ++) {
  11.                 if(i % x == 0) {
  12.                     flag = 0 ;
  13.                     break    ;       // 确定 i 不是素数后,没有必要继续循环
  14.                 }
  15.             }
  16.             if(flag) {
  17.                 printf("%d\n" , i) ;
  18.                 break              ; // 最大素数已经找到,也无需继续循环了
  19.             }
  20.         }
  21.     }
  22. }
复制代码

        这是我写的
  1. #include<stdio.h>

  2. int main(void)
  3. {
  4.         int i , k , n                ;
  5.         scanf("%d" , & n)            ;
  6.         for(i = 2 , k = n ; i * i < k + 1 ;) {
  7.                 if(! (k % i)) k /= i ;
  8.                 else i ++            ;
  9.         }
  10.         printf("%d\n" , k)           ;
  11. }
复制代码

        递归函数版
  1. #include<stdio.h>

  2. int foo(const int n)
  3. {
  4.         int i , r                         ;
  5.         for(i = n / 2 ; i > 1 ; i --) {
  6.                 if(! (n % i)) {
  7.                         r = foo(i)        ;
  8.                         break             ;
  9.                 }
  10.         }
  11.         return (i == 1) ? n : r           ;
  12. }

  13. int main(void)
  14. {
  15.         int n                             ;
  16.         scanf("%d" , & n)                 ;
  17.         printf("%d\n" , foo(n))           ;
  18. }
复制代码

        编译、运行实况:
  1. D:\[00.Exerciese.2022]\C>g++ -o x x.c

  2. D:\[00.Exerciese.2022]\C>x
  3. 1234567
  4. 9721

  5. D:\[00.Exerciese.2022]\C>
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-10-11 10:27:36 | 显示全部楼层
没导boolean的头文件吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-11 10:28:39 | 显示全部楼层
homeskating 发表于 2022-10-11 10:27
没导boolean的头文件吗?

头文件是<stdbool.h>
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-11 10:33:57 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2022-10-11 13:45 编辑
  1. #include<stdio.h>
  2. int main()
  3. {
  4.     int n,i,x,y,f[100] , j=0 ;
  5.     int flag                 ;       // 用 int 就可以,免得麻烦
  6.     scanf("%d" , & n)        ;
  7.     for(i = n / 2 ; i ; i --) {
  8.         if(! (n % i)) {
  9.             flag = 1         ;       // 对于每一个 i 都需要事先假设其为素数
  10.             for(x = 2 ; x < i ; x ++) {
  11.                 if(i % x == 0) {
  12.                     flag = 0 ;
  13.                     break    ;       // 确定 i 不是素数后,没有必要继续循环
  14.                 }
  15.             }
  16.             if(flag) {
  17.                 printf("%d\n" , i) ;
  18.                 break              ; // 最大素数已经找到,也无需继续循环了
  19.             }
  20.         }
  21.     }
  22. }
复制代码

        这是我写的
  1. #include<stdio.h>

  2. int main(void)
  3. {
  4.         int i , k , n                ;
  5.         scanf("%d" , & n)            ;
  6.         for(i = 2 , k = n ; i * i < k + 1 ;) {
  7.                 if(! (k % i)) k /= i ;
  8.                 else i ++            ;
  9.         }
  10.         printf("%d\n" , k)           ;
  11. }
复制代码

        递归函数版
  1. #include<stdio.h>

  2. int foo(const int n)
  3. {
  4.         int i , r                         ;
  5.         for(i = n / 2 ; i > 1 ; i --) {
  6.                 if(! (n % i)) {
  7.                         r = foo(i)        ;
  8.                         break             ;
  9.                 }
  10.         }
  11.         return (i == 1) ? n : r           ;
  12. }

  13. int main(void)
  14. {
  15.         int n                             ;
  16.         scanf("%d" , & n)                 ;
  17.         printf("%d\n" , foo(n))           ;
  18. }
复制代码

        编译、运行实况:
  1. D:\[00.Exerciese.2022]\C>g++ -o x x.c

  2. D:\[00.Exerciese.2022]\C>x
  3. 1234567
  4. 9721

  5. D:\[00.Exerciese.2022]\C>
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-10-11 15:00:30 | 显示全部楼层
jackz007 发表于 2022-10-11 10:33
这是我写的

        递归函数版

感谢大佬!!!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-10-11 23:27:05 | 显示全部楼层
jackz007 发表于 2022-10-11 10:33
这是我写的

        递归函数版

我想问一下
if(! (k % i)) k /= i ;
这一行代码是干啥的,,我看了半天没看懂。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-11 23:32:54 | 显示全部楼层
本帖最后由 jackz007 于 2022-10-11 23:35 编辑
灯火阑珊201 发表于 2022-10-11 23:27
我想问一下
if(! (k % i)) k /= i ;
这一行代码是干啥的,,我看了半天没看懂。。。


        k 一开始等于 n,i 从 2 开始,由小到大循环枚举 k 的因子,找到后,及时从 k 中进行剔除,k /= i 就是在进行剔除操作。等到循环结束的时候,k 自然就是一个素数了,而且,还是最大的那一个。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-10-11 23:42:57 | 显示全部楼层
jackz007 发表于 2022-10-11 23:32
k 一开始等于 n,i 从 2 开始,由小到大循环枚举 k 的因子,找到后,及时从 k 中进行剔除,k / ...

感谢感谢!!!懂了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-23 18:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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