您的位置:首页 > 其它

HDOJ 1063 && POJ 1001

2011-07-05 13:55 337 查看
HDOJ1063和POJ1001是相同的题目,但是就此题而言,POJ的数据要弱于HDOJ。

此题是高精度幂运算,在POJ上能AC的代码却在HDOJ上AC不了,后来仔细阅读题目才发现,程序中没有处理前导0的部分,就是说001.01得处理为1.01。

经过实际测试,加上处理前导0的功能,既可以在HDOJ上AC,也可以在POJ上AC;如果不加处理前导0的功能,只能在POJ上AC。这就是许多像我一样的同学的代码在HDOJ上通不过的原因。

下面是在HDOJ上可AC代码:

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

void add(char temp1[],char temp2[],int m);    //两大数相加
void mul(char des[],char src[]);              //两大数相乘
void reverse(char *src);			//字符串逆置
void process1(char des[],int m);              //处理带小数的情况
void process2(char des[],int m);              //处理纯小数的情况
int leading_zeros(char r[]);                  //将前导0去掉,返回前导0的个数

int main()
{
char des[1024],src[1024],r[8];
int n,i,j,flag,m,t,count;
while(scanf("%s %d",r,&n)!=-1)
{
count=leading_zeros(r);
t=6-count;
flag=0;//整数
for(j=0,i=0;i<t;i++)
{
if(r[i]=='.')
{
flag=1;//带小数
m=t-1-i;
continue;
}
src[j]=r[i];
j++;
}
m=m*n;
src[j]='\0';
if(src[0]=='0')
{
flag=2;//纯小数
for(i=0;i<t-2;i++)
src[i]=src[i+1];
src[i]='\0';
}
reverse(src);
strcpy(des,src);
for(i=1;i<n;i++)
{
mul(des,src);
}
if(flag==0)
{
reverse(des);
printf("%s\n",des);
}
else if(flag==1)
{
process1(des,m);
}
else
{
process2(des,m);
}
}
return 0;
}

int leading_zeros(char r[])
{
int t,count,i;
for(i=0;i<6;i++)
{
if(r[i]=='0'&&r[i+1]!='.')
continue;
break;
}
count=i;
t=6-count;
for(i=0;i<t;i++)
r[i]=r[i+count];
r[i]='\0';
return count;
}

void process1(char des[],int m)
{
int i,n,count=0,t;
n=strlen(des);
for(i=0;i<m;i++)
{
if(des[i]=='0')
{
count++;
}
else
break;
}
t=n-m;
reverse(des);
des[n-count]='\0';
n=strlen(des);
for(i=0;i<t;i++)
{
printf("%c",des[i]);
}
if(t!=n)
printf(".");
for(i=t;i<n;i++)
printf("%c",des[i]);
printf("\n");
}

void process2(char des[],int m)
{
int i,n,count=0,t;
n=strlen(des);
for(i=0;i<n;i++)
{
if(des[i]=='0')
{
count++;
}
else
break;
}
t=m-n;
reverse(des);
des[n-count]='\0';
n=strlen(des);
if(n!=0)
{
printf(".");
for(i=0;i<t;i++)
printf("0");
for(i=0;i<n;i++)
printf("%c",des[i]);
}
else
printf("0");
printf("\n");

}

void mul(char des[],char src[])
{
char temp1[1024],temp2[1024];
int n,m,i,j,a,b,t;
n=strlen(src);
m=strlen(des);
for(i=0;i<1024;i++)
temp1[i]=temp2[i]='\0';
for(i=0;i<n;i++)
{
a=b=0;
for(j=0;j<m;j++)
{
t=(des[j]-'0')*(src[i]-'0')+a;
a=t/10;
b=t%10;
temp2[j]=b+'0';
}
if(a!=0)
{
temp2[j]=a+'0';
temp2[j+1]='\0';
}
else
{
temp2[j]='\0';
}
add(temp1,temp2,i);
}
strcpy(des,temp1);
}

void add(char temp1[],char temp2[],int m)
{
char temp[1024];
int n1,n2,i,a,b,t;
n1=strlen(temp1);
n2=strlen(temp2);
if(m!=0)
{
for(i=n2+m-1;i>=m;i--)
temp2[i]=temp2[i-m];
for(i=m-1;i>=0;i--)
temp2[i]='0';
temp2[n2+m]='\0';
}
n2=strlen(temp2);
a=b=0;
if(n1<n2)
{
for(i=0;i<n1;i++)
{
t=temp1[i]-'0'+temp2[i]-'0'+a;
a=t/10;
b=t%10;
temp[i]=b+'0';
}
for(i=n1;i<n2;i++)
{
t=temp2[i]-'0'+a;
a=t/10;
b=t%10;
temp[i]=b+'0';
}
if(a!=0)
{
temp[i]=a+'0';
temp[i+1]='\0';
}
else
{
temp[i]='\0';
}
}
else
{
for(i=0;i<n2;i++)
{
t=temp1[i]-'0'+temp2[i]-'0'+a;
a=t/10;
b=t%10;
temp[i]=b+'0';
}
for(i=n2;i<n1;i++)
{
t=temp2[i]-'0'+a;
a=t/10;
b=t%10;
temp[i]=b+'0';
}
if(a!=0)
{
temp[i]=a+'0';
temp[i+1]='\0';
}
else
{
temp[i]='\0';
}
}
strcpy(temp1,temp);
}

void reverse(char *src)
{
int i,n,m;
char t;
n=strlen(src);
m=n/2;
for(i=0;i<m;i++)
{
t=src[i];
src[i]=src[n-i-1];
src[n-i-1]=t;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: