/*功能:求大整数的阶乘*/
/*
解题思路:
读入大整数,将被乘数和比其小一的乘数分别放在俩个字符串中,申明第三个字符串用来保存结果。然后进行循环。
其中涉及到字符和数字转化的技巧,具体实现请看代码。
*/
#include <iostream>
#include <string>
#include <cmath>
using namespace std;
string findmul(string str1);
int main()
{
string str1,str2;//str1中存放被乘数,str2中存放乘数
int len1,len2,len3,i,j,m,n;
cout<<endl<<" *************************求大整数的阶乘***********************"<<endl;
cout<<"输入一个大整数:\n";
cin>>str1;
//找到乘数,即比str1小1的数
str2=findmul(str1);
//分别求出俩个大整数的长度
len1=str1.size();
len2=str2.size();
//k中保存来至低位的进位,开始的时候应该为0
int k=0;
//str3中保存相乘后的结果,将str3的长度声明为1k,足以放结果了
len3=1024*8;
char *str3 = new char[len3];
char *tem=str3;//当释放str3的内存是用
//将str3中的内容清零,最后一个数字位放字符串结束标志'\0'
memset(str3,'0',len3);
str3[len3-1]=0;
//若乘数为1则不再进行计算
while(str2!="1")
{
//外层循环表示乘数,内层循环表示被乘数,用乘数的各位与被乘数相乘结果保存到str3中
for(i=len2-1;i>-1;i--)
{
//从str3最后一个数字位的前一位存放数字,最后一个数字位已经放上了0
len3=len3-1;
m=len3-1;
//拿出被乘数的每一位与该乘数位相乘
for(j=len1-1;j>-1;j--,m--)
{
n=(str2[i]-'0')*(str1[j]-'0')+(str3[m]-'0')+k;
if(n<10)
{
str3[m]=n+'0';
k=0;
}
else
{
str3[m]=n%10+'0';
k=n/10;
}
}
//在最后一次要将来自低位的进位加到str3中
while(k>10)
{
str3[m]=k%10+'0';
k=k/10;
m--;
}
str3[m]=k+'0';
k=0;
}
//将乘数与被乘数分别赋以新值
while(*str3 =='0')
str3++;
str1=str3;
delete []tem;//释放掉内存
str2=findmul(str2);
len1=str1.size();
len2=str2.size();
//重新为str3初始化
len3=1024*8;
str3 = new char[len3];
char *tem=str3;
memset(str3,'0',len3);
str3[len3-1]=0;
}
cout<<"运算结果为:"<<str1<<endl;
return 0;
}
//功能:将被乘数减一表示的数字赋给一个字符串,该字符串作为乘数
string findmul(string str1)
{
int len=str1.size();
if(str1[len-1]=='0')
{
int i=len-1;
while(str1[i]=='0')
{
str1[i]='9';
i--;
}
str1[i]=str1[i]-'1'+'0';
if(str1[0]=='0')
{
str1=str1.substr(1);
}
}
else
{
str1[len-1]=str1[len-1]-'1'+'0';
}
return str1;
}
求大整数的阶乘
最新推荐文章于 2021-09-12 14:26:18 发布