题目点我点我点我
思路:首先处理输入的输入数中的小数点,先把小数点去掉,把原来的数存储在整型数组中,记录小数点的位置,然后再开一个整型数组存储中间结果。接下来比较简单,设数组a和数组b一开始存储输入的数,数组rec是中间数组,每次由数组rec来保存数组a和数组b的相乘结果,然后把数组rec复制到数组a,要注意每次都要对rec清零。
得出结果后就是计算小数点的位置,这个由原来的位置先倒序(因为数组记录也是倒序的数)再乘以N就可以了。
还要注意题目说的小数点前全为零的就输出,后面全为零的小数点也不输出。在讨论区有个数据:10.000 2,答案是100。
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
#define inf 0x3f3f3f3f
#define N 999999
int rec[N],a[N],b[N]; //rec为中间过度数组
int rlen,alen,blen;
void bigmul()
{
memset(rec,0,sizeof(rec));
for(int i=1;i<=alen;i++)
{
for(int j=1;j<=blen;j++)
{
rec[i+j-1]+=a[i]*b[j];
if(rec[i+j-1]>9)
{
rec[i+j]+=rec[i+j-1]/10;
rec[i+j-1]%=10;
}
}
}
if(rec[alen+blen-1]>9)
{
rec[alen+blen]+=rec[alen+blen-1]/10;
rec[alen+blen-1]%=10;
}
alen+=blen;
for(int i=1;i<=alen;i++)a[i]=rec[i];
}
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
char str[10];
int n;
while(cin>>str>>n)
{
int point=-1;
for(int i=5,j=1;i>=0;i--)
{
if(str[i]!='.')
{
a[j]=str[i]-'0';
b[j++]=str[i]-'0';
}
else
{
point=i;
}
}
if(point==-1)
{
alen=6;
blen=6;
}
else
{
alen=5;
blen=5;
}
for(int i=1;i<n;i++)
bigmul();
if(point==-1)
{
for(int i=alen;i>=1;i--)
printf("%d",a[i]);
printf("\n");
}
else
{
int down,up,i,j;
point=5-point; //数组记录是反向的,所以小数点位置也要反向
point*=n;
for(i=1;i<=alen;i++)
{
if(a[i]!=0)
{
down=i;
break;
}
}
for(j=alen;j>=1;j--)
{
if(a[j]!=0)
{
up=j;
break;
}
}
i=down;
j=up;
if(up<point)j=point;
if(down>point)i=point+1; //当小数点后面全为0时,i==j就直接结束输出
for(;j>=i;j--)
{
if(j==point)printf(".");
printf("%d",a[j]);
}
printf("\n");
}
}
return 0;
}