上一篇文章的输出的数字直角三角形有个限制,就是边长n最大值为13,因为超过13最后就会输出3位数,这样斜边就不成一条直线了。
如果去掉这个限制呢?随便输入一个正整数(int型),还能否输出这样的数字直角三角形?
这个问题的难点就在于如何根据最后输出的数的位数对每个要输出的数补0。上篇文章中的补0方式是用%02d。但是这种方式只能输出固定位数的整数,而不能动态改变。
当我提出这个问题时(当时我还没想到该怎么解),我家娃表示so easy,并且很快写出了代码。
下面是娃写的C++代码(老金仅改了变量名、添加了注释):
#include <iostream>
using namespace std;
int main () {int n,cnt=1,j,j2,digits=0,n_last,digits_j=0;cin>>n;n_last=n*(n+1)/2; //求输出数的最后一个数//求最后一个数是几位数while(n_last!=0){n_last/=10;digits++;}//输出数字直角三角形for(int i=n;i>=1;i--){for(j=cnt;j<=i+cnt-1;j++){//求要输出的j是几位数digits_j=0;j2=j;while(j2!=0){j2/=10;digits_j++;}//根据j的位数补0并输出for(int k=1;k<=digits-digits_j;k++)cout<<0;cout<<j;}cnt=j;cout<<endl;}return 0;
}
想必根据老金的注释大家也能看明白娃的思路,就是先找出输出数的最大位数,然后据此对每个要输出的数前面进行补0,补几个0是由要输出的数的位数与最大位数的差决定的。
但是这段代码的输出数字部分比较令人费解。
第一个for循环反其道而行之,不是从1迭代至n,而是从n迭代到1。娃解释说这是因为每行输出数的个数也是依次减少的。
第二个for循环就更令人费解,老金看了好半天才看明白,也不知道该怎么向大家解释,大家凑合看吧。
不管怎样,这段代码还是能满足输出要求的,可以随便输入一个更大的整数,在屏幕上打印出巨大、巨疯狂的数字直角三角形(甚至会超出屏幕的边界)。