/*功能:求大整数的阶乘*/ /* 解题思路: 读入大整数,将被乘数和比其小一的乘数分别放在俩个字符串中,申明第三个字符串用来保存结果。然后进行循环。 其中涉及到字符和数字转化的技巧,具体实现请看代码。 */ #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; }