打印类似杨辉三角的问题

gaochizhen33 2011-11-17 11:11:28
最近学习算法方面的知识,记得原来打印过一个类似杨辉三角的三角形,不过写的很复杂,不知道如何写一个简单的方法,希望各位牛人指导。打印出的图形如下图所示,能手动输入行数

*
* *
* * *
* * * *
* * * * *



希望代码能过尽量简洁,目前我主要的困惑是不知道如何将每行中空格与星号的输出控制与总行数用代码简洁的表示出来
...全文
321 26 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
i945800687 2011-11-20
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 gaochizhen33 的回复:]
引用 22 楼 i945800687 的回复:
好帖!
收藏了

留着以后看,现在里面有些代码还看不懂
以前我也试过,但想不出来~~~~

请教5楼的朋友,如果要以数字显示,可能实现吗?
就是下面的情况:

1
1 1
1 2 1
1 3 3 1
1 4 6 4 1

可以的 如果显示数字的用数组来存储数据这个会变的简单
[/Quote]


嗯,以后会用了我就试试
gaochizhen33 2011-11-18
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 cloudzay 的回复:]
递归写了一个程序

C/C++ code

#include <stdio.h>

int prl(int l)
{
if (l == 1) return printf("* \n");
printf("* ");
return prl(--l);
}

int prc(int t, int c, int *n)
{
if (c == ……
[/Quote]

看着挺帅气的 能不能解释一下啊?
gaochizhen33 2011-11-18
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 i945800687 的回复:]
好帖!
收藏了

留着以后看,现在里面有些代码还看不懂
以前我也试过,但想不出来~~~~

请教5楼的朋友,如果要以数字显示,可能实现吗?
就是下面的情况:

1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
[/Quote]
可以的 如果显示数字的用数组来存储数据这个会变的简单
i945800687 2011-11-18
  • 打赏
  • 举报
回复
不是吧

-22,-23,CSDN的排版不给力啊!

反正能看懂意思的吧~~~
i945800687 2011-11-18
  • 打赏
  • 举报
回复
汗,上面没打清楚

1
1 1
1 2 1
1 3 3 1
1 4 6 4 1

i945800687 2011-11-18
  • 打赏
  • 举报
回复
好帖!
收藏了

留着以后看,现在里面有些代码还看不懂
以前我也试过,但想不出来~~~~

请教5楼的朋友,如果要以数字显示,可能实现吗?
就是下面的情况:

1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
赵4老师 2011-11-17
  • 打赏
  • 举报
回复
//按如下格式打印杨辉三角形的前MAXN行。
// 1
// 1 1
// 1 2 1
// 1 3 3 1
// 1 4 6 4 1
// 1 5 10 10 5 1
#include <stdio.h>
#define MAXN 68
unsigned __int64 y[MAXN][MAXN];
int i,j;
void main() {
printf("1\n");
printf("1 1\n");
y[1][0]=1ui64;y[1][1]=1ui64;
for (i=2;i<MAXN;i++) {
y[i][0]=1ui64;printf("1 ");
for (j=1;j<=i-1;j++) {
y[i][j]=y[i-1][j-1]+y[i-1][j];
printf("%I64u ",y[i][j]);
}
y[i][i]=1ui64;printf("1\n");
}
}
//1
//1 1
//1 2 1
//1 3 3 1
//1 4 6 4 1
//1 5 10 10 5 1
//1 6 15 20 15 6 1
//1 7 21 35 35 21 7 1
//1 8 28 56 70 56 28 8 1
//1 9 36 84 126 126 84 36 9 1
//...
//1 67 2211 47905 766480 9657648 99795696 869648208 6522361560 42757703560 247994680648 1285063345176 5996962277488 25371763481680 97862516286480 345780890878896 1123787895356412 3371363686069236 9364899127970100 24151581961607100 57963796707857040 129728497393775280 271250494550621040 530707489338171600 972963730453314600 1673497616379701112 2703342303382594104 4105075349580976232 5864393356544251760 7886597962249166160 9989690752182277136 11923179284862717872 13413576695470557606 14226520737620288370 14226520737620288370 13413576695470557606 11923179284862717872 9989690752182277136 7886597962249166160 5864393356544251760 4105075349580976232 2703342303382594104 1673497616379701112 972963730453314600 530707489338171600 271250494550621040 129728497393775280 57963796707857040 24151581961607100 9364899127970100 3371363686069236 1123787895356412 345780890878896 97862516286480 25371763481680 5996962277488 1285063345176 247994680648 42757703560 6522361560 869648208 99795696 9657648 766480 47905 2211 67 1

由上面的代码结果可见,绝对的等腰是根本做不到的。
gaochizhen33 2011-11-17
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wangliangffaflgh 的回复:]
C/C++ code

#include <stdio.h>

int main(void)
{
int i, j;
int line;

printf("请输入行数:");
scanf("%d", &line);

for(i=0; i<line; i++)
{
for(j=line-i; j>1……
[/Quote]
这个方法是将*与后面的空格看成一个整体,也挺不错的。
有没有一种方法,能在每次输出时,只输出一个*,打印星的位置是根据行数计算出来的,不再输出中使用空格来对齐
测试NULL 2011-11-17
  • 打赏
  • 举报
回复

#include <stdio.h>

int main(void)
{
int i, j;
int line;

printf("请输入行数:");
scanf("%d", &line);

for(i=0; i<line; i++)
{
for(j=line-i; j>1; j--)
{
printf(" ");
}
for(j=line-i; j<=line; j++)
{
printf("* ");
}
printf("\n");
}
return 0;
}

  • 打赏
  • 举报
回复
空格递减,*号递加嘛。还不会吗
自易而望 2011-11-17
  • 打赏
  • 举报
回复
#include<iostream.h>
int main()
{
int i,j;
for(i=1;i<=10;i++)
{
int e=0;
while(e<10-i)
{
cout<<" ";
e=e+1;
}
for(j=0;j<i;j++)
cout<<"*"<<" ";
cout<<endl;
}
return 0;
}

试试这个,这是我同学要我编的,我随意编了下,

运行结果就是这个,
测试NULL 2011-11-17
  • 打赏
  • 举报
回复
雲哉 2011-11-17
  • 打赏
  • 举报
回复
递归写了一个程序

#include <stdio.h>

int prl(int l)
{
if (l == 1) return printf("* \n");
printf("* ");
return prl(--l);
}

int prc(int t, int c, int *n)
{
if (c == *n) return prl((*n)++);
printf(" ");
prc(t, c - 1, n);
if (t != c) return 0;
if (t == *n) return prl(t);
return prc(t, c, n);
}

int main()
{
int i = 1;
prc(20, 20, &i);

return 0;
}

测试NULL 2011-11-17
  • 打赏
  • 举报
回复
你还可以把下面的几个注释掉的语句分别试试看看:

#include <stdio.h>
#include <windows.h>

void gotoxy(int x, int y)
{
HANDLE hOutput;
COORD loc;
loc.X = x;
loc.Y = y;
hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(hOutput, loc);
return;
}

int main(void)
{
int i, j;
int line = 5;

for(i=0; i<line; i++)
{
for(j=line-i; j<=line; j++)
{
gotoxy(2*(line-j)+(line-i)-1, i);
//gotoxy(4*(line-j)+2*(line-i)-2, i);
//gotoxy(6*(line-j)+3*(line-i)-3, i);
//gotoxy(10*(line-j)+5*(line-i)-5, i);
printf("*");
}
}
printf("\n");
return 0;
}
测试NULL 2011-11-17
  • 打赏
  • 举报
回复
这样改,你再看看:

#include <stdio.h>
#include <windows.h>

void gotoxy(int x, int y)
{
HANDLE hOutput;
COORD loc;
loc.X = x;
loc.Y = y;
hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(hOutput, loc);
return;
}

int main(void)
{
int i, j;
int line = 10;

for(i=0; i<line; i++)
{
for(j=line-i; j<=line; j++)
{
gotoxy(4*(line-j)+2*(line-i)-1, i);
printf("*");
}
}
printf("\n");
return 0;
}
测试NULL 2011-11-17
  • 打赏
  • 举报
回复
屏幕上没有第0行,只是我自己人为的把第0行作为第一行
你可以简单改一下程序运行 看看
gaochizhen33 2011-11-17
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 wangliangffaflgh 的回复:]
别客气,4*(line-j)+2*(line-i)-1这种计算方法我也是想了好多遍才得到的

开始的文字占了一行,i+1就是从第二行开始,因为i是从零开始的。
[/Quote]
恩 谢了 好的方法值得借鉴。。文字只占了一行么?

gotoxy(i,j)就是定位到控制台(Console)屏幕的 第i+1列 第j+1行

这个地方i+1然后定位到i+1+1的位置,从第二行开始,第0行和第1行不都是被文字占用了么?
测试NULL 2011-11-17
  • 打赏
  • 举报
回复
别客气,4*(line-j)+2*(line-i)-1这种计算方法我也是想了好多遍才得到的

开始的文字占了一行,i+1就是从第二行开始,因为i是从零开始的。
gaochizhen33 2011-11-17
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 wangliangffaflgh 的回复:]
gotoxy就是定位控制台(Console)printf输出的位置,
比如gotoxy(i,j)就是定位到控制台(Console)屏幕的 第i+1列 第j+1行


C/C++ code

#include <stdio.h>
#include <windows.h>

void gotoxy(int x, int y)
{
HANDLE hOutput;
……
[/Quote]

谢谢了 不过用4*(line-j)+2*(line-i)-1这种计算方法定位位置还挺难想到的。

i+1就是从第三行开始定位了,是不是因为开始的文字占用了两行?
zhaoliang092011 2011-11-17
  • 打赏
  • 举报
回复
高手云集啊!我也学习一下。
加载更多回复(4)

33,321

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧