
2026 年 3 月 19 日收获找分子分母的最大公约数可以从大到小依次来找能同时整除分子分母的数相除则得到约分后的分数。1. 双素数Q593题目描述编写程序显示从 3 起小于 100 的所有双素数双素数如果 p 和 q 都是素数且 qp2则 p/q 称为双素数例如 3/55/7 都是双素数。输出格式要求%4d/%d程序运行示例3/5 5/7 11/13 17/19 29/31 41/43 59/61 71/73#includestdio.h#includemath.h// 函数声明判断素数intprime(intn);intmain(){intn3;// 遍历 3 到 100 的所有数字while(n100){// 如果 n 和 n2 都是素数则是双素数if(prime(n)prime(n2)){printf(%4d/%d,n,n2);}n;}return0;}// 判断素数的函数优化的 6k±1 法intprime(intn){if(n2)return0;// 小于 2 不是素数if(n2||n3)return1;// 2 和 3 是素数if(n%20||n%30)return0;// 能被 2 或 3 整除不是素数// 只需检查到 sqrt(n)且只检查 6k±1 形式的数for(inti5;isqrt(n);i6){if(n%i0||n%(i2)0)return0;}return1;}说明双素数对(3,5), (5,7), (11,13), (17,19), (29,31), (41,43), (59,61), (71,73)素数判断优化只检查到√n且跳过偶数和 3 的倍数2. 组合数计算Q567题目描述请编写函数 fuc()函数的功能是根据以下公式求出 p 的值结果由函数值返回。m , n 是两个正整数且 mn。P m!/(n!*(m-n)!)输入格式要求%d %d提示信息请输入 m,n 的值 ( mn )\n输出格式要求n 项之和为%lf\n程序运行示例请输入 m,n 的值 ( mn ) 5 3 n 项之和为10.000000#includestdio.h// 函数声明doublefuc(intm,intn);intmain(){intm,n;printf(请输入 m,n 的值 ( mn )\n);scanf(%d %d,m,n);// 调用函数计算组合数printf(n 项之和为%lf\n,fuc(m,n));return0;}// 计算组合数 C(m,n) m! / (n! * (m-n)!)doublefuc(intm,intn){intim,jn,km-n;longmj1,nj1,mnj1;// 分别存储 m!, n!, (m-n)!// 计算 m!while(i0){mj*i;i--;}// 计算 n!while(j0){nj*j;j--;}// 计算 (m-n)!while(k0){mnj*k;k--;}// 返回组合数returnmj*1.0/(nj*mnj);}说明这是组合数公式 C(m,n)表示从 m 个不同元素中取出 n 个元素的组合数例如C(5,3) 5! / (3! × 2!) 120 / (6 × 2) 103. 分数约简结构体Q6576题目描述假设有结构体定义如下structfraction{intnumerator;// 分子intdenominator;// 分母};编程对分数进行约减。输入输出格式输入提示please input a fraction,for example:16/24:输入格式%d/%d输出格式%d/%d\n程序运行示例please input a fraction,for example:16/24:4/6 2/3↙#includestdio.h// 定义分数结构体structfraction{intnumerator;// 分子intdenominator;// 分母};intmain(){structfractionf;printf(please input a fraction,for example:16/24:);scanf(%d/%d,f.numerator,f.denominator);// 从大到小找最大公约数进行约分for(intif.numerator-1;i1;i--){// 如果 i 能同时整除分子和分母if(f.numerator%i0f.denominator%i0){f.numerator/i;// 分子除以 if.denominator/i;// 分母除以 i}}printf(%d/%d\n,f.numerator,f.denominator);return0;}说明通过从大到小遍历找到能同时整除分子和分母的最大数即最大公约数然后分子分母同时除以这个数完成约分例如4/6 → 找到最大公约数 2 → 约分为 2/34. 八皇后问题回溯算法Q428题目描述八皇后问题。在一个 8×8 的国际象棋棋盘上有八个皇后每个皇后占一格要求皇后间不会出现相互攻击的现象即不能有两个皇后处在同一行、同一列或同一对角线上。问共有多少种不同的方法。输入格式要求提示信息The possible configuration of 8 queens are:\n输出格式要求 [%2d]:\n [%2d]: %d每三个结果输出为一行每个结果中的第 i 个数据代表了第 i 行中皇后位置的列坐标程序运行示例部分The possible configuration of 8 queens are:↙ ↙ [ 1]: 1 5 8 6 3 7 2 4 [ 2]: 1 6 8 3 7 4 2 5 [ 3]: 1 7 4 6 8 2 5 3↙ [ 4]: 1 7 5 8 2 4 6 3 [ 5]: 2 4 6 8 3 1 7 5 [ 6]: 2 5 7 1 3 8 6 4↙ ... [92]: 8 4 1 3 6 2 7 5#includestdio.hintboard[8][8];// 棋盘intsolution[100][8];// 存储所有解intcount0;// 解的个数// 判断在 (row, col) 位置放置皇后是否安全intisSafe(introw,intcol){// 检查同一列for(inti0;i8;i){if(board[i][col]1)return0;}// 检查左上对角线for(intirow-1,jcol-1;i0j0;i--,j--){if(board[i][j]1)return0;}// 检查右上对角线for(intirow-1,jcol1;i0j8;i--,j){if(board[i][j]1)return0;}return1;// 安全}// 保存当前解voidsaveSolution(){for(inti0;i8;i){for(intj0;j8;j){if(board[i][j]1){solution[count][i]j1;// 记录第 i 行皇后的列号从 1 开始}}}}// 递归求解八皇后问题voidsolveQueens(introw){intcol;// 如果已经放置了 8 个皇后保存解if(row8){saveSolution();count;return;}// 尝试在当前行的每一列放置皇后for(col0;col8;col){if(isSafe(row,col)){// 如果安全board[row][col]1;// 放置皇后solveQueens(row1);// 递归处理下一行board[row][col]0;// 回溯移除皇后}}}intmain(){inti,j,k;printf(The possible configuration of 8 queens are:\n);// 初始化棋盘for(i0;i8;i){for(j0;j8;j){board[i][j]0;}}// 从第 0 行开始求解solveQueens(0);// 输出所有解每行 3 个k0;for(inti0;icount;i){if(k%30)printf(\n );printf( [%2d]:,i1);for(j0;j8;j){printf( %d,solution[i][j]);}k;}printf(\n);return0;}算法说明回溯法逐行放置皇后每放一个就检查是否安全安全检查同一列、两条对角线不能有其它皇后解的表示用一个长度为 8 的数组表示第 i 个数字表示第 i 行皇后的列号总共 92 种解法5. 最大值最小值互换指针参数Q1616题目描述按如下函数原型编程实现计算数组 a 中 n 个整数的最大值和最小值并互换它们在数组中的位置。voidMaxMinExchang(inta[],intn);voidSwap(int*x,int*y);在主函数中调用函数 ReadData() 从键盘输入 10 个整数调用函数 MaxMinExchang() 计算其最大值和最小值并互换它们在数组中的位置最后调用函数 PrintData() 输出互换后的数组的各个元素值。输入提示信息Input 10 numbers:输入格式%d输出提示信息Exchange results:输出格式%5d#includestdio.h// 函数声明voidReadData(inta[],intn);voidPrintData(inta[],intn);voidMaxMinExchang(inta[],intn);voidSwap(int*x,int*y);intmain(){inta[10];printf(Input 10 numbers:);ReadData(a,10);// 输入数据MaxMinExchang(a,10);// 交换最大值和最小值printf(Exchange results:);PrintData(a,10);// 输出结果return0;}/* 函数功能输入数组 a 的 n 个元素值 */voidReadData(inta[],intn){inti;for(i0;in;i){scanf(%d,a[i]);}}/* 函数功能输出数组 a 的 n 个元素值 */voidPrintData(inta[],intn){inti;for(i0;in;i){printf(%5d,a[i]);}printf(\n);}/* 函数功能将数组 a 中的最大数与最小数位置互换 */voidMaxMinExchang(inta[],intn){intmaxValuea[0],minValuea[0],maxPos0,minPos0;inti;// 找出最大值和最小值及其位置for(i1;in;i){if(a[i]maxValue){maxValuea[i];maxPosi;}if(a[i]minValue){minValuea[i];minPosi;}}// 调用 Swap 函数交换最大值和最小值的位置Swap(a[minPos],a[maxPos]);}/* 函数功能两整数值互换 */voidSwap(int*x,int*y){inttemp*x;*x*y;*ytemp;}说明使用指针参数实现两个数的交换Swap(a[minPos], a[maxPos])传入的是地址函数内部修改会影响原数组先遍历数组找到最大值和最小值的位置然后交换