UVa 748 Exponentiation

/* coder: ACboy date: 2010-2-24 result: 1AC description: UVa 748 Exponentiation */ #include <iostream> #include <string> using namespace std; char result[200]; // 寻找小数点'.'的位置并返回 int findPointPos(char a[]) { int pos = -1; int len = strlen(a); for (int i = 0; i < len; i++) { if (a[i] == '.'){ pos = i; break;} } return pos; } // 对字符串进行反转。 void reverse(char a[]) { int len = strlen(a); for (int i = 0; i < len / 2; i++) { char temp = a[i]; a[i] = a[len - 1 -i]; a[len - 1 - i] = temp; } } // 计算a * b并把结果保存到c中。 void multiply(char a[], char b[], char c[]) { int i, j; int alen = strlen(a); int blen = strlen(b); int up; for (i = 0; i < alen; i++) { up = 0; for (j = 0; j < blen; j++) { int temp = (a[i] - '0') * (b[j] - '0') + up + c[i + j] - '0'; up = temp / 10; c[i + j] = temp % 10 + '0'; } if (up > 0) c[i + j] = up + '0'; } if (up > 0) { c[alen + blen - 1] = up + '0'; c[alen + blen] = '/0'; } else { c[alen + blen - 1] = '/0'; } } int main() { int i, j; char a[10]; int n; #ifndef ONLINE_JUDGE freopen("748.txt", "r", stdin); #endif while (scanf("%s%d", a, &n) != EOF) { int pointBit; int len = strlen(a); // 计算小数点后有多少位小数 并保存到pointBit中。 pointBit = (len - findPointPos(a) - 1) * n; char temp[10]; int c = 0; // 除去小数点'.'并把结果保存在临时变量temp中。 for (i = 0; i < len; i++) { if (a[i] != '.') temp[c++] = a[i]; } temp[c] = '/0'; // 下面的两个for循环用来去除前导0,并把结果保存在a数组中。 len = strlen(temp); for (i = 0; i < len; i++) { if (temp[i] != '0') break; } c = 0; for (j = i; j < len; j++) { a[c++] = temp[j]; } a[c] = '/0'; reverse(a); strcpy(result, a); char tempa[200]; // 计算结果 memset(tempa, '0', sizeof(tempa)); for (j = 1; j < n; j++) { multiply(a, result, tempa); strcpy(result, tempa); if (j != n - 1) memset(tempa, '0', sizeof(tempa)); } // 输出前要进行反转 reverse(tempa); int tempalen = strlen(tempa); // 标记后导0为'-'。 for (i = tempalen - 1; i >= 0; i--) { if (tempa[i] != '0') break; else tempa[i] = '-'; } // 如果有结果整数部分。 if (tempalen > pointBit) { // 输出整数部分 for (i = 0; i < tempalen - pointBit; i++) { cout << tempa[i]; } cout << "."; // 输出小数部分 for (i = tempalen - pointBit; i < tempalen; i++) if (tempa[i] != '-') { cout << tempa[i]; } cout << endl; } // 没有整数部分 else { cout << "."; for (i = 1; i <= pointBit - tempalen; i++) cout << "0"; for (i = 0; i < tempalen; i++) if (tempa[i] != '-')cout << tempa[i]; cout << endl; } } return 0; }

你可能感兴趣的:(UVa 748 Exponentiation)