打印如下数字三角形
输入:起始数字,行数
输出:对应数字三角形
(数字递增,若超过9,则从0开始)
例如,输入3 6,则输出:
345678
7 9
6 0
5 1
42
3
测试输入 | 期待的输出 | 时间限制 | 内存限制 | 额外进程 | |
---|---|---|---|---|---|
测试用例 3 | 以文本方式显示
| 以文本方式显示
| 1秒 | 64M | 0 |
测试用例 4 | 以文本方式显示
| 以文本方式显示
| 1秒 | 64M | 0 |
思路:
这道题的难点在于,我们依照按行打印的思路,虽然不难找到第一行、其后每行第二个数字以及空格的规律,但却难以找到其后每行第一个数字和行数之间的规律。
这时我们可以看看能否采用“拆分”观察的方法来找规律。要求的图形最后一行的数字和行数之间的规律我们能找到,图形最后一行的的数字和第二行至倒数第二行的第一个数字之间的规律我们也能找到,它也和行数有关。这样的话,我们只需先推出最后一行的数字(btm),再用它来推我们难以直接求的第二行至倒数第二行的第一个数字(frt)就好了。
还有一个细节,我们在这道题中,推任何一个数字时,都要一次次地自增1,因为说不准什么时候它就会增大到9以上。修复这个bug的过程启示我测试用例最好设个很大的,再设个很小的。
#include <stdio.h>
int main(){
int arr[10]={0,1,2,3,4,5,6,7,8,9};
int bgn=0,hang=0;
scanf("%d %d",&bgn,&hang);
for (int i = 0; i < hang; ++i)
{
printf("%d",arr[bgn]);
bgn++;
if(bgn>9)
{
bgn=0;
}
}
printf("\n");
int btm=bgn-2;
for (int i = 0; i < hang; ++i)
{
btm+=1;
if(btm>9)
{
btm=0;
}
}
for (int hangNow = 2; hangNow <= hang ; ++hangNow)
{
if(hangNow!=hang)
{
int frt=btm;
for (int i = 0; i < hang-hangNow; ++i)
{
frt++;
if(frt>9)
{
frt=0;
}
}
printf("%d",arr[frt]);
for (int j = 0; j < hang-1-hangNow; ++j)
{
printf(" ");
}
}
printf("%d\n",arr[bgn]);
bgn++;
if(bgn>9)
{
bgn=0;
}
}
}