高精度问题之大数求幂
Description Problems involving the computation of exact values of very large magnitude and precision are common. For example,the computation of the national debt is a taxing experience for many computer systems. This problem requires that you write a program to compute the exact value of Rn where R is a real number ( 0.0 < R < 99.999) and n is an integer such that Input?The input will consist of a set of pairs of values for R and n. The R value will occupy columns 1 through 6,and the n value will be in columns 8 and 9.Output?The output will consist of one line for each line of input giving the exact value of R n. Leading zeros and insignificant trailing zeros should be suppressed in the output.Sample Input?95.123 12 0.4321 20 5.1234 15 6.7592 9 98.999 10 1.0100 12 Sample Output?548815620517731830194541.899025343415715973535967221869852721 .00000005148554641076956121994511276767154838481760200726351203835429763013462401 43992025569.928573701266488041146654993318703707511666295476720493953024 29448126.764121021618164430206909037173276672 90429072743629540498.107596019456651774561044010001 1.126825030131969720661201 解题思路: 因为做了大数相加 ,这题也就没什么好思考的。不同之处就是先去掉小数点,计算结果后在适当位置插入小数点即可。这个算法可以计算更大的数。但必须包含小数点。。。。。。 AC代码如下: #include <iostream> #include <string> using namespace std; // 求幂 思路: 先变成整数相乘 然后根据小数的位数 结合幂 算出小数点该结果字符串的位置 即可 string bigIntegerPlus(string src,string num) { string tmp = src; for (int i =num.length() -1; i >= 0 ; --i) { string mid(tmp.length(),'0'); int goBit =0; for (int j = tmp.length()-1; j >= 0; --j) { int tm = goBit + (tmp[j] -'0')* (num[i] - '0'); mid[j] = tm% 10 +'0'; goBit = tm /10; } for (int q = num.length()-1; q> i; --q) mid.push_back('0'); if (goBit != 0) mid.insert(0,string(1,(char)goBit +'0')); // 加法运算 if (i == num.length()-1) src = mid; else { goBit =0; string s(mid.length() - src.length(),'0'); src = s + src; for (int j = mid.length()-1; j>=0; --j) { int tm = (mid[j] - '0') +(src[j] - '0') + goBit; src[j] = tm %10 + '0'; goBit = tm /10; } if (goBit !=0) src.insert(0,(char)goBit +'0')); } } return src; } int main(int argc,char** argv) { string str; while ( getline(cin,str)) { // 分割出待积数 和 幂 以及小数点位置 int i =0; int index = 0;// 小数位置 int count = 0;//幂次数 string num; while ( i< str.length()) { if ( str[i] != ' ') { if (str[i] == '.') index = i; else num.push_back(str[i]); ++i; continue; } while ( !isdigit(str[i])) ++i; if (i + 1 == str.length()) count = str[i] - '0'; else count = (str[i] - '0') * 10 + str[i+1] - '0'; break; } index = num.length() - index; string res = num; for (int i =0; i< count-1; ++i) { res = bigIntegerPlus( res,num); } index = index * count; res.insert(res.length() - index,string(".")); while (res.length() >1 && res[0] == '0') res.erase(0,1); for (int i =res.length()-1; i>=0; --i) { if (res[i] == '0' ) res.erase(i,i+1); else break; } cout<< res<< endl; } return 0; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |