题意:输入两个数R和n,R长度为6(在一行1-6列),,n为整数(在一行7-8列)。求R^n。(其中99.999>R>0.0,25>=n>0)
要求:1)输出的整数部分为0时,不输出这个0;2)不输出前导零;3)小数部分没有后缀零;4)结果为整数是没有小数点
!!!我被坑的地方是,测试代码中存在这样的R,例如:123456,不在(0.0,99.999)范围内,好坑啊
题解:比较单纯的大整数乘法。一开始先去掉小数点,剩余的就是整数m,求的m^n。然后加小数。注意的是小数点位置,如果超过了大整数m^n长,需要补零。加上小数点后就是去掉小数的后缀零,以及在结果为整数时去掉小数点。
代码:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <map>
#include <set>
#include <queue>
using namespace std;
const int maxn=2e4+10;
char a[10],c[1000];
int b[1000],t,k;
void mul(int m)//大数乘法
{
int i,j;
for(i=0;i<t;i++)
b[i]=b[i]*m;
int temp=0,x;
for(i=0;i<t;i++)
{
x=b[i]+temp;
b[i]=x%10;
temp=x/10;
}
while(temp)
{
b[t++]=temp%10;
temp=temp/10;
}
}
void pows(int m,int n)//求m^n,并输出结果
{
int i,j,num=0;
for(i=2;i<=n;i++)
mul(m);
k=k*n;
//判断小数点的位置
if(k>=t)
{
c[num++]='.';
for(i=k-1;i>=t;i--)c[num++]='0';
for(i=t-1;i>=0;i--)c[num++]='0'+b[i];
}
else
{
for(i=t-1;i>=0;i--)
{
c[num++]='0'+b[i];
if(i==k)c[num++]='.';
}
}
//删除小数部分后缀零和多余的小数点
while(c[num-1]=='0')num--;
if(c[num-1]=='.')num--;
c[num]='\0';
printf("%s\n",c)
;}
int main()
{
int n;
while(scanf("%s%d",a,&n)!=EOF)
{
//if(n==0){printf("1\n");continue;}
int i,j,m=0;
for(i=0,k=0;i<6;i++)
{
if(a[i]=='.')
{
k=5-i;
continue;
}
m=m*10+(a[i]-'0');
}
t=0;
i=m;
//if(m==0){printf("0\n");continue;}
//printf("%d\n",m);
while(i!=0)
{
b[t++]=i%10;
i=i/10;
}
pows(m,n);
}
return 0;
}