問題在博客 https://blog.csdn.net/qq_42120843/article/details/115391196?spm=1001.2014.3001.5502 中,在這里寫可能篇幅過大,麻煩大佬點一哈,小弟先謝謝各位的無私幫助了
uj5u.com熱心網友回復:
求階乘函式里,int n 型別不對,改double型,int型最大值為:2147483647。當精度取0.01 時,n*fact(n-1)=12! , 0.001時14!,0.0001時16!,當13!的時候已經超出n的范圍,uj5u.com熱心網友回復:
僅供參考:#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
inline int COMPARE(string str1,string str2) {//相等回傳0,大于回傳1,小于回傳-1
if (str1.size()>str2.size()) return 1; //長度長的整數大于長度小的整數
else if (str1.size()<str2.size()) return -1;
else return str1.compare(str2); //若長度相等,則頭到尾按位比較
}
string PLUS(string number1,string number2) {
int i;
int length1 = number1.size();
int length2 = number2.size();
string result="";
reverse(number1.begin(), number1.end());
reverse(number2.begin(), number2.end());
for(i = 0; i < length1 && i < length2; i++) {
char c = (char)(number1[i] + number2[i] - 48);
result = result + c;
}
while(i < length1) {
result = result + number1[i];
++i;
}
while(i < length2) {
result = result + number2[i];
++i;
}
int carry = 0;
for(i = 0; i < (int)result.size(); ++i) {
int value = result[i] - 48 + carry;
result[i] = (char)(value % 10 + 48);
carry = value / 10;
}
if(carry !=0 ) {
result = result + (char)(carry + 48);
}
for(i = result.size() - 1; i >= 0; i--) {
if(result[i] != '0') break;
}
result = result.substr(0, i + 1);
reverse(result.begin(), result.end());
if(result.length() == 0) result = "0";
return result;
}
string MULTIPLY(string number1, string number2) {
int i, j;
int *iresult;
int length1 = number1.size();
int length2 = number2.size();
string result = "";
reverse(number1.begin(), number1.end());
reverse(number2.begin(), number2.end());
iresult = (int*)malloc(sizeof(int) * (length1 + length2 + 1));
memset(iresult, 0, sizeof(int) * (length1 + length2 + 1));
for(i = 0; i < length1; i++) {
for(j = 0; j < length2; j++) {
iresult[i+j] += ((number1[i] - 48) * (number2[j] - 48));
}
}
int carry = 0;
for(i = 0; i < length1 + length2; i++) {
int value = iresult[i] + carry;
iresult[i] = value % 10;
carry = value / 10;
}
for(i = length1 + length2 - 1; i >= 0; i--) {
if(iresult[i] != 0)break;
}
for(; i >= 0; i--) {
result = result + (char)(iresult[i]+48);
}
free(iresult);
if(result == "") result = "0";
return result;
}
string factorial(string n) {
string temp = "1";
string i;
for(i = "1"; COMPARE(i, n) <= 0; i = PLUS(i, "1")) {
temp = MULTIPLY(temp, i);
}
return temp;
}
int main(void) {
cout << factorial("100") << endl;
return 0;
}
//93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000
//
uj5u.com熱心網友回復:
再供參考:#include <iostream>
#include <string>
using namespace std;
inline int compare(string str1,string str2) {//相等回傳0,大于回傳1,小于回傳-1
if (str1.size()>str2.size()) return 1; //長度長的整數大于長度小的整數
else if (str1.size()<str2.size()) return -1;
else return str1.compare(str2); //若長度相等,則頭到尾按位比較
}
string SUB_INT(string str1,string str2);
string ADD_INT(string str1,string str2) {//高精度加法
int sign=1; //sign 為符號位
string str;
if (str1[0]=='-') {
if (str2[0]=='-') {
sign=-1;
str=ADD_INT(str1.erase(0,1),str2.erase(0,1));
} else {
str=SUB_INT(str2,str1.erase(0,1));
}
} else {
if (str2[0]=='-') {
str=SUB_INT(str1,str2.erase(0,1));
} else { //把兩個整數對齊,短整數前面加0補齊
string::size_type L1,L2;
int i;
L1=str1.size();
L2=str2.size();
if (L1<L2) {
for (i=1;i<=L2-L1;i++) str1="0"+str1;
} else {
for (i=1;i<=L1-L2;i++) str2="0"+str2;
}
int int1=0,int2=0; //int2 記錄進位
for (i=str1.size()-1;i>=0;i--) {
int1=(int(str1[i])-'0'+int(str2[i])-'0'+int2)%10;
int2=(int(str1[i])-'0'+int(str2[i])-'0'+int2)/10;
str=char(int1+'0')+str;
}
if (int2!=0) str=char(int2+'0')+str;
}
}
//運算后處理符號位
if ((sign==-1)&&(str[0]!='0')) str="-"+str;
return str;
}
string SUB_INT(string str1,string str2) {//高精度減法
int sign=1; //sign 為符號位
string str;
int i,j;
if (str2[0]=='-') {
str=ADD_INT(str1,str2.erase(0,1));
} else {
int res=compare(str1,str2);
if (res==0) return "0";
if (res<0) {
sign=-1;
string temp =str1;
str1=str2;
str2=temp;
}
string::size_type tempint;
tempint=str1.size()-str2.size();
for (i=str2.size()-1;i>=0;i--) {
if (str1[i+tempint]<str2[i]) {
j=1;
while (1) {//zhao4zhong1添加
if (str1[i+tempint-j]=='0') {
str1[i+tempint-j]='9';
j++;
} else {
str1[i+tempint-j]=char(int(str1[i+tempint-j])-1);
break;
}
}
str=char(str1[i+tempint]-str2[i]+':')+str;
} else {
str=char(str1[i+tempint]-str2[i]+'0')+str;
}
}
for (i=tempint-1;i>=0;i--) str=str1[i]+str;
}
//去除結果中多余的前導0
str.erase(0,str.find_first_not_of('0'));
if (str.empty()) str="0";
if ((sign==-1) && (str[0]!='0')) str ="-"+str;
return str;
}
string MUL_INT(string str1,string str2) {//高精度乘法
int sign=1; //sign 為符號位
string str;
if (str1[0]=='-') {
sign*=-1;
str1 =str1.erase(0,1);
}
if (str2[0]=='-') {
sign*=-1;
str2 =str2.erase(0,1);
}
int i,j;
string::size_type L1,L2;
L1=str1.size();
L2=str2.size();
for (i=L2-1;i>=0;i--) { //模擬手工乘法豎式
string tempstr;
int int1=0,int2=0,int3=int(str2[i])-'0';
if (int3!=0) {
for (j=1;j<=(int)(L2-1-i);j++) tempstr="0"+tempstr;
for (j=L1-1;j>=0;j--) {
int1=(int3*(int(str1[j])-'0')+int2)%10;
int2=(int3*(int(str1[j])-'0')+int2)/10;
tempstr=char(int1+'0')+tempstr;
}
if (int2!=0) tempstr=char(int2+'0')+tempstr;
}
str=ADD_INT(str,tempstr);
}
//去除結果中的前導0
str.erase(0,str.find_first_not_of('0'));
if (str.empty()) str="0";
if ((sign==-1) && (str[0]!='0')) str="-"+str;
return str;
}
string DIVIDE_INT(string str1,string str2,int flag) {//高精度除法。flag==1時,回傳商; flag==0時,回傳余數
string quotient,residue; //定義商和余數
int sign1=1,sign2=1;
if (str2 == "0") { //判斷除數是否為0
quotient= "ERROR!";
residue = "ERROR!";
if (flag==1) return quotient;
else return residue ;
}
if (str1=="0") { //判斷被除數是否為0
quotient="0";
residue ="0";
}
if (str1[0]=='-') {
str1 = str1.erase(0,1);
sign1 *= -1;
sign2 = -1;
}
if (str2[0]=='-') {
str2 = str2.erase(0,1);
sign1 *= -1;
}
int res=compare(str1,str2);
if (res<0) {
quotient="0";
residue =str1;
} else if (res == 0) {
quotient="1";
residue ="0";
} else {
string::size_type L1,L2;
L1=str1.size();
L2=str2.size();
string tempstr;
tempstr.append(str1,0,L2-1);
for (int i=L2-1;i<L1;i++) { //模擬手工除法豎式
tempstr=tempstr+str1[i];
tempstr.erase(0,tempstr.find_first_not_of('0'));//zhao4zhong1添加
if (tempstr.empty()) tempstr="0";//zhao4zhong1添加
for (char ch='9';ch>='0';ch--) { //試商
string str;
str=str+ch;
if (compare(MUL_INT(str2,str),tempstr)<=0) {
quotient=quotient+ch;
tempstr =SUB_INT(tempstr,MUL_INT(str2,str));
break;
}
}
}
residue=tempstr;
}
//去除結果中的前導0
quotient.erase(0,quotient.find_first_not_of('0'));
if (quotient.empty()) quotient="0";
if ((sign1==-1)&&(quotient[0]!='0')) quotient="-"+quotient;
if ((sign2==-1)&&(residue [0]!='0')) residue ="-"+residue ;
if (flag==1) return quotient;
else return residue ;
}
string DIV_INT(string str1,string str2) {//高精度除法,回傳商
return DIVIDE_INT(str1,str2,1);
}
string MOD_INT(string str1,string str2) {//高精度除法,回傳余數
return DIVIDE_INT(str1,str2,0);
}
int main() {
char ch;
string s1,s2,res;
while (cin>>s1>>ch>>s2) {
switch (ch) {
case '+':res=ADD_INT(s1,s2);break;
case '-':res=SUB_INT(s1,s2);break;
case '*':res=MUL_INT(s1,s2);break;
case '/':res=DIV_INT(s1,s2);break;
case '%':res=MOD_INT(s1,s2);break;
default : break;
}
cout<<res<<endl;
}
return(0);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/271658.html
標籤:C語言
上一篇:qcustomplot2重繪問題:切換到其他tab頁面再切換回來,界面顯示例外
下一篇:大佬們幫忙看下哪里錯了
