一、最大公约数

题意

小美对 gcd (最大公约数) 很感兴趣,她会询问你t次。

每次询问给出一个大于1的正整数n,你是否找到一个数字 m (2 ≤ m ≤ n),使得 gcd(n,m)为素数。

输入描述

每个测试文件均包含多组测试数据。第一行输入一个整数 T (1 ≤ T ≤ 100) 代表数据组数,每组测试数据描述如下:

在一行上输入一个整数 n (2 ≤ n ≤ 10^5)代表给定的数字。

输出描述

对于每一组测试数据,在一行上输出一个整数,代表数字m。如果有多种合法答案,您可以输出任意一种。

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

// 函数:计算两个数的最大公约数(GCD)
int gcd(int a, int b) {
    while (b != 0) {
        int temp = b;
        b = a % b;
        a = temp;
    }
    return a;
}

// 函数:检查一个数是否为素数
bool isPrime(int num) {
    if (num <= 1) return false;
    if (num <= 3) return true;
    if (num % 2 == 0 || num % 3 == 0) return false;
    for (int i = 5; i * i <= num; i += 6) {
        if (num % i == 0 || num % (i + 2) == 0) return false;
    }
    return true;
}

int main() {
    int T;
    
    scanf("%d", &T);  // 读取 T 的值

    int data[T];
    
    for (int i = 0; i < T; i++) {
        scanf("%d", &data[i]);  // 读取每个整数
    }

    int result[T];

    for (int i = 0; i < T; i++) {
        int n = data[i];
        bool found = false;
        for (int m = 2; m <= n; ++m) {
            int gcdVal = gcd(n, m); // 计算 gcd(n, m)
            if (isPrime(gcdVal)) {  // 检查 gcd 是否为素数
                result[i] = m;
                found = true;
                break; 
            }
        }
        if (!found) {
            result[i] = -1;  // 如果没有找到合适的 m
        }
    }

    printf("Results:\n");
    for (int i = 0; i < T; i++) {
        printf("%d\n", result[i]);  // 输出结果
    }

    return 0;
}

二、

全部评论
找最小质因子就可以了
1 回复 分享
发布于 08-27 12:45 上海

相关推荐

点赞 4 评论
分享
牛客网
牛客企业服务