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”只是一个整数数组,阶乘是一个简单的函数,会将给定的数字乘以“大数”。
希望这能解决您的查询。
TA贡献1841条经验 获得超3个赞
Srivatsan Iyer的不错解决方案和我的建议是:
通过使用无符号char数组而不是使用int数组来存储数字,仍可以使内存效率更高。它只需要int数组所需内存的25%。
为了获得最佳的内存优化,我们还可以使用单个字节代表2位数字。由于仅4位就足以表示0到9之间的任何数字。因此,我们可以使用按位运算将两个数字打包在一个字节中。这将占用int数组所需内存的12.5%。
- 3 回答
- 0 关注
- 432 浏览
添加回答
举报