原代码:
#include<iostream>
using namespace std;
long int Multi(int m, int n)
{
long int s=1;
for (int i = n;i <= m;i++)
s *= i;
return s;
}
double Fabricate(int m, int n)
{
double y;
y = double(Multi(m, 1)) / ((Multi(n, 1)) * (Multi(m-n, 1)));
return y;
}
int main()
{
int m, n;
double x;
while (cin >> m >> n)
{
x=Fabricate(m, n);
cout << x << endl;
}
return 0;
}
运行结果发现输入15,12时,并不能得到455,而是奇怪的负小数。这是因为在此算法中需要计算15!,数字太大导致溢出了。
一开始小编想到解决溢出的办法是将int改成long int,将double改成long double,但是发现即使改成long long也会溢出。
这说明要想防溢出,仅靠扩大数据存储空间并不可行,更重要的是优化代码本身。
下面是优化后的代码:
#include<iostream>
using namespace std;
int Multi(int m, int n)
{
int s=1;
for (int i = n;i <= m;i++)
s *= i;
return s;
}
double Fabricate(int m, int n)
{
double y;
y = Multi(m, m-n+1)/ Multi(n, 1);//优化一
return y;
}
int main()
{
int m, n;
long double x;
while (cin >> m >> n)
{
if (n <= m / 2.0)//优化二
{
x = Fabricate(m, n);
}
else
{
x = Fabricate(m, m - n);
}
cout << x << endl;
}
return 0;
}
解析如下: