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 |
这么长啊。。。。In Reply To:基本思路+代码 Posted by:cyb88 at 2010-02-28 09:08:51 > 基本上就是大数乘。 > 我的思路: > 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