题目代码:
int main( )
{ int i, j, n;
printf("\nPlease Enter n:");
scanf ("%d", &n);
for(i=1;i<=n;i++)
{ for(j=1;j<=2n-i;j++)
if(j==n-i+1 || j>n-i+1 && i==1)
printf("");
else printf(" ");
}
for(i=1;i<n;i++)
{ for(j=1;j<=3(n-1)-i;j++)
if(j==i+1 || j>i+1 && i==n-1)
printf("");
else printf(" ");
printf("*\n");
}
}
修改后的代码
#include <stdio.h>
int main() {
int i, j, n;
printf("\nPlease Enter n:");
scanf("%d", &n);
printf("\n");
for (i = 1; i <= n; i++) {
for (j = 1; j <= 2 * n + i - 3; j++)
if (j == n - i + 1 || j > n - i + 1 && i == 1)
printf("*");
else
printf(" ");
printf("*\n");
}
for (i = 1; i < n; i++) {
for (j = 1; j <= 3 * (n - 1) - i; j++)
if (j == i + 1 || j > i + 1 && i == n - 1)
printf("*");
else
printf(" ");
printf("*\n");
}
return 0;
}
如果是学校的OJ自动判题, 而不是人工判题的话, 你需要提交这样的代码(即 去掉无关输出)
#include <stdio.h>
int main() {
int i, j, n;
scanf("%d", &n);
for (i = 1; i <= n; i++) {
for (j = 1; j <= 2 * n + i - 3; j++)
if (j == n - i + 1 || j > n - i + 1 && i == 1)
printf("*");
else
printf(" ");
printf("*\n");
}
for (i = 1; i < n; i++) {
for (j = 1; j <= 3 * (n - 1) - i; j++)
if (j == i + 1 || j > i + 1 && i == n - 1)
printf("*");
else
printf(" ");
printf("*\n");
}
return 0;
}
谢谢,请问你是如何构思这类题目的呢?
这是我自己改的,觉得与你的高下立判:
int main() {
int i, j, n;
printf("\nPlease Enter n:");
scanf ("%d", &n);
for(i=1; i<=n; i++) {
if(i==1) {
for(j=1; j<=2n+i-2; j++) {
if(j==n-i+1 || j>n-i+1)
printf("");
else printf(" ");
}
printf("\n");
continue;
}
for(j=1; j<=2*n+i-3; j++) {
if(j==n-i+1)
printf("*");
else printf(" ");
}
if(i!=1) {
printf("*");
}
printf("\n");
}
for(i=1; i<n; i++) {
for(j=1; j<=3*(n-1)-i; j++)
if(j==i+1 || j>i+1 && i==n-1)
printf("*");
else printf(" ");
printf("*\n");
}
}
@墨梅渐盛: 只能说代码写多了就熟练了, 没有太多技巧. 如果你以后对算法竞赛有兴趣, 那才需要一定的做题技巧
对于这道题 你和我的区别也只在关于第一行的处理 你自己写了一个if (i == 1)
实际上, 在题目提供的代码中, 已经有了第一行的情况, 而我是顺着他提供的写, 你是自己重新写了一个第一行的情况 <br/>
提供的代码的思路也是很好理解的 i和j分别代表横纵坐标 对不同的位置有不同的填充字符而已
@KimBing_Ng: 👌
@KimBing_Ng: 你好,可以麻烦再问你一次关于昨天的题目吗?就是每行与每列之间循环的次数,我可以自己列出来,算出来,但是如何写出合适的for循环判断条件来将n,j,i连接起来呢?我试过待定系数法(ai+b=j)但是算出来的条件只符合n=5的情况,如何构思呢?这类图形打印的题目,应该是有什么普遍的规律的吧?
@墨梅渐盛: 你说只符合n=5的情况 怕是吧5这个数字戴进去待定系数法中解放城了吧 你应该把n代进去解方程 得到的i, j关系应该是关于n的函数
怕是没有, 但是可以给你说个通用的无脑做法 (少考虑很多东西)
for (int i = 0; i < 2 * n - 1; ++i) {
for(int j = 0; i < 3 * n - 2; ++j) {
if (shouldPrintStar(i, j))
putchar('*');
else
putchar(' ');
}
putchar('\n');
}
shouldPrintStar()
函数, 在函数里, 根据图形规律写出什么时候应该要画星星int shouldPrintStar(int i, int j) {
// 多边形第一行
if (i == 0 && j >= n - 1 && j <= 2 * n - 2 )
return 1;
else if(.....)
/* 其他情况 自己写上条件判断, 应该画星的return 1即可 */
else return 0; // 其他的填充空格
}
如果有更多问题, 你可以私信我或者加我QQ, 我很乐意认识各地的大学生~
@KimBing_Ng: 谢谢,C语言的函数还没得学到,之前学过一点Java大致能懂意思,以后我试试,关于“你应该把n代进去解方程 得到的i, j关系应该是关于n的函数”这步操作不是很懂?