西电复试之——真题2008E

西电复试之——真题2008E

精度计算问题
输入:每组数据占一行,用一对数据表示,第一个数据是R(含小数点共六位),第二个数据是阶数n
输出:输出计算结果

#include<iostream>
#include<cstdio>
#include<string>

using namespace std;
//函数用于计算x的n次方,存入a[]数组
void f(int a[], int x, int n) {
	int temp = 0;
	while (n--) {
		for (int i = 0; i < 400; i++) {
			temp += a[i] * x;
			a[i] = temp % 10;
			temp /= 10;
		}
	}
}

int main() {
	char a[10];
	int n = 0;//阶
	int dot = 0;//存点的位置
	while (gets_s(a)) {
		//找小数点的位置
		for (dot = 0; a[dot] != '.'; dot++);
		//找到最后一个非零的位置
		int q = 0;
		for (q = 5; a[q] == '0'; q--);
		//记录小数点后的有效位置
		int num = q - dot;

		//将输入的小数转化为整数
		int sum = 0;
		for (int i = 0; i <= q; i++) {
			if (a[i] >= '0' && a[i] <= '9')
				sum = sum * 10 + a[i] - '0';
		}
		if (sum == 0) {
			cout << "0" << endl;
			continue;
		}
		//计算阶数
		if (a[7] == ' ')
			n = a[8] - '0';
		else
			n = (a[7] - '0') * 10 + a[8] - '0';
		//需要计算的小数点后位数
		num *= n;
		//保存结果
		int ans[400] = { 1 };
		f(ans, sum, n);
		int last = 0;
		//找到输出的起始位置
		for (last = 399; ans[last == 0 && last != num - 1]; last--);
		for (; last != -1; last--) {
			if (last == num - 1) {
				cout << ".";
			}
			cout << ans[last];
		}
		cout << endl;
	}
	return 0;
}
原创文章 35 获赞 17 访问量 1257

猜你喜欢

转载自blog.csdn.net/qq_41436493/article/details/105802442
今日推荐