如果通过链接或编写某种类型的sqrt()
函数来判断一个数字是否为三角形,您认为这不是一个可以接受的解决方案:
最后一个字符串中每组**...
的末尾都有一个' '
,因此字符串中最短的线段是"* "
,它有2 char
秒长.
循环中的c
是该迭代应该写入的char数组的索引,a
是'*'
的当前group中的索引,b
是'*'
的当前group的长度减1(因为我们要计算空格).紧接在您的for
循环中的if
子句之前,可以说c
是2到b
加a
的和.
换句话说,如果a
=0,b
=1,那么c
=0,因为从2到0的和是0,加0是0.
如果a
=3,b
=4,则c
=(2+3+4)+3=12.
这意味着您可以像这样编写代码:
#include <stdio.h>
const int LENGTH = 20;
int sumFromTwo(int in){ //Recursive function to calculate sigma(2:in)
if(in < 2)
return 0;
else
return in + sumFromTwo(in - 1);
}
int main()
{
char arr[LENGTH + 1]; //Extra byte for null-terminator
for (int a = 0, b = 1; sumFromTwo(b) + a < LENGTH ; ) {
if (a < b) {
arr[sumFromTwo(b) + a] = '*';
a++;
} else {
arr[sumFromTwo(b) + a] = ' ';
a = 0;
b++;
}
}
arr[LENGTH] = '\0'; //Always null-terminate your strings
printf(arr);
return EXIT_SUCCESS;
}
但是,使用递归来避免使用几乎肯定会被优化到寄存器中的变量,不会为您的计算机节省任何资源,尤其是所有的RAM,所以按照您在问题中的方法来做肯定更干净(但是please空值-在将字符串传递给您 Select 的printf
或puts
之前结束它).