西电复试之——真题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;
}