| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1977 人关注过本帖, 1 人收藏
标题:有一个问题不懂,指教
只看楼主 加入收藏
chenyuxi2016
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2016-9-22
收藏
得分:0 
回复 9楼 demon90s
这里我刚才写错了,之前是这样写的,谢谢你,改了之后结果还是不对
2016-09-22 11:08
ehszt
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:40
帖 子:1745
专家分:3216
注 册:2015-12-2
收藏
得分:0 
#include<conio.h>
 #include<stdio.h>
 #include<stdlib.h>
 long long proc(int m,int n)
 {
 long  long s;
 long long A=1,B=1,C=1;
 int i,j,k,x;
 x=m-n;
 for(i=1;i<=m;i++)
 A*=i;
 for(j=1;j<=n;j++)
 B*=j;
 for(k=1;k<=x;k++)
 C*=x;
 if(m>n)
 s=A/(B*C);
 return s;
 }
  main()
 {
 system("CLS");
 printf("p=%ld\n",proc(20,10));
 }

2016-09-22 11:08
chenyuxi2016
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2016-9-22
收藏
得分:0 
回复 9楼 demon90s
谢谢你,你的程序运行结果很对,,,嗯,可以帮我找找之前的错误在哪里吗?
2016-09-22 11:10
chenyuxi2016
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2016-9-22
收藏
得分:0 
回复 11楼 chenyuxi2016
你好D:\VC++程序代码\vvc\fffffff.cpp(7) : error C2632: 'long' followed by 'long' is illegal
你的程序我运行了,说有不合法语句
2016-09-22 11:13
linlulu001
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:20
帖 子:944
专家分:4047
注 册:2016-4-13
收藏
得分:4 
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
double proc(double m,double n)
{
double s;
double A=1,B=1,C=1,i,j,k,x;
x=m-n;
for(i=2;i<=m;i++)
A*=i;
for(j=2;j<=n;j++)
B*=j;
for(k=2;k<=x;k++)
C*=x;
if(m>n)
s=A/(B*C);
return s;
}
int main()
{
printf("p=%.0lf\n",proc(20,10));
}
不能用long long类型就用double类型。
收到的鲜花
  • chenyuxi20162016-09-22 12:11 送鲜花  3朵   附言:好文章
2016-09-22 11:39
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:4 
用浮点类型的,即使结果正确,也应该扔茅坑里。

先分析一下 20! / 10! / 10!
20! = 2432902008176640000,需要62bits的整数类型进行存储
所以第一种方法有了,就是用 uint64_t 保存中间结果

在计算 20!/10! 时,不需要先算出20!再除以10!,可以直接求 20*19*18*……*11,这样就可以使得中间结果的峰值降低
20*19*18*……*11 = 670442572800,需要40bits的整数类型进行存储
所以第二种方法有了,还是得用 uint64_t 保存中间结果,但可计算范围比第一种方法更大了,可喜的进步

我们知道排列组合的结果必然是个整数,即必然有一种方法使得计算中间结果不大于最终的结果
这就得靠知识储备,杨辉三角 其实就是个 组合数列
所以第三种方法有了,利用杨辉三角,这次只需要用 uint32_t 就行了

下面详细讲解一下杨辉三角
C(m,n) 和 C(m,m-n) 的结果是一样的
假设要求 C(5,3),等同于求 C(5,2)。下面是杨辉三角矩阵
1, 0,  0,  0, 0, 0, 0, ……
1, 1,  0,  0, 0, 0, 0, ……
1, 2,  1,  0, 0, 0, 0, ……
1, 3,  3,  1, 0, 0, 0, ……
1, 4,  6,  4, 1, 0, 0, ……
1, 5, 10, 10, 5, 1, 0, ……
看到第5行第2列了,它就是C(5,2)的结果
看,多么简单呀,简单到我与其用文字来描述算法,还不如直接贴代码
程序代码:
unsigned C( unsigned m, unsigned n )
{
    if( m < n )
        return 0;

    n = n<m-n?n:m-n;
    unsigned* buf = (unsigned*)calloc( n+1, sizeof(*buf) );
    buf[0] = 1;

    for( unsigned r=0; r!=m; ++r )
        for( unsigned c=n; c!=0; --c )
            buf[c] += buf[c-1];

    unsigned r = buf[n];
    free( buf );
    return r;
}



收到的鲜花
  • chenyuxi20162016-09-22 12:12 送鲜花  3朵   附言:好文章
2016-09-22 12:08
ehszt
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:40
帖 子:1745
专家分:3216
注 册:2015-12-2
收藏
得分:0 
#include<conio.h>
  #include<stdio.h>
  #include<stdlib.h>
  long long proc(long m,long n)
  {
  long long s;
   long long A=1,B=1,C=1;
  int i,j,k,x;
  x=m-n;
  for(i=1;i<=m;i++)
  A*=i;
  for(j=1;j<=n;j++)
  B*=j;
  for(k=1;k<=x;k++)
  C*=k;       //这里应该是k而不是x
  if(m>n)
  s=B*C;
  s=A/s;
  return s;
  }
   main()
  {
  system("CLS");
  printf("p=%lld\n",proc(20,10));
  }
2016-09-22 12:12
chenyuxi2016
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2016-9-22
收藏
得分:0 
回复 15楼 linlulu001
谢谢,很详细,受教了
2016-09-22 12:13
chenyuxi2016
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2016-9-22
收藏
得分:0 
回复 15楼 linlulu001
谢谢 理解啦
2016-09-22 12:14
chenyuxi2016
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2016-9-22
收藏
得分:0 
回复 16楼 rjsp
thanks 受教了
2016-09-22 12:15
快速回复:有一个问题不懂,指教
数据加载中...
 
   



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

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