C语言如何统计多维数组指定行中的素数个数
实现方案
C语言中二维数组的每一行本质就是一段连续存储的一维数组,你已经掌握一维数组素数统计逻辑的话,只要固定目标行的索引,遍历该行所有列做判断即可,不需要额外的特殊处理。
你现有代码存在几个需要修正的问题:
scanf用法错误:scanf返回值是成功读取的参数个数,不是读取到的数值,读取整数的正确写法是scanf("%d", &目标变量)- 函数参数设计不合理:统计行素数需要传入数组本身、列长度信息,你框架里写的
start、end参数不需要,每行的遍历范围固定为0到列数减1 - 缺少输入合法性校验:必须判断用户输入的行号是否在合法范围内,否则会出现数组越界访问
完整可运行代码
#include <stdio.h> #include <stdbool.h> // 素数判断辅助函数,和一维数组用的判断逻辑完全一致 bool isPrime(int num) { if (num < 2) return false; for (int i = 2; i * i <= num; i++) { if (num % i == 0) return false; } return true; } /** * 统计二维数组指定行的素数个数 * @param arr 目标二维数组 * @param cols 数组总列数 * @param rownumber 要统计的行索引(从0开始计数) */ void findRowPrime(int arr[][4], int cols, int rownumber) { int primeCount = 0; // 固定行索引,遍历所有列,逻辑和遍历一维数组完全相同 for (int col = 0; col < cols; col++) { if (isPrime(arr[rownumber][col])) { primeCount++; } } // 输出时行号转成用户习惯的从1开始计数 printf("第%d行的素数总个数为:%d\n", rownumber + 1, primeCount); } int main() { int arr[3][4] = { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 } }; int rows = sizeof(arr) / sizeof(arr[0]); int cols = sizeof(arr[0]) / sizeof(arr[0][0]); int inputRow; printf("enter the row number to find prime numbers(1-%d):", rows); // 校验输入是否为有效整数 if (scanf("%d", &inputRow) != 1) { printf("输入无效,请输入整数类型的行号\n"); return 1; } // 用户输入从1开始计数,转成数组0开始的索引 int targetRow = inputRow - 1; // 校验行号范围 if (targetRow < 0 || targetRow >= rows) { printf("行号超出合法范围,有效行号为1-%d\n", rows); return 1; } findRowPrime(arr, cols, targetRow); return 0; }
关键逻辑说明
- 二维数组访问指定行元素的方式为
arr[行索引][列索引],arr[行索引]等价于该行一维数组的数组名,可以直接复用你之前写的一维数组遍历逻辑 - 注意行号的计数转换:C语言数组索引从0开始,普通用户习惯从1开始计数,输入后要做减1转换,同时必须做边界校验
- 二维数组作为函数参数时,必须指定列的长度,或者额外传入列数信息,否则编译器无法正确计算元素地址
内容的提问来源于stack exchange,提问作者Farkhad
相关产品推荐
相关产品推荐

