如何反转嵌套循环输出的位置?
How to reverse the position of a nested loop output?
我是一名初级 C 程序员和一名大学新生。
我在这里进行的测试需要一些帮助。
我想制作一个显示排序数字的嵌套循环。排序如下:
- 1
- 3 2
- 4 5 6
- 10 9 8 7
- 11 12 13 14 15
- 21 20 19 18 17 16
22 23 24 25 26 27 28
... ... ...依此类推,取决于您输入的行数限制
我已经尝试制作了粗略的试错测试代码:
int i;
int j;
int limit;
int number1 = 1;
int number2 = 3;
int spesial = 0;
printf("Input limit : ");
scanf("%d", &limit);
for (i=1;i<=limit;i++)
{
for(j=1;j<=i;j++)
{
if (i%2==0)
{
printf("%d ", number2);
number2--;
}
else
{
printf("%d ", number1);
}
number1++;
}
if (i%2==0)
{
number2=(i*6)-i+(spesial*1);
spesial+=1;
}
printf("\n");
}
I managed to make it sorted to the 7th rows, but the rest are not..
求助...
我想知道我们是否真的可以控制输出的位置而不用像这样粗暴的方式。
另外,对不起我的英语...我不是来自英语国家,这是我第一次 posting/question 在这个网站。
感谢您阅读这个冗长的问题,希望您度过愉快的一天和晚安。
你用 number1
、number2
和 special
做了很多特例。这不适用于更大的数字。
一种方法是计算 count
,这将为您提供 j
的每个循环中的起始值。 count += i
然后每次打印 count -j
count = 0;
for (i=1;i<=limit;i++)
{
count += i;
for(j=0;j< i;j++)
{
printf ("%d ",count-j);
}
printf("\n");
}
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int rows;
int i, j;
int n = 0;
printf ("How many rows do you want? ");
if (scanf("%d", & rows) != 1 || rows < 1) return EXIT_FAILURE;
printf ("\n");
for (i = 1; i <= rows; ++ i) {
for (j = 0; j < i; ++ j) {
printf ("%4d", n + (i % 2 == 0 ? i - j : j + 1));
}
printf ("\n");
n = n + i;
}
return EXIT_SUCCESS;
}
创建另一个计算行的最大数的函数会更方便(我称之为 lineMax
)。
int lineMax(int num){
int cnt=0;
for (int i=1;i<=num;i++)
cnt+=i;
return cnt;
}
void main(){
int i,j,limit;
printf("Input limit : ");
scanf("%d", &limit);
for(i=1;i<=limit;i++){
if(i%2==0){ //right to left
for(j=lineMax(i);j>=lineMax(i-1)+1;j--)
printf("%d ",j);
}
else{ //left to right
for(j=lineMax(i-1)+1;j<=lineMax(i);j++)
printf("%d ",j);
}
printf("\n");
}
}
我是一名初级 C 程序员和一名大学新生。 我在这里进行的测试需要一些帮助。 我想制作一个显示排序数字的嵌套循环。排序如下:
- 1
- 3 2
- 4 5 6
- 10 9 8 7
- 11 12 13 14 15
- 21 20 19 18 17 16
22 23 24 25 26 27 28
... ... ...依此类推,取决于您输入的行数限制
我已经尝试制作了粗略的试错测试代码:
int i;
int j;
int limit;
int number1 = 1;
int number2 = 3;
int spesial = 0;
printf("Input limit : ");
scanf("%d", &limit);
for (i=1;i<=limit;i++)
{
for(j=1;j<=i;j++)
{
if (i%2==0)
{
printf("%d ", number2);
number2--;
}
else
{
printf("%d ", number1);
}
number1++;
}
if (i%2==0)
{
number2=(i*6)-i+(spesial*1);
spesial+=1;
}
printf("\n");
}
I managed to make it sorted to the 7th rows, but the rest are not..
求助... 我想知道我们是否真的可以控制输出的位置而不用像这样粗暴的方式。 另外,对不起我的英语...我不是来自英语国家,这是我第一次 posting/question 在这个网站。 感谢您阅读这个冗长的问题,希望您度过愉快的一天和晚安。
你用 number1
、number2
和 special
做了很多特例。这不适用于更大的数字。
一种方法是计算 count
,这将为您提供 j
的每个循环中的起始值。 count += i
然后每次打印 count -j
count = 0;
for (i=1;i<=limit;i++)
{
count += i;
for(j=0;j< i;j++)
{
printf ("%d ",count-j);
}
printf("\n");
}
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int rows;
int i, j;
int n = 0;
printf ("How many rows do you want? ");
if (scanf("%d", & rows) != 1 || rows < 1) return EXIT_FAILURE;
printf ("\n");
for (i = 1; i <= rows; ++ i) {
for (j = 0; j < i; ++ j) {
printf ("%4d", n + (i % 2 == 0 ? i - j : j + 1));
}
printf ("\n");
n = n + i;
}
return EXIT_SUCCESS;
}
创建另一个计算行的最大数的函数会更方便(我称之为 lineMax
)。
int lineMax(int num){
int cnt=0;
for (int i=1;i<=num;i++)
cnt+=i;
return cnt;
}
void main(){
int i,j,limit;
printf("Input limit : ");
scanf("%d", &limit);
for(i=1;i<=limit;i++){
if(i%2==0){ //right to left
for(j=lineMax(i);j>=lineMax(i-1)+1;j--)
printf("%d ",j);
}
else{ //left to right
for(j=lineMax(i-1)+1;j<=lineMax(i);j++)
printf("%d ",j);
}
printf("\n");
}
}