题目要求:LintCode
先把基本的写出来,为了看起来有个大概有个样子(1)每行换行;(2)输出结果4个空格,左对齐(%-5d):
关于%-d的知识:+是右对齐,-是左对齐;数值代表几个空格,如果是左对齐,就把串数字靠左,否则,靠右。
#include <stdio.h>
int main() {
// Write your code here
for(int i = 1; i < 10; i++){
printf("\n");
for(int j = 1; j < 10; j++){
printf("%d * %d = %-5d",i,j,i*j);
}
}
return 0;
}
然后对半切分(j <= i):
before:
for(int j = 1; j < 10; j++){}
after:
for(int j = 1; j <= i; j++){}
note:这个地方写成j<=i,如果是j<i,就会缺少两个数相同相乘的项,这个是我所犯的错误。
于是我就拿着这串代码,高高兴兴地提交了,结果不给过,气死我了。
问了一下AI,有2个误导问题:
- 打印第一行前来了一个换行:
好我改:第一行前面先不用换行
before:
printf("\n");
after:
if(i != 1) printf("\n");
效果如下:
- 说我没按照乘积为 1 位数(即 < 10)则输出 4 个空格,否则输出 3 个空格,每一行的开头和结尾没有空格。好我改,我就用简单放肆写,但是提交不过去。其实这里不需要改之前的%-5d,这个空间设置位5个空之后,其实不管是乘积是1位数,还是2位数都不影响它们之间的固定距离,只要不超过5个空间,尽管往里面塞数字就好。
之前还尝试过用水平对齐符号 \t,但是它是8个空间,不符合要求。
误导代码:if(temp < 10){
printf("%d * %d = %d ",i,j,i*j);
}else{
printf("%d * %d = %d ",i,j,i*j);
}
#include <stdio.h>
int main() {
// Write your code here
for(int i = 1; i < 10; i++){
if(i != 1) printf("\n");
for(int j = 1; j <= i; j++){
int temp = i*j;
if(temp < 10){
printf("%d * %d = %d ",i,j,i*j);
}else{
printf("%d * %d = %d ",i,j,i*j);
}
}
}
return 0;
}
一提交还是错了,快要放弃的时候,我看到了这个提交反馈:原来i和j相等的时候后面不能有空格,这美滋滋,我终于知道我错哪里了,找到病在哪里就好用药。
于是我就在输出的时候,在i与j相等时做了一个判断,无需空格,其他照常输出:
if(temp < 10){
printf("%d * %d = %d ",i,j,i*j);
}else{
printf("%d * %d = %d ",i,j,i*j);
}
最终代码如下:为了方便看动注解都加上了
#include <stdio.h> // 包含标准输入输出库,用于使用printf等函数
int main() { // 程序的主入口点
// Write your code here // 这是一个注释,提示开发者在这里编写代码
for(int i = 1; i < 10; i++){ // 外层循环,变量i从1开始,到9结束(不包括10)
if(i != 1) printf("\n"); // 如果i不是1,打印一个换行符。这样除了第一行外,每行开始前都有一个换行
for(int j = 1; j <= i; j++){ // 内层循环,变量j从1开始,到i结束(包括i)
if(i == j){ // 如果i等于j,即在对角线上
printf("%d * %d = %d", i, j, i * j); // 直接打印乘法表达式和结果,没有额外的空格
} else { // 如果i不等于j,即不在对角线上
printf("%d * %d = %-5d", i, j, i * j); // 打印乘法表达式和结果,%-5d表示左对齐,至少占5个字符宽度,不足部分用空格填充
} // 结束if-else语句
} // 结束内层for循环
} // 结束外层for循环
return 0; // 程序正常结束,返回0
} // 结束main函数
提交完毕,好了今天就到这里啦,回舍。
如果你觉的很有用请给我点个赞吧,非常感谢!