如何反求数的平方?

  • 本文关键字:何反求 c++
  • 更新时间 :
  • 英文 :


我编写了一段代码,使这种输出:

1   2   3   4   5   6
7   8   9  10  11  12
13  14  15  16  17  18
19  20  21  22  23  24
25  26  27  28  29  30
31  32  33  34  35  36
37  38  39  40  41  42
43  44  45  46  47  48
#include <iostream>
using namespace std;
int main() {
// dimensions:
int x=6,y=8;
int sum=0;
int numery[8][6]={};

for (i = 0; i < y; i++) {
for (j = 0; j < x; j++) {
numery[i][j]=++sum;
if (numery[i][j]<=9) cout << " ";
cout << numery[i][j] << " ";
}
cout << endl;
}
return 0;
}

但是我不知道如何编辑它来得到这样的输出:

6   5   4   3   2   1
7   8   9  10  11  12
18  17  16  15  14  13
19  20  21  22  23  24
30  29  28  27  26  25
31  32  33  34  35  36
37  38  39  40  41  42
43  44  45  46  47  48

我可以想到为每个I %2==1编写if语句,它应该向后,但我不知道如何使程序做这样的事情。否则它应该正常运行。如果它找到一个偶数行,它应该像7 8 9 10 11 12,而如果它是i%2==1,它应该像6 5 4 3 21 1,等等。一些建议吗?

一种解决方案如下(我假设您实际上不需要存储这些数字)。注意,setw()可用于打印固定宽度的数字:

#include <iostream>
#include <iomanip>
using namespace std;
int main() {
// dimensions:
int x=6,y=8;
for (int i = 0; i < y; i++)
{
for (int j = 0; j < x; j++)
{
cout << setw(3) << ((i%2) ? i*x+j+1 : i*x+x-j) << " ";
}
cout << endl;
}
return 0;
}

首先删除数组。这是不必要的。

#include <iostream>
using namespace std;
int number(int i,int j,int width) { return j+i*width +1 ;}
int main() {
// dimensions:
int x=6,y=8;
for (int i = 0; i < y; i++) {
for (int j = 0; j < x; j++) {
auto n = number(i,j,x);
if (n <= 9) cout << " ";
cout << n << "  ";
}
cout << endl;
}
return 0;
}

与您的代码输出相同。

接下来考虑当你反向时j会发生什么。你应该仔细想想,答案是:你用width-j-1代替j

int number_reverse(int i,int j, int width) { return number(i,width-j-1,width); }

最终你只需要在每次外层循环的迭代中调用正确的函数:

#include <iostream>
using namespace std;
int number(int i,int j,int width) { return j+i*width +1 ;}
int number_reverse(int i,int j, int width) { return number(i,width-j-1,width); }
int main() {
// dimensions:
int x=6,y=8;
for (int i = 0; i < y; i++) {
for (int j = 0; j < x; j++) {
auto n = (i%2) ? number_reverse(i,j,x) : number(i,j,x);
if (n <= 9) cout << " ";
cout << n << "  ";
}
cout << endl;
}
return 0;
}

如果你确实需要将数字存储在数组中,这里有一个解决方案。

#include <iostream>
using namespace std;
int main() {
// dimensions:
int x=6,y=8;
int sum=0;
int numery[y][x];

for (int i = 0; i < y; i++) 
for (int j = 0; j < x; j++) 
numery[i][j]=++sum;



for(int i = 0; i < y; i++)
{
if(i%2 == 0)
{
for(int j = x-1; j >= 0; --j)
{
if(numery[i][j] < 10)
{
cout << " ";
}
cout << numery[i][j] << " ";
}
cout << endl;
}
else
{
for(int j = 0; j < x; j++)
{
if(numery[i][j] < 10)
{
cout << " ";
}
cout << numery[i][j] << " ";
}
cout << endl;   
}
}

return 0;
}

首先将数字赋给数组。然后根据是偶数行还是奇数行从后到后打印数字。

如果您愿意以非线性顺序填充数组,则可以从右向左填充每隔一行:array[i][x-1-j]=++sum;.

另一种方法是使用一个外部循环和两个内部循环,注意所有的行都是形式a*i + b*j + c,其中b是+1或-1。对于偶数行简化为array[i][j] = 6*i + 6 - j,对于奇数行简化为array[i][j]=6*i + 1 + j

另一个选择是有一个单一的内部循环,它将增加或减少一定的数量d = i % 2 == 0 ? -1 : 1;

for (int j = 0; j<x; j++) { arr[i][j]=sum; sum += d;}
sum+=6-d;

在每一行之后,我们需要补偿变量sum,以便它以下一个索引i+1的正确值开始。

最新更新