题目描述
给定一个整数 nn, 构造一个边长为 nn 的质数螺旋,质数用 x 表示,合数用 . 表示。
输入格式
第一行一个整数 nn,含义如题。
输出格式
边长为 nn 的一个质数螺旋,注意每一行最后都有换行符。
输入输出样例
输入 #1复制
3
输出 #1复制
x.x
..x
x..
比较好奇写了一下。见下面代码 输入n为奇数才行 比如3 ,5,7。 找到螺旋图是奇数 偶数没法螺。有问题再讨论
#include<iostream>
#include<cmath>
using namespace std;
int is_prime(int num)
{
int k, i = 0;
if(num == 1) return 0;
if(num == 2) return 1;
k = (int)sqrt((double)num);
for(i = 2; i <= k+1; i++) {
if((num %i) == 0) return 0;
}
return 1;
}
int main()
{
int n, i, j, step = 0,total_step = 1;
char a[100][100];
int di[4] = {0,1,2,3}, direct;
int x, y;
cin >> n;
x = n/2;
y = n/2;
direct = 0;
for(i = 1; i <= n*n; i++) {
if( is_prime(i) ) a[x][y] = 'X';
else a[x][y] = '.';
if(direct == 0) y++;
if(direct == 1) x--;
if(direct == 2) y--;
if(direct == 3) x++;
step++;
if(total_step == step) {
if(direct == 1 || direct == 3) total_step++;
direct ++; if(direct > 3) direct = 0;
step = 0;
}
}
for( i = 0; i < n; i++) {
for(j = 0; j < n; j++) {
cout<< a[i][j]<< " ";
}
cout << endl;
}
return 0;
}
------给个数字输出的螺旋示例,区分质数输出x和.很容易。好给你写程序。---
我猜3规律下面符合: 而且n取值3,5,7,9, ......
5 4 3
6 1 2
7 8 9
Source Code
Problem: 1441 User: 202205567311
Memory: 25644K Time: 388MS
Language: G++ Result: Accepted
Source Code
#include <stdio.h>
#include <string.h>
char map[5000][5000]; //中心为2500,2500
int ioprime[1001] = {1, 1};
int prime[170];
int pointx, pointy, point, maxx, maxy, minx, miny, n;//pointx,y,point分别存x轴y轴坐标和方向,min,max分别存上下界
void draw(int sushu)
{ // 1,2,3,4分别对应上左下右从右边开始
switch (point)
{
case 1:
for (int i = 0; i < sushu; i++)
{
map[pointx][pointy] = '|';
pointx--;
}
pointy--;
//向上打印后要左移一个位置
point = 2;//转向
break;
case 2:
for (int i = 0; i < sushu; i++)
{
map[pointx][pointy] = '_';
pointy--;
}
pointx++;//向左打印后直接下移一个位置
point = 3;
break;
case 3:
for (int i = 0; i < sushu; i++)
{
map[pointx][pointy] = '|';
pointx++;
}
pointx--;
pointy++;//横着的与竖着的同行,所以x--移回去
point = 4;
break;
case 4:
for (int i = 0; i < sushu; i++)
{
map[pointx][pointy] = '_';
pointy++;
}
point = 1;//接着向上打印
break;
}
maxx = (pointx > maxx) ? pointx : maxx;
maxy = (pointy > maxy) ? pointy : maxy;
minx = (pointx < minx) ? pointx : minx;
miny = (pointy < miny) ? pointy : miny;//实时更新边界
}
void print(void)
{
int i, j;
char *arrey = NULL;
if (point == 3)
{
miny++;
}
if(point==2){
minx++;
}//把打印时的偏移量移回去。解释一下,因为是先打印在移动,所以必然存在移动而未打印
for (i = minx; i <= maxx; i++)
{
for (j =maxy+10; j >= miny; j--)
{
if (map[i][j] != ' ')
{
map[i][j + 1] = '\0';//这个循环非常重要,从边界开始向左扫描,遇到第一个边界的话就把它右边变成\0,\0作为printf打印的终止符,要不然会PE,输出了多余的空格
break;
}
}
arrey = &map[i][miny];//这个是我在思索如何从某个位置开始打印的时候发现的,数组名在传入函数时是将其指向第一个元素的指针传入,所以我们只需要把指向我们要打印的第一个元素的指针传入就可以实现定点打印的结果
printf("%s\n", arrey);//以指针指向的第一个元素开始打印,一直到\0结束
}
}
int main()
{
int i, j;
for (i = 2; i * i <= 1001; i++)
{
if (!ioprime[i])
{
for (j = i * i; j <= 1001; j += i)
{
ioprime[j] = 1;
}
}
}
int countt = 0;
for (i = 2; i < 1001; i++)
{
if (!ioprime[i])
{
prime[countt] = i;
countt++;
}
}
//打个素表先
int t;
scanf("%d", &t);
while (t--)
{
scanf("%d", &n);
memset(map, ' ', sizeof map);//初始化为空格方便打印
pointx = 2500, pointy = 2500, point = 4;//中心点
maxx = 2500, maxy = 2500, minx = 2500, miny = 2500;
for (i = 0; i < n; i++)
{
draw(prime[i]);//从素数表取素数打印
}
print();
putchar('\n');//记得还有一个换行
}
}
怎么理解?为什麽第一个输出是x呢?