这道题之前也试过几次,但是很多问题处理不好,所以一直没拿下,今天放假了沉下心来好好坐了坐,花了1个多小时拿下了,求幂其实也是关于乘法的一个高级运用,也算一个基础吧,思路就是用3个数组反复的做乘法,之后考虑前导后导0的控制
下面上原创代码
#include<stdio.h>
#include<string.h>
#define MAX_SIZE 1000 + 10
int get_array(char x[],int y[])/*这个数组是用来将字符串转化为数组元素的*/
{
int L=strlen(x);
int i,j,point;
for(i=0,j=L-1;j>=0;j--)
{
if(x[j]>='0'&&x[j]<='9')
{
y[i]=x[j]-'0';
i++;
}
else if(x[j]=='.')
point=j; /*记录小数点的位置最为返回值*/
}
return point;
}
int go_to(int a[],int b[],int c[])
{
int i,j;
for(i=0;i<MAX_SIZE/2 -10 ;i++)
for(j=0;j<MAX_SIZE/2-10 ;j++)
c[i+j]+=a[i]*b[j]; /*这里只是存储不着急进位*/
for(i=0;i<MAX_SIZE;i++)
{ /*高精度乘法的进位*/
c[i+1]+=c[i]/10;
c[i]%=10;
}
return ;
}
int memse_t(int x[])
{
int i;
for(i=0;i<MAX_SIZE;i++)
x[i]=0;
return ;
}
int xx(int c[],int w)
{
int i,j;
/*先输出整数的部分,到小数点截止住*/
for(i=MAX_SIZE-10,j=0;i>=6*w;i--)
{
if(j==1)
printf("%d",c[i]);
else if(c[i]!=0)
{
printf("%d",c[i]);
j=1;
}
}
printf(".");
for(j=0;c[j]==0;j++);/*这里去除小数点后的多余的0*/
for(;i>=j;i--)
printf("%d",c[i]);/*输出小数点后面的数字*/
return ;
}
int main()
{
char x[MAX_SIZE];
int a[MAX_SIZE]={0},b[MAX_SIZE]={0},c[MAX_SIZE]={0};
double m;
int i,j,k,n,L,point,w;
while(scanf("%lf %d",&m,&n)!=EOF)
{
sprintf(x,"%lf",m);
point=get_array(x,a);
get_array(x,b);
w=n;
k=n;
n--;
while(1) /*这里用多次相乘*/
{
if(n==0) break;
memse_t(c);
go_to(b,a,c); /*这里将b,a乘结果放在c里面*/
n--;
if(n==0) break;
memse_t(b); /*这里将c,a乘结果放在b里面*/
go_to(c,a,b);
n--;
}
if(k%2==0)/*这里输出的为数组c*/
xx(c,w);
if(k%2==1) /*这里输出的为数组b*/
xx(b,w);
printf("\n");
memse_t(c);
memse_t(a);
memse_t(b);
}
return 0;
}
这题其实我也知道了干什么事一定要用心去做,不能浮躁,我觉得这也是我以后如果成为一个ACMer应该必须具备的素质之一吧,所以在这个寒假除了学习必要的算法以及知识,我认为培养一颗强大的心脏也是我的目标之一!