Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
基本思路+代码基本上就是大数乘。 我的思路: 1 首先判断是不是0次方,是就直接输出1.(后来没加也过了,证明测试数据没有0次方的) 2 测试有没有小数点 有的话去除后面无用的0 记录下小数有多少位,留作输出的时候点小数 点。然后去除前面的0和小数点,转化成大数乘。如果外加判断类似10.000的情况,也直接转为没有小数的形式 3 大数乘,n次 4 点小数点, 需要前面补0 不需要补0 代码: #include <iostream> #include <cstring> using namespace std; unsigned int a[100]; unsigned int b[100]; unsigned int result[100]; char arr[100]; int main() { int n,i,j,k,len,len_a,len_b,jinwei,p,xiaoshu; bool flag; while(cin>>arr>>n) { if(n==0) { cout << "1" << endl; continue; } memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); memset(result,0,sizeof(result)); len = strlen(arr); flag = false; //首先检查小数点 for(i=len-1,j=0; i>=0; i--) { if(arr[i] == '.') { flag = true; break; } } //预处理,去掉后面没用的0 if(flag) { i=len-1; while(arr[i] == '0') { i--; } if(arr[i] == '.') { i--; flag = false; } } //倒序输入,方便乘法 for(; i>=0;i--) { if(arr[i] != '.') { a[j]=arr[i]-'0'; b[j]=arr[i]-'0'; j++; } else { xiaoshu=j; } } len_a=len_b=j; i=0; while(flag) { if((arr[i]>'0'&&arr[i]<='9')) { i++; break; } else if(arr[i] == '.') { i++; } else { len_a--; len_b--; i++; } } //就算总的小数位: xiaoshu = xiaoshu*n; while(--n) { //大数乘 memset(result, 0, sizeof(result)); for(i=0; i<len_a; i++) { for(j=0; j<len_b; j++) { result[i+j] += a[i]*b[j]; } } //处理进位 len_a = len_a+len_b; jinwei=0; for(i=0; i<len_a; i++) { result[i] += jinwei; jinwei = result[i]/10; result[i] %= 10; } if(result[len_a-1] == 0) { len_a--; } memset(a, 0, sizeof(a)); for(i=0; i<len_a; i++) { a[i] = result[i]; } } if(flag) { //这一步特别比较繁琐 if(len_a > xiaoshu) { j = len_a-xiaoshu+1; for(i=0; i<=j&&a[i]==0; i++) { ; } k=i; //不用输出小数点 if(i==j) { for(i=len_a-1; i>=k; i--) { cout << a[i]; } } //需要输出 else { //先输出小数点前面的 j = len_a-xiaoshu; i = len_a-1; while(j--) { cout << a[i--]; } cout << "."; for(; i>=k; i--) { cout << a[i]; } } } else if(len_a == xiaoshu) { //倒去后面的0 j=0; while(a[j] == 0) { j++; } cout << "."; for(i=len_a-1; i>=j; i--) { cout << a[i]; } } else { cout << "."; //计算前面要多输出几个0 j = xiaoshu-len_a; for(i=0; i<j; i++) { cout << "0"; } //倒去后面的0 j=0; while(a[j] == 0) { j++; } for(i=len_a-1; i>=j; i--) { cout << a[i]; } } cout << endl; } //没有小数点的情况 else { for(i=len_a-1; i>=0; i--) { cout << a[i]; } cout << endl; } } } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator