加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

高精度问题之大数求幂

发布时间:2020-12-14 02:26:51 所属栏目:大数据 来源:网络整理
导读: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

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

$0 < n le 25$

.

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;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读