一、问题描述
建立一个矩阵类 Array,对二维数组中左下三角的全部元素(包括对角线上的元素)作如下变换:(1) 若该数不是素数则保持不变;(2)若该数是素数,则用大于它的最小素数替换该数。并统计二维数组中左下三角的全部元素(包括对角线上的元素)中的素数个数。要求如下:
(1) 私有数据成员
int x[4][4];存储需要处理二维数组的各元素值。
int count;存储左下三角元素中素数的个数。
(2) 公有成员函数
构造函数:进行初始化 x 数组和 count 的值。
int fun(int);判断一个数是否为素数的函数。
int encode( );对 x 数组中左下三角的全部元素(包括对角线上的元素)逐一进行判断,
若该数不是素数则保持不变,若该数是素数,则用大于它的最小素数替换该数。
void print():按行输出矩阵的值。
(3)编写一个程序测试类,说明(声明)Array 对象 A,将一个矩阵存入对象 A 中,并输出矩 阵的值,使用以下测试数据:
二、解题思路:
常规解法,“用大于它的最小素数替换该数”这一步可采用递加加上fun(int)判断找出。
三、程序实现
#include <iostream>
using namespace std;
class Array {
private:
int x[4][4];
int count;
public:
Array(int a[4][4])
{
int i, j;
for (i = 0; i < 4; i++)
for (j = 0; j < 4; j++)
x[i][j] = a[i][j];
count = 0;
};
int fun(int x);
int encode();
void print();
};
int Array::fun(int x) { //返回值为0不是素数,为1则为素数
int i = x;
int j = 2;
int flag = 0;
if (x == 0 || x == 1)
return 0;
for (j; j < i; j++)
{
if (x % j == 0)
flag = 1;
}
if (flag == 0)
return 1;
else
return 0;
}
int Array::encode() //对x数组中左下角的全部元素逐一进行判断。
{
int i = 0, j = 0;
for(i=0;i<4;i++)
for (j = 0; j < 4; j++)
{
if (i >= j)
{
if (fun(x[i][j])) //如果为素数这满足if条件,count++,同时这个数用大于它的最小素数替换该数。此过程用fun函数进行判断。
{
count++;
while (1)
{
x[i][j]++;
if (fun(x[i][j]))
break;
}
}
}
else
continue;
}
return count;
}
void Array::print() //定义输出函数
{
int i, j;
for (i = 0; i < 4; i++)
{{
for (j = 0; j < 4; j++)
cout << x[i][j] << ' ';
}
cout << endl;
}
}
void main()
{
int n[4][4] = { {3,6,4,17},{8,5,9,10},{12,19,7,20},{4,14,21,23} };
Array A(n);
cout <<"count="<<A.encode() << endl; //调用encode函数对x数组进行操作,同时返回count的值
A.print();
}
四、实验结果与分析