| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 552 人关注过本帖
标题:求教:程序算法可能出错了,输出结果不对
只看楼主 加入收藏
白金伯爵
Rank: 2
等 级:论坛游民
帖 子:47
专家分:48
注 册:2015-9-21
结帖率:75%
收藏
已结贴  问题点数:20 回复次数:9 
求教:程序算法可能出错了,输出结果不对
程序代码:
//杨辉三角
/*杨辉三角的特性:
1.每个数等于它上方两数之和。
2.每行数字左右对称,由1开始逐渐变大。
3.第n行数字有n项。
4.第n行数字之和为2^n-1。
5.第n行的第m个数可表示为c(n-1,m-1)。
*/
#include<stdio.h>

int choses(int a,int b)
{
    int c=1;
    while(b>0)
    {
        c*=a--;
        b--;    
    }    
    while(b>1)
    {
        c/=b--;    
    }
    return c;
}

int main(void)
{
    int a[5][5]={0};
    int i,j;
    for(i=1;i<=5;i++)
    {
        for(j=1;j<=5;j++)
        {
            a[i][j]=choses(i-1,j-1);
            printf("%d    ",a[i][j]);    
        }    
        printf("\n");
    }
    return 0;    
}

图片附件: 游客没有浏览图片的权限,请 登录注册

可能算法有问题,请大神帮助!
搜索更多相关主题的帖子: 杨辉三角 左右 
2015-11-12 09:58
li459461891
Rank: 2
等 级:论坛游民
帖 子:27
专家分:89
注 册:2015-11-5
收藏
得分:0 
回复 楼主 白金伯爵
这种内存问题八成都是由于数组越界或者变量未初始化引起的。

以下代码:
程序代码:
...
    int a[5][5]={0};
    int i,j;
    for(i=1;i<=5;i++)
    {
        for(j=1;j<=5;j++)
        {
...
因为数组a长度是5,数组下标从0开始最大到4
所以两个for循环应该这样写
    for(i=1;i<5;i++)
    {
        for(j=1;j<5;j++)
        {

改完以后内存就不报错了。
如果还有其他逻辑错误,自己就可以继续调试着改改了。
2015-11-12 10:16
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
这个首先你得 把你的思路描述一下  

光从代码上分析你的思路  如果是正确的代码还凑合  如果是失败的代码  谁能分析出来呢

另: c 习惯于 数组下标从0 起步 至N-1结束   你这里的  i<=5 j<=5  明显是越界的

DO IT YOURSELF !
2015-11-12 10:17
白金伯爵
Rank: 2
等 级:论坛游民
帖 子:47
专家分:48
注 册:2015-9-21
收藏
得分:0 
回复 2楼 li459461891
谢谢!
这个是我疏忽了。
可是更改了循环起始值后,编译不报错了,但是结果还是错的。。。
2015-11-12 10:41
白金伯爵
Rank: 2
等 级:论坛游民
帖 子:47
专家分:48
注 册:2015-9-21
收藏
得分:0 
回复 3楼 wp231957
谢谢!
数组溢出这个确实是我的失误,已更改。
这段代码编写的思路是根据杨辉三角的第5个特性展开的,即:第n行的第m个数可表示为c(n-1,m-1)。
现在不知道是编写的哪个部分有问题,输出结果不对。
2015-11-12 10:43
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:10 
while (b > 0)
{
    c *= a--;
    b--;
}
while (b > 1)  // 不会成立了
{
    c /= b--;
}


[fly]存在即是合理[/fly]
2015-11-12 10:49
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
我这里有一个以前写的  填充杨辉三角的代码

程序代码:
 //以下用杨辉三角公式填充二维数组
     yhsj[0][0]=1;
     for(i=1;i<n;i++)
         for(j=0;j<=i;j++)
         {
             if(j==0) yhsj[i][j]=yhsj[i-1][j]; else  //处理数组第一列
                 if(j==n-1) yhsj[i][j]=yhsj[i-1][j-1];else  //处理数组最后一列
                      yhsj[i][j]=yhsj[i-1][j-1]+yhsj[i-1][j];
         }

DO IT YOURSELF !
2015-11-12 10:56
白金伯爵
Rank: 2
等 级:论坛游民
帖 子:47
专家分:48
注 册:2015-9-21
收藏
得分:0 
回复 6楼 azzbcc
谢谢!
受教了!
2015-11-13 08:31
白金伯爵
Rank: 2
等 级:论坛游民
帖 子:47
专家分:48
注 册:2015-9-21
收藏
得分:0 
程序代码:
//杨辉三角
/*杨辉三角的特性:
1.每个数等于它上方两数之和。
2.每行数字左右对称,由1开始逐渐变大。
3.第n行数字有n项。
4.第n行数字之和为2^n-1。
5.第n行的第m个数可表示为c(n-1,m-1)。
*/
#include<stdio.h>

int choses(int a,int b)
{
    int c=1,cnt=b;
    while(cnt>0)
    {
        c*=a--;
        cnt--;    
    }    
    while(b>1)
    {
        c/=b--;    
    }
    return c;
}

int main(void)
{
    int a[5][5]={0};
    int i,j;
    for(i=0;i<5;i++)
    {
        for(j=0;j<5;j++)
        {
            a[i][j]=choses(i,j);
            printf("%d    ",a[i][j]);    
        }    
        printf("\n");
    }
    return 0;    
}

输出结果对了。
另,请问如果想通过输入确定输出的杨辉三角阶数,怎么定义a[][]这个二维数组啊?
2015-11-13 08:33
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:10 
回复 9楼 白金伯爵
申请内存

DO IT YOURSELF !
2015-11-13 14:06
快速回复:求教:程序算法可能出错了,输出结果不对
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.033928 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved