为了账号安全,请及时绑定邮箱和手机立即绑定

计算任意大的数的阶乘,示出所有的数字

计算任意大的数的阶乘,示出所有的数字

C++
跃然一笑 2019-10-10 16:12:04
最近有人在一次采访中要求我描述一种计算任意大数的阶乘的方法。一种获取答案的所有数字的方法。我搜索了多个地方,并在几个论坛中询问。但是我想知道是否有任何方法可以在不使用GMP之类的库的情况下完成此任务。谢谢。
查看完整描述

3 回答

?
天涯尽头无女友

TA贡献1831条经验 获得超9个赞

GNU Multiprecision库是一个很好的库!但是由于您说不允许使用外部库,所以我认为唯一可能的方法是采用一个int数组,然后像用笔在纸上一样将数字相乘!


这是我前一段时间写的代码。


#include<iostream>

#include<cstring>


int max = 5000;


void display(int arr[]){

    int ctr = 0;

    for (int i=0; i<max; i++){

        if (!ctr && arr[i])         ctr = 1;

        if(ctr)

            std::cout<<arr[i];

    }

}



void factorial(int arr[], int n){

    if (!n) return;

    int carry = 0;

    for (int i=max-1; i>=0; --i){

        arr[i] = (arr[i] * n) + carry;

        carry = arr[i]/10;

        arr[i] %= 10;

    }

    factorial(arr,n-1);

}


int main(){

    int *arr = new int[max];

    std::memset(arr,0,max*sizeof(int));

    arr[max-1] = 1;

    int num;

    std::cout<<"Enter the number: ";

    std::cin>>num;

    std::cout<<"factorial of "<<num<<"is :\n";

    factorial(arr,num);

    display(arr);

    delete[] arr;

    return 0;

}

“ arr”只是一个整数数组,阶乘是一个简单的函数,会将给定的数字乘以“大数”。


希望这能解决您的查询。


查看完整回答
反对 回复 2019-10-10
?
偶然的你

TA贡献1841条经验 获得超3个赞

Srivatsan Iyer的不错解决方案和我的建议是:

  1. 通过使用无符号char数组而不是使用int数组来存储数字,仍可以使内存效率更高。它只需要int数组所需内存的25%。

  2. 为了获得最佳的内存优化,我们还可以使用单个字节代表2位数字。由于仅4位就足以表示0到9之间的任何数字。因此,我们可以使用按位运算将两个数字打包在一个字节中。这将占用int数组所需内存的12.5%。


查看完整回答
反对 回复 2019-10-10
  • 3 回答
  • 0 关注
  • 403 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信