高精度阶乘

#include <iostream>
#include <vector>
#include <iomanip>
using namespace std;
const int MAX=100000000;
int main()
{
    int N;
    cin>>N;
    vector<long long int> result;
    while(N)
    {
        if(result.empty()==1)
            result.push_back(N);
        else
        {
            for(int i=result.size()-1;i>=0;i--)
            {
                long long temp=N*result[i];
                if((temp/MAX)!=0) //需要进位的时候
                {
                    if(i==result.size()-1)
                        result.push_back(temp/MAX);
                    else
                        result[i+1]+=(temp/MAX);
                    result[i]=temp%MAX;
                }
                else //不需要进位
                {
                    result[i]=temp;
                }
            }
        }
        N--;

    }
    for(int i=result.size()-1;i>=0;i--)
    {
        if(i==result.size()-1)
            cout<<result[i];
        else
            cout<<setw(8)<<setfill('0')<<result[i];
    }
    return 0;
}


思路:vector的每个单元存一个8位的数,做乘法的时候从高位向低位做(即i--),然后如果得数超过八位就加到下一位的数字中(没有下一位要创建)。

写代码过程中的错误

1.vector empty ==1时为空

2.必须用long long int x=long long y*int/long long int z的形式,因为如果等式右边两个均为int,是先执行乘法(可能会超过最大值然后变成负的),再转换成long long ,结果就错了。

3.setw(8)<<setfill('0')<<result[i]不能调换顺序,如果setfill'0'放在result[i]后面则再第一次打印result[i]时是不会加'0'的。还有使用c++里的格式化输出一定要加iomanip的头文件。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值