没找到这道题在哪儿提交 所以不一定会AC 主要是用了标准库 时间上不保证会通过
因为是大数运算 所以用容器模拟了一个LargeInt类 时间有限 只提供了 *= /= 和 << 三个运算符 正好够本题用
编程效率太低 又要赶着睡觉
原理是用数组模拟多位数乘除过程 这里数组一个元素值0-9999 正好表示大整数中的4个十进制位 4位一组
由于太复杂 所以先只实现了乘数和除数都是“一位”的情形 即乘除的又操作数要小于10000 但对本题来说足够用了
思路是看的百度知道上的 http://zhidao.baidu.com/question/166472785.html
主函数 用了LargeintInt 很简明
程序代码:
int main()
{
int n;
LargeInt An;
while(cin>>n && n >= 1){
An = 1;
for(int i(2); i <= n; i++){
An *= 4*i-2;
An /= i+1;
}
cout << An << endl;
}
return 0;
}
类的定义及实现如下
程序代码:
#include <iostream>
#include <vector>
using namespace std;
class LargeInt
{
public:
LargeInt(): n(1,0) {}
LargeInt(int i): n(1,0) {*n.begin() = i;}
~LargeInt() {}
LargeInt& operator*=(int m);
LargeInt& operator/=(int m);
friend ostream& operator<<(ostream &out, LargeInt &Ln);
private:
vector<long> n;
int carry(long &i){
int tmp = i<10000 ? 0 : i/10000;
if(tmp) i %=10000;
return tmp;
}
};
LargeInt& LargeInt::operator*=(int m)
{
int carryval = 0;
for(vector<long>::iterator iter=n.begin();
iter != n.end(); iter++){
*iter *=m;
*iter +=carryval;
carryval = carry(*iter);
}
if(carryval) n.push_back(carryval);
return *this;
}
LargeInt& LargeInt::operator/=(int m)
{
int rem = 0;
if(n.end()-n.begin() > 1 && *n.rbegin() < m){
*(++n.rbegin()) += (*n.rbegin())*10000;
n.pop_back();
}
for(vector<long>::reverse_iterator iter=n.rbegin();
iter != n.rend(); iter++){
*iter +=rem;
rem = (*iter%m)*10000;
*iter /=m;
}
return *this;
}
ostream& operator<<(ostream &out, LargeInt &Ln)
{
for(vector<long>::reverse_iterator iter=Ln.n.rbegin();
iter != Ln.n.rend(); iter++){
if(iter != Ln.n.rbegin()){
out.fill('0');
out.width(4);
}
out << *iter;
}
return out;
}
程序的运行情况:
图片附件: 游客没有浏览图片的权限,请
登录 或
注册
现在刚刚在学C++ 借楼主题目练习练习 欢迎批评