牛顿二项式 - 不适用于更大的数字
Newton's binomial - doesn't work for bigger numbers
我写了一个程序,它应该打印牛顿二项式的值。数量 - 测试次数、t[i][0] - n
、t[i][1] - k
。对于小数字 n 和 k 似乎没问题,但是当我想输入更大的数字时,它会打印0
、1
或小的负整数。 基本上我使用了 int 的长 intead,所以它应该适用于更大的数字。你能解释一下为什么会这样吗?
#include <iostream>
long fact(int x);
using namespace std;
int main()
{
int number;
cin>>number;
int t[number][2];
for(int i=0; i<number; i++)
{
cin>>t[i][0];
cin>>t[i][1];
if (t[i][0]<t[i][1]) return 0;
}
for(int i=0; i<number; i++)
{
cout<<fact(t[i][0])/(fact(t[i][0]-t[i][1])*fact(t[i][1]))<<endl;
}
return 0;
}
long fact(int x)
{
long factt=1;
for(int i=1; i<=x; i++)
{
factt=factt*i;
}
return factt;
}
@edit
谢谢你的建议。我尝试实现这一点,但它不能很好地计算二项式。它为 n=4 和 k=2 打印 11。你可以看看这个吗?
#include <iostream>
long fact(int n, int k);
using namespace std;
int main()
{
int number;
cin>>number;
int t[number][2];
for(int i=0; i<number; i++)
{
cin>>t[i][0];
cin>>t[i][1];
if (t[i][0]<t[i][1]) return 0;
}
for(int i=0; i<number; i++)
{
cout<<fact(t[i][0],t[i][1])<<endl;
}
return 0;
}
long fact(int n, int k)
{
if(n==0 || n==k)
return 1;
else if(n>k)
return fact(n-1,k-1)+fact(n-1, k);
else
return 0;
}
阶
乘增长非常快,甚至无符号的 64 位整数也会溢出n!
n>20
。实现二项式系数的无溢出方法是使用以下递归定义:
binom(n, k) = binom(n-1, k-1) + binom(n-1, k)
这可确保仅当binom(n,k)
太大而无法适应整型的大小时才会出现溢出。
在 Linux 上,32 位
长与 int 相同,适合 32 位。在 Linux 上,64 位长是 64 位长。在 Windows 上,32 位和 64 位长都是 32 位实体
您必须使用 long long
才能保证使用 64 位,尽管这可能不足以克服溢出。如果可能,对二项式使用递归公式
相关文章:
- FLTK 2.0构建和演示,适用于VS2019的2011年左右的代码库
- C++17 - 使用自定义分配器的节点提取/重新插入 - 适用于 clang++/libc++,但不适用于 libstd
- "string.h"在构建适用于iOS的qt应用程序中找不到消息
- 适用于 WebView2 旧版本的示例应用程序
- 在 NVIDIA GEFORCE GTX 1050 上下载适用于 Windows 10 的 openCL 1.2
- __attribute__(优化(0))) 是否适用于"recursively"?
- 为什么 std::erase(std::erase_if) 不是适用于<algorithm>任何容器的模板?
- 使用一个参数的模板函数时出错(适用于 2)
- 使用 适用于 Android 和 iOS 的 tf-lite C++ API
- 为什么这适用于 G++ 而不是 CLANG?
- 适用于 macOS 的 Xcode 应用程序。这就是我设置从USB麦克风输入获取音频的方式。一年前工作,现在没有了。为什么
- 适用于 Linux 的 c++ 上的代理脚本
- 为什么我的 SFINAE 表达式不再适用于 GCC 8.2?
- 使输出流式处理运算符适用于 boost::variant<std::vector<int>、int、double 的正确方法是什么>
- 有没有适用于Windows.lib文件的GNU二进制文件描述符(BFD)
- 模板函数仅适用于VS
- 如何在cmake中包含适用于g++或viceversa的库
- 默认值仅适用于 8 和 9.之后,它使用第一个数字并将其视为 1,2,3
- Isspace()只适用于8以下的数字
- 为什么uniform_int_distribution<uintmax_t>适用于 62 位数字,而不适用于 63 位或 64 位数字?