在线网站备份,慕枫网站建设,第三方物流网站建设,校园图书回收网站建设【题目描述】
给出n(1n13)#xff0c;请输出一个直角边长度是n的数字直角三角形。
【样例输入】
5
【样例输出】
0102030405
06070809
101112
1314
15
【题目来源】
洛谷P5721 【深基4.例6】数字直角三角形 【解析】
本题的样例输出一眼望过去就是像一个矩…【题目描述】
给出n(1n13)请输出一个直角边长度是n的数字直角三角形。
【样例输入】
5
【样例输出】
0102030405
06070809
101112
1314
15
【题目来源】
洛谷P5721 【深基4.例6】数字直角三角形 【解析】
本题的样例输出一眼望过去就是像一个矩阵或者叫三角阵貌似更形象。我家娃断言老师教过的这种要使用一个x坐标、一个y坐标因此要用两重循环。
看起来确实是这样
①大循环一行一行的输出这是一种重复作业可以用循环。
②小循环一个数一个数的输出后一个数是前一个数加1这是一种有规律重复作业可以用循环。
标准代码
#includecstdio
using namespace std;
int main(){int cnt0, n;scanf(%d, n);for(int i1; in; i){for(int j1; jn1-i; j){printf(%02d, cnt);}printf(\n);}return 0;
}
代码中的i相当于y坐标j相当于x坐标。本题的关键是要求出换行的位置也就是每行中最后一个要输出的数的x坐标即每行j的最大值j_max。
以n5为例 换行 i j_max 规律 1 1 5 156 2 2 4 246 3 3 3 336 4 4 2 426 5 5 1 516
不难发现一个规律ij_max651n1即j_maxn1-i。
但是老金看到这道题的第一感觉是应该可以用一层循环求解当我提出这个想法时却被我家娃一顿嘲笑。
他说老师教过要用x坐标、y坐标。
只能感叹教育的僵化希望老师们能意识到教学生时尽量不要用“要”这个字而应用“可以”、“也许”、“试试”之类的词。
之所以我认为可以用一层循环主要是因为输出的数的规律是一致的都是递增1只不过要在不同的位置输出换行符。
所以实现一层循环的难点依然是找到换行的位置。
因为只有一层循环迭代的变量自然就是要输出的数。所以此时便没有了y坐标就不能再用上表中与y坐标的和是固定值的规律了。
但是在上表中单看j_max这一例也能一眼看出一个规律就是值从n开始每次递减1。咱们就可以利用这个规律实现一层循环。方法就是再引入一个累加器j每行开始输出时将其值置为0当它累加到j_max的时候输出换行符。
代码如下
#includestdio.h
int main(){int n, j0;scanf(%d, n);for(int i1;;i){j;printf(%02d, i);if(jn){printf(\n);n--;j0;}if(n0) break;}return 0;
}
还有另外一个思路就从输出的数中找出换行的位置还是以n5为例假设输出的数为i。 换行 i 规律 1 5 05 2 9 54 3 12 93 4 14 122 5 15 141
每次输出换行符的位置都是上一个位置加上一个n--。代码如下
#includestdio.h
int main(){int n, i_newline;scanf(%d, n);i_newlinen;for(int i1;;i){printf(%02d, i);if(ii_newline){printf(\n);n--;i_newlinen;}if(n0) break;}return 0;
}
还有一点上面两个一层循环的退出条件还可以直接设置在循环条件判断处。
for(int i1;in*(n1)/2;i)
想想为什么
当然此时代码中就不能随便改n的值了即不能直接用n—了而要先把n的值赋给另一个变量m让m--。