问题 BC: 21级期中机试-打印图形(10分)
[命题人 : 外部导入]
时间限制 : 1.000 sec 内存限制 : 128 MB
题目描述
杨辉三角,其特点是两个腰上的数字都为1,其它位置上的数字是其上一行中与之相邻的左边两个整数之和。老师给了小南一个任务,就是打印一个n´n的方阵。方阵的上三角是用2开始的素数从左至右从上至下进行填充,下三角是一个杨辉三角。如下图所示的是一个6´6方阵:下三角(蓝色部分)是一个杨辉三角,其余部分(红色部分)按行序依次从小到大填充素数。
给定一个整数n,你能帮他编写程序输出满足要求的图形吗?
输入
多组样例。每行输入一个样例包括一个整数n(0<n≤30)。
输出
对于每一个输入的n,请输出相应行数的方阵图形,每一行的整数之间用一个空格隔开。每一个方阵后面加一个空行。
样例输入 Copy
2
5
样例输出 Copy
1 2
1 1
1 2 3 5 7
1 1 11 13 17
1 2 1 19 23
1 3 3 1 29
1 4 6 4 1
#include<stdio.h>
int main(void)
{
int prime[600] = { 0,2},z=2,flag;
for (int i = 3;z<600; i++)//先求出一个素数数列
{
flag = 1;
for (int m = 2; m * m <= i; m++)
{
if (i % m == 0)
{
flag = 0;
break;
}
}
if (flag)
{
prime[z] = i;
z++;
}
}
int n;
while (~scanf("%d", &n))
{
int arr[50][50] = {0};
int primesum = 1;
arr[1][1] = 0;
for (int hang = 1; hang <= n; hang++)
{
arr[hang][1] = 1;//打印每行左1
for (int lie = 2; lie <= n; lie++)//打印每行的杨辉三角
{
arr[hang][lie] = arr[hang - 1][lie - 1] + arr[hang - 1][lie];
}
arr[hang][hang] = 1;//打印每行右1
for (int m = hang+1; m <= n; m++)//打印素数
{
arr[hang][m] = prime[primesum];
primesum++;
}
}
for (int x = 1; x <= n; x++)
{
for (int y = 1; y <= n; y++)
{
if (y == n)
printf("%d\n", arr[x][y]);
else
printf("%d ", arr[x][y]);
}
}
printf("\n");
}
return 0;
}