一、最大公约数
题意
小美对 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;
}
二、
