人生如戏,mgb
这题不难(然而弱码了3个小时。。。),但是个人人为还是很能提高码代码的能力的
简单来讲就是一题高精度小数幂运算,判断条件比较多(注意0的幂的情况)
弱的做法比较直白,一开始就直接把前面后面的0去除掉,然后记录小数点后的位数,把小数高精度乘变成整数的高精度乘,最后把小数点点进去就好了
这里顺便优化一下用了快速幂,中间因为没有写好快速幂出了一点问题,感觉分过程写代码真的很重要,然后高精度的优化弱就不写了,哪天再碰到高精度的弱就写优化的高精度(毕竟都没有写过),顺便贴一下代码
#include <iostream> #include <string> using namespace std; string mul(string s1, string s2); void Exponentiation(string s, int n); int main() { string s; int n; while (cin >> s >> n) Exponentiation(s, n); return 0; } string mul(string s1, string s2) { if (s1.empty() || s2.empty()) return ""; //由于程序里0是不表示的,然后在下面s1.size()+s2.size()-1会出错,于是直接退出 int a[1000] = { 0 }; int b[1000] = { 0 }, c[1000] = { 0 }; for (int i = s1.size() - 1; i >= 0; i--) b[s1.size() - 1 - i] = s1[i] - '0'; for (int i = s2.size() - 1; i >= 0; i--) c[s2.size() - 1 - i] = s2[i] - '0'; for (int i = 0; i < s1.size(); i++) for (int j = 0; j < s2.size(); j++) { a[i + j] += b[i] * c[j]; } int i = 0; while (i < (s1.size() + s2.size() - 1) || a[i]) { a[i + 1] += a[i] / 10; a[i] = a[i] % 10; i++; } i--; string s; while (i >= 0) { s = s + (char)(a[i] + '0'); i--; } return s; } void Exponentiation(string s, int n) { string ss = "1"; int pos = s.find('.'); int m = 0; if (pos == string::npos) { for (int i = 0; i < s.size(); i++) m = (s[i] - '0') + m * 10; pos = 0; } else { while (s[s.size() - 1] == '0') s.erase(s.size() - 1, 1); for (int i = 0; i < pos; i++) m = (s[i] - '0') + m * 10; for (int i = pos + 1; i < s.size(); i++) m = (s[i] - '0') + m * 10; pos = s.size() - pos - 1; } pos *= n; //pos 即最后会有几位小数 s.clear(); while (m) { s = (char)(m % 10 + '0') + s; m = m / 10; } //s 即小数转换后的整数 while (n != 1) { //快速幂 if (n % 2 == 0) s = mul(s, s); else { ss = mul(ss, s); s = mul(s, s); } n = n / 2; } s = mul(s, ss); if (s.empty()) s = "0"; //结果为0的话s会是空,所以加一下 int size = s.size(); if (pos == 0) cout << s; else if (size < pos) { cout << '.'; for (int i = 0; i < pos - size; i++) cout << '0'; cout << s; } else { for (int i = 0; i < size; i++) if (i == size - pos) cout << '.' << s[i]; else cout << s[i]; } cout << endl; return; }顺便吐个槽,POJ上面第一题a+b,第二题难度就跳成这个了,真是操蛋