真是累~只考验C++的编程基础,用高精度计算乘法,用Java的话两口气就搞定了,结果用Cpp零零碎碎搞了2天,心塞啊。
碰到的问题
1. 函数传参的指针问题
2. 数组的长度计算
用网上的方法sizeof(array)/sizeof(array[0])都得不到正确的结果,得到的长度总是4,可能的解释是因为传进去的是array的指针。后来就只能通过自己记录数组长度来解决了。
3. 最后提交还要注意编译器选择G++还是C++,本地用Codeblocks带的MinGW,所以C++编译就直接一串Compile Error,好在改了之后一次AC了。
另外。。Codeblocks的debug太令人神伤,换Eclipse CDT体验一下,希望和Java的一样好用~编程语言的地理隔离还是有些严重的,慢慢来吧。
过几天再做题,先做一阵实验室工作,不然下次见老板要出事儿了。
代码顺便贴了,希望大牛狠狠拍:
#include <iostream>
#include <stdlib.h>
#include <string.h>
using namespace std;
void parseR(string r, int r_int[], int &decimal_length, int &dot_pos) {
dot_pos = r.length()-1;
int i;
while(r[dot_pos]!='.' && dot_pos >= 0)
dot_pos--;
if(dot_pos==-1) { //如果没有小数点,则说明是一个整数
for(i=r.length()-1; i>=0; i--)
r_int[i] = r[r.length()-1-i]-'0';
decimal_length = 0;
return;
} else {
i = r.length()-1;
while(i>dot_pos && r[i]=='0')
i--;
if(i==dot_pos) { //如果小数点之后全是0,说明是个整数
for(i=dot_pos-1; i>=0; i--)
r_int[dot_pos-1-i]= r[i]-'0';
decimal_length = 0;
return;
} else { //正常的包含若干位小数的一个数字
decimal_length = i-dot_pos;
int j;
for(j=i; j>dot_pos; j--)
r_int[i-j]= r[j]-'0';
for(j=dot_pos-1; j>=0; j--)
r_int[dot_pos-1-j+decimal_length]= r[j]-'0';
}
}
}
int* doExponentiation(int r_int[], int n, int &result_length) {
int result[200]= {0};
int multiplier[200]= {0};
int multiplicand[200]= {0};
int i,j,r_length;
r_length = 6;
i = r_length-1;
while(r_int[i]==0)
i--;
r_length = i+1;
for(i=0; i<r_length; i++) {
multiplicand[i+1] = r_int[i];
multiplier[i+1] = r_int[i];
}
multiplicand[0] = r_length;
multiplier[0] = r_length;
for(int iterator_times = 1; iterator_times < n ; iterator_times++) {
int product[200] = {0};
for(i=1; i<=multiplicand[0]; i++)
for(j=1; j<=multiplier[0]; j++)
product[i+j-1] += multiplicand[i]*multiplier[j];
for(i=1; i<=multiplicand[0]+multiplier[0]+2; i++) {
product[i+1] += product[i]/10;
product[i] = product[i]%10;
}
i=multiplicand[0]+multiplier[0]+2;
while(product[i]==0)
i--;
product[0]=i;
memcpy(multiplicand,product,sizeof(product));
}
return multiplicand;
}
int main() {
string r;
int* calc_result;
int n,dot_pos=0,decimal_length=0,result_length;
while(cin >> r >> n) {
int r_int[6] = {0};
parseR(r, r_int, decimal_length, dot_pos);
calc_result = doExponentiation(r_int, n, result_length);
//如果小数的长度大于了乘积的位数,则先输出小数点
if(decimal_length*n>calc_result[0]){
cout << '.';
for(int i = 1; i<=decimal_length*n - calc_result[0]; i++){
cout << '0';
}
}
for(int i = calc_result[0]; i>0; i--) {
if(i==(decimal_length*n))
cout << '.';
cout << calc_result[i];
}
cout << endl;
}
return 0;
}