poj 1001(高精度)

这道题真是花了我不少时间,它涉及到的细节太多,wa了四次,有三次编译错误,真有点崩溃了哭断断续续做了大概有一天了,一直修改错误,没办法,细节真是太多了,比如说10.0000,是要输出10的,而我只输出了1,反正就是有各种各样的变态数据测试,编译错误竟然是因为我定义的int类型函数没有返回值,据说c++是比较严谨的,所以改成void后就A了大笑昨天下午A的,前天上午算法设计课上看的题目,难过难过难过,昨天晚上去看电影了大笑,刘德华,井柏然主演的失孤,好了,放代码了
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int a[202],d[20],c[202],e[202];
char b[20];
int i,j,n,num,y1,x1,m,q,k,up,up1; 
void mul()
{
		for(int p=2;p<=n;p++)
		{
		  memset(e,0,sizeof(e));
		  for(i=y1;i>=0;i--)
			{
				memset(c,0,sizeof(c));
				k=200-y1+i,up=0;
				for(j=200;j>m;j--)
				{
					c[k]=d[i]*a[j]+up;
					up=c[k]/10;
					c[k]=c[k]%10;
					k--;
				}
				if(up!=0)
				     c[k--]=up; 
				for(q=200,up1=0;q>k;q--)
				{
					e[q]=e[q]+c[q]+up1;
					up1=e[q]/10;
					e[q]=e[q]%10;
				}
				if(up1!=0)
					e[q--]=up1;
			}
				m=q;
				for(int y=200;y>q;y--)
					a[y]=e[y];			
		}
}
void print()
{
	    if(n==1)
		{
			j=y1;
			for(i=200;i>x1;i--)
				e[i]=d[j--];
				q=x1;
		} 
		int w=200;
		for(int y=w;y>q;y--)
		{
			if(e[y]==0&&y!=200-num*n)
				w--;
			else
				break;
		}
		if(w==q)
			printf("%d",0);
		else
		{
			int flag=0;
			if(num==5)
			  {
			    printf(".");
			    flag=1;
			}
	         for(int y=q+1;y<=w;y++)
	         {
	         	if(e[y]==0&&!flag&&y!=(200-num*n))
	         		continue;
	         	if(flag||e[y]!=0)
	         		printf("%d",e[y]);
	         	if(y==(200-num*n)&&y!=w)
	         		printf(".");
	         	flag=1;
	         }
		}
		printf("\n");			
}
int main()
{
	
	while(scanf("%s%d",b,&n)!=EOF)
	{
		if(n==0)
			{
				printf("%d\n",1);
				continue;
			}
		num=0;
		memset(a,0,sizeof(a));
		memset(d,0,sizeof(d));
		memset(e,0,sizeof(c));
		for(i=0;b[i]!='\0';i++)
		{
			if(b[i]=='.')
			{
				num=5-i;
				for(j=i;b[j]!='\0';j++)
					b[j]=b[j+1];
			}
			d[i]=b[i]-48;
		}
		if(num==0)
			x1=194,y1=5;
		else
			x1=195,y1=4;
		m=x1,j=y1;
		for(i=200;i>x1;i--)
			a[i]=d[j--];
		mul();
		print();
	}
	return 0;
} 

你可能感兴趣的:(poj 1001(高精度))