网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
11月16日漏签0天
c语言吧 关注:801,161贴子:4,371,403
  • 看贴

  • 图片

  • 吧主推荐

  • 视频

  • 游戏

  • 11回复贴,共1页
<<返回c语言吧
>0< 加载中...

杨辉三角算法2.0,总结前人(也就是我)的教训……

  • 只看楼主
  • 收藏

  • 回复
  • O子弹O_O
  • 低能力者
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
解决了深度嵌套调用的问题,原来性能才是算法的命脉啊~~


  • O子弹O_O
  • 低能力者
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
#include<stdio.h>
int main()
{
printf("please out the row:");
long int n, valueA, valueB;
scanf("%d",&n); //保存行数
long int yhArray[n];
for(int i = 0; i < n; i++) //赋初值
{
yhArray[i] = 0;
}
for(int row = 1; row <= n; row++)
{
yhArray[0]=1; //每一行的第一列永远是1;
valueA = 1;
for(int col = 1; col <= row; col++)
{
if(col==row)
{
yhArray[col - 1] = 1; //每一行的最后一列当然也是1咯
break;
}
valueB = yhArray[col]; //使用临时变量将即将改变的数组元素的值保存
yhArray[col] = yhArray[col] + valueA;
valueA = valueB;
}
for(int i = 0; i < row; i++) //这里完全是输出
{
printf("%d\t",yhArray[i]);
}
printf("\n");
}
return 0;
}



2025-11-16 04:17:45
广告
不感兴趣
开通SVIP免广告
  • O子弹O_O
  • 低能力者
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
忙了一夜,头发都白了……@RichSelian 


  • O子弹O_O
  • 低能力者
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
很久没有这么兴奋的感觉了,谢谢你们。天亮了,我也该睡觉了……这句话怎么那么别扭?


  • O子弹O_O
  • 低能力者
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
网上搜到的9种算法……
#include<iostream>
#include<iomanip> using namespace std; const int MAXROW = 40; void PrintBlank(int n);
int Com(int n, int m);
int Try(int row, int cel);
void Fun_1(int row);
void Fun_2(int row);
void Fun_3(int row);
void Fun_4(int row);
void Fun_5(int row);
void Fun_6(int row);
void Fun_7(int row);
void Fun_8(int row);
void Fun_9(int row); int main()
{
int row;
cin >> row;
Fun_1(row);
cout << endl;
Fun_2(row);
cout << endl;
Fun_3(row);
cout << endl;
Fun_4(row);
cout << endl;
Fun_5(row);
cout << endl;
Fun_6(row);
cout << endl;
Fun_7(row);
cout << endl;
Fun_8(row);
cout << endl;
Fun_9(row); system("pause");
return 0;
} //输出n个空格
void PrintBlank(int n)
{
for (int i=0; i<n; i++)
cout << ' ';
} //使用二维数组输出杨辉三角
void Fun_1(int row)
{
const int DIS = 6;
int blank = 32;
int a[MAXROW][MAXROW] = {0};
for (int i=0; i<row; i++)
{
PrintBlank(blank-=DIS/2);//输出第i行空格
for (int j=0; j<=i; j++)
{
if (j == 0 || j == i)
a[i][j] = 1;
else //规律: 左上与正上元素之和
a[i][j] = a[i-1][j-1] + a[i-1][j];
cout << setw(DIS) << a[i][j];
if (j == i)
cout << endl;
}
}
}
//使用队列输出杨辉三角
void Fun_2(int row)
{
const int DIS = 6;
int max = row + 2;
int blank = 30;
int *a = new int[max];
int front, rear;
front = 0; a[0] = 1;
rear = 1; a[1] = 1;
PrintBlank(blank);//输出第一行空格 while (front != (rear+1)%max)
{
if (a[front] == 1 && a[(front+1)%max] == 1)//到i-1行尾部
{
rear = (rear+1)%max; a[rear] = 1; //第i行尾部
rear = (rear+1)%max; a[rear] = 1; //队尾进入第i+1行
cout << setw(DIS) << 1 << endl; //输出第i-1行尾部
front = (front+1)%max; //对头进入第i行
PrintBlank(blank-=DIS/2);//输出第i行空格
}
//处理中间数据
rear = (rear+1)%max; a[rear] = a[front] + a[(front+1)%max];
if (front != rear)//队列非空时输出
cout << setw(DIS) << a[front]; //输出对头
front = (front+1)%max; //删除对头元素
}
delete []a;
} //使用两个一维数组代替二维数组输出杨辉三角
void Fun_3(int row)
{
const int DIS = 6;
int blank = 33;
int *a = new int[row]; //存储下一行
int *b = new int[row];//存储输出行
b[0] = 1;
for (int n=1; n<=row; n++)



  • O子弹O_O
  • 低能力者
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
{
//输出第n行
PrintBlank(blank-=DIS/2);
for (int i=0; i<n; i++)
cout << setw(DIS) << b[i];
cout << endl;
if (n == row)//已经到最后一行则不再复制
continue;
//生成第n+1行数据
a[0] = b[0];
for (int i=1; i<n; i++)
a[i] = b[i] + b[i-1];
a[n] = 1;
//复制第n+1行数据
for (int i=0; i<=n; i++)
b[i] = a[i];
}
delete []a;
delete []b;
} //使用一个一维数组和两个临时变量代替二维数组输出杨辉三角:很巧妙
void Fun_4(int row)
{
const int DIS = 6;
int blank = 30;
int *a = new int[row]; //存储输出行
int left, right;
//输出第一行
PrintBlank(blank);//输出第1行空格
cout << setw(DIS) << 1 << endl;
a[0] = 1;//左侧数据永远为1
for (int n=1; n<row; n++)
{
left = a[0];
//生成第n行数据
for (int i=1; i<n; i++)//设置中间数据
{
right = a[i];
a[i] = left + right;//left=a[i-1],right=a[i]
left = right;
}
a[n] = 1;//设置右侧的数据1
//输出第n行
PrintBlank(blank-=DIS/2);
for (int i=0; i<=n; i++)
cout << setw(DIS) << a[i];
cout << endl;
}
delete []a;
}
//使用一个一维数组和两个临时变量代替二维数组输出杨辉三角:方法同Fun_4,但更具有技巧,有点难懂
void Fun_5(int row)
{
const int DIS = 6;
int blank = 33;
int *a = new int[row]; //存储输出行
for (int i=1; i<row; i++)//赋初值0,这个很重要,因为后面有用到
a[i] = 0;
a[0] = 1;
int left, right;
for (int n=1; n<=row; n++)
{
left = 0;
//生成第n行数据
for (int i=0; i<n; i++)
{
right = a[i];
a[i] = left + right;//left=a[i-1],right=a[i]
left = right;
}
//输出第n行
PrintBlank(blank-=DIS/2);
for (int i=0; i<n; i++)
cout << setw(DIS) << a[i];
cout << endl;
}
delete []a;
} //使用一个一维数组输出杨辉三角;两侧的1不变,计算中间的元素
void Fun_6(int row)
{
const int DIS = 6;
int blank = 30;
int *a = new int[row];
//输出第一行
PrintBlank(blank);//输出第1行空格
cout << setw(DIS) << 1 << endl;
a[0] = 1;//最左侧为1,永远不变
for (int n=1; n<row; n++)
{
a[n] = 1; //设置最右侧的1
for (int i=n-1; i>0; i--)//设置中间的元素,由于a[i]的值变化,故应从右到左计算
{
a[i] += a[i-1]; //杨辉三角的规律
}
//输出第n+1行



  • O子弹O_O
  • 低能力者
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
原来,同一个问题可以衍生出不同的算法,而程序员就是在不停的创造和更新出更加完美的算法,怪不得,算法是程序的灵魂。
杨辉三角就告一段落,我一共思索出3种算法,实现2种,还有一种比较简单没有写,这个年过的……


  • 我变成鱼了
  • 彩虹面包
    13
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
复杂度应该差不多了,不过实现还不够简洁
而且如果不引入高精度计算的话算不到100行就溢出了


2025-11-16 04:11:45
广告
不感兴趣
开通SVIP免广告
  • O子弹O_O
  • 低能力者
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
没错没错,有这个问题,我想过将计算后的值分解在使用字符串形式输出,但是没有试,总想不通该怎么做。因为我没看过关于杨辉三角的计算公式,所以代码看起来不简洁,嗯,有机会去找找资料。还有,如果用高精度的话,将数字的高八位和第八位分解开相加再通过字符串形式拼接可以吗?


  • 我变成鱼了
  • 彩虹面包
    13
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
实现高精度加就可以了,具体请Gooooooogle


  • O子弹O_O
  • 低能力者
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
万分那个感谢!


  • O子弹O_O
  • 低能力者
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
呜呜呜,不行了,再不睡觉我就挂了……
你够强!!


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 11回复贴,共1页
<<返回c语言吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示