质因数分解,各位码农们讲一下吧。

img

img


这个题目该怎么做鸭,能不能讲一下思路,代码。看了半天没看懂,不知道如何表达最大的质数。

思路,从最大的质因数找起

#include <stdio.h>
int isp(int n)
{
if (n < 2) return 0;
for (int i = 2; i < n; i++)
if (n % i == 0) return 0;
return 1;
}
int main()
{
    int n;
    scanf("%d",&n);
    for (int i = n - 1; i >=1; i--)
    {
        if (n % i == 0 && isp(i)) { printf("%d", i); return 0; }
    }
    return 0;
}

也可以这么写

#include <stdio.h>

int main()
{
    int n, i, j, maxPrime = 0;
    printf("请输入一个正整数n:");
    scanf("%d", &n);

    for(i = 2; i <= n; i++){
        if(n % i == 0){
            maxPrime = i; // 先记录当前的i,可能是最大的质因数
            while(n % i == 0){
                n /= i;
            }
        }
    }

    if(maxPrime != 0){
        printf("最大的质因数是:%d\n", maxPrime);
    }
    else{
        printf("%d没有质因数\n", n);
    }

    return 0;
}


用for循环遍历,检查循环变量是否为质数,同时是否是p的因子。如果是,则用p除以循环变量就是另一个因子,判断它是否为质数。找到第一个就行了

#include <stdio.h>
int isprime(int n)
{
    for(int i=2;i*i<=n;i++)
        if(n%i==0)
          return 0;
    return 1;
}
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=2;i*i<=n;i++)  
    {
        if(n%i==0 && isprime(i))
        {
             if(isprime(n/i))
             {
                printf("%d",n/i);
                break;
             }
        }
    }
}
  • 你可以看下这个问题的回答https://ask.csdn.net/questions/721771
  • 这篇博客也不错, 你可以看下搭个爬虫环境真麻烦。试了下书上的例子,一直报错,找了半天才知道是系统环境的问题,作者也不说明,浪费时间
  • 除此之外, 这篇博客: 函数体对结构体赋值的几种方法中的 通过形参赋值,可以有两种方式,一种是使用一级指针,一种是使用二级指针。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
    1. 使用一级指针进行赋值时,在原调用体内声明一个此结构体类型的变量,再用取地址获得变量的指针传达赋值函数内进行赋值。例子如下:
    #include <iostream>
    using namespace std;
    struct POINT {
        int a;
        int b;
    };
    void AssignPoint(POINT* p_pstPoint) {
        p_pstPoint->a = 1;
        p_pstPoint->b = 2;
    }
    int main() {
        POINT stPoint;
        AssignPoint(&stPoint);
        cout << stPoint.a << " " << stPoint.b << endl;
        return 0;
    }
    
    1. 使用二级指针时,则需要在调用体或者赋值体内对二级指针指向一级指针的内存进行申请。例子如下。第16行注释或不注释都行
      此种方法需要自己维护内存
    #include <iostream>
    using namespace std;
    struct POINT {
        int a;
        int b;
    };
    void AssignPoint(POINT** p_ppstPoint) {
        if((*p_ppstPoint) == nullptr) {
            (*p_ppstPoint) = (POINT*)malloc(sizeof(POINT));
        }
        (*p_ppstPoint)->a = 1;
        (*p_ppstPoint)->b = 2;
    }
    int main() {
        POINT* pstPoint = nullptr;
        pstPoint = (POINT*)malloc(sizeof(POINT));
        AssignPoint(&pstPoint);
        cout << pstPoint->a << " " << pstPoint->b << endl;
        return 0;
    }
    

    分析一下两种实现方式的原理和区别个人理解仅供参考

    • 使用第一种方式时在main函数内声明的stPoint变量存放在栈空间,并在栈空间开辟了一块空间用于存放POINT数据。
      此时对stPoint取地址得到它所在的地址(也就是所谓的一级指针,此指针指向POINT的栈空间)。将此地址作为实参传递给p_pstPoint时,p_pstPoint有自己的栈地址,其指向POINT的栈空间。所以stPoint和p_pstPoint指向同样的栈地址,所以对p_pstPoint指向的栈地址赋值,stPoint也能取到。当stPoint作用域结束时,这块栈空间自动被释放掉。
    • 使用第二种方式时在main函数声明的pstPoint 初始化指向nullptr空间。也就是pstPoint 有自己的栈地址,其指向一个为空的堆空间。再通过malloc对其分配堆空间使其指向一个部位
  • 您还可以看一下 韦语洋(Lccee)老师的一机一码加密、被破解自动销毁随时授权回收升级系列视频课程课程中的 演示如何破解一个软件绕过注册机(仅作为后续课程的了解)小节, 巩固相关知识点