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