我正在编写此代码,以此螺旋顺序打印以下矩阵(逐列螺旋)。但我的代码打印完全不同。
a a+7 a+8 a+15
a+1 a+6 a+9 a+14
a+2 a+5 a+10 a+13
a+3 a+4 a+11 a+12
这就是我所做的:
int main() {
int a;
int Sum = 0;
int i = 0, j = 0,n;
printf("Insert the value of n: ");
scanf("%d",&n);
printf("Insert the value of a number: ");
scanf("%d",&a);
for(i=0;i<n;i++){
for(j=0;j<n;j++){
printf("%d ",a);
a = a + 7;
printf("\t");
}
printf("%d",a);
a = a + 1 ;
printf("\n");
}
return 0;
}
答案 0 :(得分:4)
我接近这个的方法是构建你真正想要的值矩阵,但是在 column 顺序中这样做,我们可以相对容易地按行控制值进展的逻辑。然后,使用该矩阵,打印出 row 顺序中的值,如您所希望的那样:
int main()
{
int a = 7;
int n = 4;
int array[4][4];
for (int c=0; c < n; ++c)
{
for (int r=0; r < n; ++r)
{
// values ascending for even columns
if (c % 2 == 0)
{
array[r][c] = a + c*n + r;
}
// values descending for odd columns
else
{
array[r][c] = a + c*n + n-r-1;
}
}
}
for (int i=0; i < n; ++i)
{
for (int j=0; j < n; ++j)
{
printf("%d ", array[i][j]);
}
printf("\n");
}
}
<强>输出:强>
在这里演示:
答案 1 :(得分:1)
您可以通过简单的算术随时计算要添加的值,而不是使用此复杂机制来跟踪所有元素。
见这个
int row;
int column;
printf("\n");
for (row = 0; row < n; row++) {
for (column = 0; column < n; column++) {
int base;
int flag;
if (column % 2 != 0) {
base = (column+1)/2 * 2*n - 1;
flag = -1;
}else {
base = column/2 * 2*n;
flag = 1;
}
printf( "%d ", a + base + flag * row);
}
printf("\n");
}
我希望你能够遵循这个逻辑。如果没有随意问。
在这里演示: Ideone
答案 2 :(得分:0)
使用矩阵在打印前计算值的简单解决方案
#include <stdio.h>
int main(void)
{
int a;
int i = 0, j = 0, n;
printf("Insert the value of n: ");
scanf("%d", &n);
printf("Insert the value of a number: ");
scanf("%d", &a);
int matrix[n][n];
for (i=0; i< n*n; i++)
{
// even columns ascending
if (((i/n) % 2) == 0)
{
matrix[i%n][i/n] = a++;
}
// odd column descending
else
{
matrix[n-(i%n)-1][i/n] = a++;
}
}
for (i=0; i< n; i++)
{
for (j=0; j< n; j++)
{
printf("%d\t", matrix[i][j]);
}
printf("\n");
}
return 0;
}
输出
Insert the value of n: 4
Insert start value: 1
1 8 9 16
2 7 10 15
3 6 11 14
4 5 12 13
答案 3 :(得分:0)
您的代码似乎存在两个问题。如上面的注释所述,您在循环计算中使用变量a
,因此它会不断更新。这意味着您的循环在几次迭代后变得无效。如果定义虚拟变量,则可以避免此问题。其次,螺旋式的实施接近正确,但它并不存在。
考虑案例n = 4
。沿每行打印时,新元素与最后一个元素之间的差异在(2n - 1) = 7
和1
之间交替显示。要考虑到这一点,您可以检查每次要打印列索引(j
)是奇数还是偶数,并使用它来确定要添加的差异。一旦你修好了行机器,就不难将它扩展到列上。