题目
在一个n行m列的矩阵王国中,生活着一些整数,其中一些是素数,一些不是素数。如果一个素数的上下左右、左上、右上、左下、右下相邻的数中都没有素数,我们就认为这是一个孤独的素数。
比如:一个3行5列的矩阵如下。
3 8 10 9 5
6 10 2 4 13
8 8 9 6 3
这个矩阵中有2个素数,分别是第1行第1列的3,和第2行第3列的2。
请编程计算出,一个n行m列的矩阵中有多少个孤独的素数?
输入格式:
第1行有2个整数n和m,代表矩阵的大小(3<=n,m<=50)
接下来n行,每行有m个整数(这些整数是1~1000之间的整数,含1和1000)
输出格式:
输出1个整数,代表矩阵中孤独素数的个数。
输入样例:
在这里给出一组输入。例如:
3 5
3 8 10 9 5
6 10 2 4 13
8 8 9 6 3
输出样例:
在这里给出相应的输出。例如:
2
题解
#include <stdio.h>
#include <math.h>
int prime(int n)
{
int i = 0;
if (n <= 1)
{
return 0;
}
for (i = 2; i <= sqrt(n); i++)
{
if (n % i == 0)
{
return 0;
}
}
return 1;
}
int gudu(int a[51][51], int i, int j, int n, int m)
{
int x = 0;
int y = 0;
for (x = i - 1; x <= i + 1; x++)
{
for (y = j - 1; y <= j + 1; y++)
{
if (x >= 0 && x < n&&y >= 0 && y < m && !(x == i && y == j))
{
if (prime(a[x][y]))
{
return 0;
}
}
}
}
return 1;
}
int main()
{
int n, m;
scanf("%d %d", &n, &m);
int a[51][51] = { 0 };
int i, j;
for (i = 0; i < n; i++)
{
for (j = 0; j < m; j++)
{
scanf("%d", &a[i][j]);
}
}
int count = 0;
for (i = 0; i < n; i++)
{
for (j = 0; j < m; j++)
{
if (prime(a[i][j])&&gudu(a, i, j, n, m))
{
count++;
}
}
}
printf("%d", count);
return 0;
}
错误点提醒
我做时在判断是否孤独的函数有几个错误点如下,希望改正的思路能帮助到你
int gudu(int a[51][51], int i, int j, int n, int m)
{
int x = 0;
int y = 0;
for (x = i - 1; x <= i + 1; x++)
{
//if (x >= 0 && x < n)//不应该写<=,x最大也是n-1
//{
// for (y = j - 1; y <= j + 1; y++)//如果if不符合条件,不会进入此循环,直接跳到下一行,有些数未判断到
// {
// if (y >= 0 && y < m&&(x != i && y != j))//x y中是可以有一个等于i j 的
// {
// if (prime(a[x][y]))
// {
// return 0;
// }
// }
// }
//}
for (y = j - 1; y <= j + 1; y++)//如果if不符合条件,不会进入此循环,直接跳到下一行,有些数未判断到
{
if (x >= 0 && x < n && y >= 0 && y < m && !(i == x && j == y))
{
if (prime(a[x][y]))
{
return 0;
}
}
}
}
return 1;
}