748 - Exponentiation


注意学会使用函数,模板化使主程序尽可能简单,这样写思路更明确

findPointPos();reverse();mutiply();

注意事项:

①使用字符操作,一定要添加字符串结束符

②学会使用标准输入输出重定向,这样操作更方便一些freopen();

#include <stdio.h>
#include <string.h>

#define M 200

int findPointPos(char a[])
{
	int alen=strlen(a);
	for(int i=0;i<alen;i++)
		if(a[i]=='.')
			return i;
	return -1;
}

void reverse(char a[])
{
	int alen=strlen(a);
	for(int i=0;i<alen/2;i++)
	{
		char temp=a[alen-1-i];
		a[alen-1-i]=a[i];
		a[i]=temp;
	}
}

void multiply(char a[],char b[],char c[])
{
	int alen,blen;
	int q;
	alen=strlen(a);
	blen=strlen(b);
	for(int i=0;i<alen;i++)
	{
		q=0;
		for(int j=0;j<blen;j++)
		{
			int p=(b[j]-'0')*(a[i]-'0')+c[i+j]-'0'+q;//###,c[i+j]必须为字符型
			c[i+j]=p%10+'0';
			q=p/10;
		}
		if(q!=0)
			c[i+blen]=q+'0';
	}
	if(q==0)//###,必须加结束符
		c[alen+blen-1]='\0';
	else
		c[alen+blen]='\0';
}


int main()
{
	freopen("748.in","r",stdin);
	freopen("748.out","w",stdout);
	char result[M],temp_result[M];
	char a[10],temp[10];
	int pointBit,n;
	while(scanf("%s%d",a,&n)==2)
	{
		int i;
		int alen=strlen(a);
		pointBit=alen-findPointPos(a)-1;
		int c=0;
		for(i=0;i<alen;i++)
			if(a[i]!='.')
				temp[c++]=a[i];
		temp[c]='\0';
		int u=0;
		while(u<c && temp[u]=='0')//###,0 为 字符型
			u++;
		for(i=u;i<c;i++)
			a[i-u]=temp[i];
		a[i-u]='\0';
		reverse(a);
		strcpy(result,a);
		for(i=2;i<=n;i++)
		{
			strcpy(temp_result,result);
			memset(result,'0',sizeof(result));
			multiply(a,temp_result,result);
		}
		reverse(result);
		pointBit*=n;
		int rlen=strlen(result);
		for(i=rlen-1;i>=0;i--)
		{
			if(result[i]!='0')
				break;
			else
				result[i]='-';
		}
		if(rlen>pointBit)
		{
			for(i=0;i<rlen-pointBit;i++)
				printf("%c",result[i]);
			printf(".");
			for(;i<rlen;i++)
				if(result[i]=='-')
					break;
				else
					printf("%c",result[i]);
		}
		else
		{
			printf(".");
			for(i=0;i<pointBit-rlen;i++)
				printf("0");
			for(i=0;i<rlen;i++)
				printf("%c",result[i]);
		}
		printf("\n");
	}
	return 0;
}

你可能感兴趣的:(748 - Exponentiation)