自学内容网 自学内容网

华为OD机试 - RSA加密算法(Python/JS/C/C++ 2024 E卷 100分)

在这里插入图片描述

华为OD机试 2024E卷题库疯狂收录中,刷题点这里

专栏导读

本专栏收录于《华为OD机试真题(Python/JS/C/C++)》

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

RSA加密算法在网络安全世界中无处不在,它利用了极大整数因数分解的困难度,数据越大,安全系数越高。

给定一个32位正整数,请对其进行因数分解,找出是哪两个素数的乘积。

二、输入描述

一个正整数num

0 < num <= 2147483647

三、输出描述

如果成功找到,以单个空格分割,从小到大输出两个素数,分解失败,请输出-1 -1。

四、解题思路

  1. 遍历从2到floor(sqrt(num))的所有可能的因子i,检查是否i是num的因子,即num % i == 0。
  2. 对于每一个找到的因子i,计算另一个因子num / i,并验证这两个因子是否都是素数。
  3. 如果找到一对满足条件的素数因子,按照从小到大的顺序输出。如果没有找到,则输出-1 -1。
  4. 在找到第一对满足条件的素数因子后,立即终止循环,减少不必要的计算。

这种方法利用了数学上的因数分解和素数验证,确保了算法的高效性和准确性,适用于32位整数范围内的输入。

五、Python算法源码

import math
import sys

def is_prime(a):
    """
    判断一个数是否为素数
    :param a: 要判断的数
    :return: 如果是素数返回True,否则返回False
    """
    if a < 2:
        return False
    sqrt_a = int(math.floor(math.sqrt(a)))
    for i in range(2, sqrt_a + 1):
        if a % i == 0:
            return False
    return True

def main():
    # 读取输入的num
    input_line = sys.stdin.readline().strip()
    if not input_line:
        print("-1 -1")
        return
    num = int(input_line)
    
    # 计算num的平方根n,取整数部分作为循环的终止条件
    n = int(math.floor(math.sqrt(num)))
    # 初始化结果为-1 -1
    result = "-1 -1"
    
    # 遍历从2到n,寻找因子
    for i in range(2, n + 1):
        # 如果num能被i整除,说明i是num的一个因子
        if num % i == 0:
            other_factor = num // i
            # 检查i和num/i是否都是素数
            if is_prime(i) and is_prime(other_factor):
                # 确保输出顺序为从小到大
                if i < other_factor:
                    result = f"{i} {other_factor}"
                else:
                    result = f"{other_factor} {i}"
                # 找到一对因子后,立即终止循环
                break
    
    # 输出结果
    print(result)

if __name__ == "__main__":
    main()

六、JavaScript算法源码

// 引入读取标准输入的模块
const readline = require('readline');

// 创建接口实例
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});

// 存储输入的行
let inputLines = [];

// 读取每一行输入
rl.on('line', (line) => {
    inputLines.push(line.trim());
    // 只需要读取一行输入
    if (inputLines.length === 1) {
        rl.close();
    }
});

// 当输入结束后处理数据
rl.on('close', () => {
    // 读取输入的num
    const num = parseInt(inputLines[0]);
    
    // 函数:判断一个数是否为素数
    function isPrime(a) {
        if (a < 2) return false;
        const sqrtA = Math.floor(Math.sqrt(a));
        for (let i = 2; i <= sqrtA; i++) {
            if (a % i === 0) return false;
        }
        return true;
    }
    
    // 计算num的平方根n,取整数部分作为循环的终止条件
    const n = Math.floor(Math.sqrt(num));
    // 初始化结果为-1 -1
    let result = "-1 -1";
    
    // 遍历从2到n,寻找因子
    for (let i = 2; i <= n; i++) {
        // 如果num能被i整除,说明i是num的一个因子
        if (num % i === 0) {
            const otherFactor = Math.floor(num / i);
            // 检查i和num/i是否都是素数
            if (isPrime(i) && isPrime(otherFactor)) {
                // 确保输出顺序为从小到大
                if (i < otherFactor) {
                    result = `${i} ${otherFactor}`;
                } else {
                    result = `${otherFactor} ${i}`;
                }
                // 找到一对因子后,立即终止循环
                break;
            }
        }
    }
    
    // 输出结果
    console.log(result);
});

七、C算法源码

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

/**
 * 判断一个数是否为素数
 * @param a 要判断的数
 * @return 如果是素数返回true,否则返回false
 */
bool isPrime(long a) {
    if (a < 2) return false;
    long sqrt_a = (long)floor(sqrt((double)a));
    for (long i = 2; i <= sqrt_a; i++) {
        if (a % i == 0) return false;
    }
    return true;
}

int main() {
    long num;
    // 读取输入的num
    if (scanf("%ld", &num) != 1) {
        printf("-1 -1\n");
        return 0;
    }
    
    // 计算num的平方根n,取整数部分作为循环的终止条件
    long n = (long)floor(sqrt((double)num));
    // 初始化结果为-1 -1
    char result[20] = "-1 -1";
    
    // 遍历从2到n,寻找因子
    for (long i = 2; i <= n; i++) {
        // 如果num能被i整除,说明i是num的一个因子
        if (num % i == 0) {
            long otherFactor = num / i;
            // 检查i和num/i是否都是素数
            if (isPrime(i) && isPrime(otherFactor)) {
                // 确保输出顺序为从小到大
                if (i < otherFactor) {
                    sprintf(result, "%ld %ld", i, otherFactor);
                } else {
                    sprintf(result, "%ld %ld", otherFactor, i);
                }
                // 找到一对因子后,立即终止循环
                break;
            }
        }
    }
    
    // 输出结果
    printf("%s\n", result);
    
    return 0;
}

八、C++算法源码

#include <bits/stdc++.h>
using namespace std;

/**
 * 判断一个数是否为素数
 * @param a 要判断的数
 * @return 如果是素数返回true,否则返回false
 */
bool isPrime(long a) {
    if (a < 2) return false;
    long sqrt_a = floor(sqrt((double)a));
    for (long i = 2; i <= sqrt_a; i++) {
        if (a % i == 0) return false;
    }
    return true;
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    
    long num;
    // 读取输入的num
    if(!(cin >> num)){
        cout << "-1 -1\n";
        return 0;
    }
    
    // 计算num的平方根n,取整数部分作为循环的终止条件
    long n = floor(sqrt((double)num));
    // 初始化结果为-1 -1
    string result = "-1 -1";
    
    // 遍历从2到n,寻找因子
    for(long i = 2; i <= n; i++) {
        // 如果num能被i整除,说明i是num的一个因子
        if(num % i == 0){
            long otherFactor = num / i;
            // 检查i和num/i是否都是素数
            if(isPrime(i) && isPrime(otherFactor)){
                // 确保输出顺序为从小到大
                if(i < otherFactor){
                    result = to_string(i) + " " + to_string(otherFactor);
                }
                else{
                    result = to_string(otherFactor) + " " + to_string(i);
                }
                // 找到一对因子后,立即终止循环
                break;
            }
        }
    }
    
    // 输出结果
    cout << result;
    
    return 0;
}


🏆下一篇:华为OD机试真题 - 简易内存池(Python/JS/C/C++ 2024 E卷 200分)

🏆本文收录于,华为OD机试真题(Python/JS/C/C++)

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述


原文地址:https://blog.csdn.net/guorui_java/article/details/142980030

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!