| ||||||||||
| 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