关于排列组合的程序

nwbxd 2009-03-08 11:07:43
我想计算C1100 110 (1100在下面,110在上面),自己编了一个程序如下:
#include<iostream>
using namespace std;
void main()
{
int i,j,h; //i 在下面,j在上面
double m,n;
double k;
m=1;
n=1;
cout <<"请输入i和j:i=";
cin>>i;
h=i;
cout<<"j=";
cin>>j;
if(i>=j)
{
for(;i>h-j;i--)
m=m*i;
for(;j>0;j--)
n=n*j;
}
k=n/m;
cout<<"k="<<k;
}

当数字小的时候结果是正确的,但输入1100和110时,结果是0.我不知道是什么原因。请大家帮我看看。
...全文
100 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
chin_chen 2009-03-13
  • 打赏
  • 举报
回复
可以考虑一边计算,一边约掉公约数,这样数不会太大的
nwbxd 2009-03-13
  • 打赏
  • 举报
回复
谢谢啊,这里确实是错了。
nwbxd 2009-03-13
  • 打赏
  • 举报
回复
能不能给我详细说说gmp怎么用吗?
grellen 2009-03-09
  • 打赏
  • 举报
回复
double类型能表示的范围也不过是2的64次方,肯定会溢出的
hmt.sysfixer.net 2009-03-09
  • 打赏
  • 举报
回复
mark
grellen 2009-03-09
  • 打赏
  • 举报
回复
k=n/m; //这里也写反了吧应该是k = m / n
wwwypy 2009-03-09
  • 打赏
  • 举报
回复
你的算的顺序不对,没有那种类型能够处理的,我们编过这道题,但是我找不到源代码了。
  • 打赏
  • 举报
回复
if(i>=j)
{
for(;i>h-j;i--)
m=m*i;
for(;j>0;j--)
n=n*j;
}
肯定会溢出的,1100*1009*1008*1007,这样int就承受不了了.
用大数库做吧,gmp库很方便的.
grellen 2009-03-08
  • 打赏
  • 举报
回复
溢出了吧
int一般是占用四个字节,能表示的范围是2的32次方

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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