openjudge #10001 “exponentiation” (百练)
这道高精度求幂也编了好久,主要是下标错误导致的error。
一定要在编程的时候把特定的数组【下标】想清楚,在程序中统一规定(如最大位数,小数点位置这样的int变量,如果统一用后一位的下标表示,就不能出现用前一位的下标表示的算法,否则很容易出错)
还有执行循环的时候一定要考察元素在一次循环结束后是否应该【清零】。
一开始我的output数组在一次乘法结束后忘记清零了,导致一些奇怪的现象。
还有,记得各种值、数组【初始化】。
检查的时候,注意 0 1;11.111 2;1.2345 5;这样的输入。有可能问题就出现在0这样的点。
这里编的程序并不好,通用性不良。
++++++++代码++++++++++++++++++++++++++++++++++
#include <iostream>
#include <string>
using namespace std;
const int maxLen=5,maxPower = 25;
int myPower(int input[maxLen],int power,int output[maxLen*maxPower],int &dotIndex,int &end,int &zeroes)
{
int last = end;
int temp[maxLen*maxPower];int iz;int begin = zeroes;
for(int k=0;k<=last;k++)
{
output[k] = input[k];
}
for(iz=0;iz<=dotIndex;iz++)
{
if(input[iz]!=0)
{
zeroes = iz;
break;
}
}
if(iz>dotIndex)
{
zeroes = dotIndex;
}
for(int i=0;i<power-1;i++)
{
for(int k=0;k<=last;k++)
{
temp[k] = output[k];
output[k] =0 ;
}
for(int j=0;j<=last;j++)
{
for(int k=0;k<=end;k++)
{
output[j+k]+=temp[j]*input[k];
}
}
for(int j=0;j<=end+last+1;j++)
{
output[j+1]+=(output[j]/10);
output[j]%=10;
}
if(output[end+last+1]==0)
{
last = end + last;
}
else
{
last = end + last+1;
}
}
zeroes = zeroes*power;
dotIndex = dotIndex*power;
end = last;
return 0;
}
int main()
{
char in[maxLen+1]="";
int power;int count=0;
int outputF[10][maxLen*maxPower+1]={0};
while(cin>>in>>power)
{
int input[maxLen]={0};
int output[maxLen*maxPower]={0};
int dotIndex=-1,end=maxLen-1,zeroes=0;
int j=0;
for(int i=0;i<maxLen+1&&in[i];i++)
{
if(in[i]>='0'&&in[i]<='9')
{
input[maxLen-1-j] = in[i]-'0';
j++;
}
else
if(in[i]=='.')
{
dotIndex = maxLen-j;
}
else
{
break;
}
}
if(dotIndex == -1)
dotIndex = maxLen -j;
if(power==0)
{
cout<<1<<endl;
continue;
}
myPower(input,power,output,dotIndex,end,zeroes);
int jF=0;
for(int i = end;i>=dotIndex&&(output[end]||zeroes==dotIndex);i--)
{
cout<<output[i];
//outputF[count][jF++]=output[i];
}
for(int i=dotIndex-1;i>=zeroes;i--)
{
if(i==dotIndex-1)
{
cout<<".";
//outputF[count][jF++]=-1;continue;
}
cout<<output[i];
//outputF[count][jF++]=-1;
}
cout<<endl;
//outputF[count][jF]=-2;
count++;
}
/* for(int i=0;i<count;i++)
{
for(int j=0;outputF[count][j]!=-2;j++)
{
cout<<(outputF[count][j]==-1)?'.':outputF[count][j];
}
cout<<endl;
}*/
return 0;
}
这道高精度求幂也编了好久,主要是下标错误导致的error。
一定要在编程的时候把特定的数组【下标】想清楚,在程序中统一规定(如最大位数,小数点位置这样的int变量,如果统一用后一位的下标表示,就不能出现用前一位的下标表示的算法,否则很容易出错)
还有执行循环的时候一定要考察元素在一次循环结束后是否应该【清零】。
一开始我的output数组在一次乘法结束后忘记清零了,导致一些奇怪的现象。
还有,记得各种值、数组【初始化】。
检查的时候,注意 0 1;11.111 2;1.2345 5;这样的输入。有可能问题就出现在0这样的点。
这里编的程序并不好,通用性不良。
++++++++代码++++++++++++++++++++++++++++++++++
#include <iostream>
#include <string>
using namespace std;
const int maxLen=5,maxPower = 25;
int myPower(int input[maxLen],int power,int output[maxLen*maxPower],int &dotIndex,int &end,int &zeroes)
{
int last = end;
int temp[maxLen*maxPower];int iz;int begin = zeroes;
for(int k=0;k<=last;k++)
{
output[k] = input[k];
}
for(iz=0;iz<=dotIndex;iz++)
{
if(input[iz]!=0)
{
zeroes = iz;
break;
}
}
if(iz>dotIndex)
{
zeroes = dotIndex;
}
for(int i=0;i<power-1;i++)
{
for(int k=0;k<=last;k++)
{
temp[k] = output[k];
output[k] =0 ;
}
for(int j=0;j<=last;j++)
{
for(int k=0;k<=end;k++)
{
output[j+k]+=temp[j]*input[k];
}
}
for(int j=0;j<=end+last+1;j++)
{
output[j+1]+=(output[j]/10);
output[j]%=10;
}
if(output[end+last+1]==0)
{
last = end + last;
}
else
{
last = end + last+1;
}
}
zeroes = zeroes*power;
dotIndex = dotIndex*power;
end = last;
return 0;
}
int main()
{
char in[maxLen+1]="";
int power;int count=0;
int outputF[10][maxLen*maxPower+1]={0};
while(cin>>in>>power)
{
int input[maxLen]={0};
int output[maxLen*maxPower]={0};
int dotIndex=-1,end=maxLen-1,zeroes=0;
int j=0;
for(int i=0;i<maxLen+1&&in[i];i++)
{
if(in[i]>='0'&&in[i]<='9')
{
input[maxLen-1-j] = in[i]-'0';
j++;
}
else
if(in[i]=='.')
{
dotIndex = maxLen-j;
}
else
{
break;
}
}
if(dotIndex == -1)
dotIndex = maxLen -j;
if(power==0)
{
cout<<1<<endl;
continue;
}
myPower(input,power,output,dotIndex,end,zeroes);
int jF=0;
for(int i = end;i>=dotIndex&&(output[end]||zeroes==dotIndex);i--)
{
cout<<output[i];
//outputF[count][jF++]=output[i];
}
for(int i=dotIndex-1;i>=zeroes;i--)
{
if(i==dotIndex-1)
{
cout<<".";
//outputF[count][jF++]=-1;continue;
}
cout<<output[i];
//outputF[count][jF++]=-1;
}
cout<<endl;
//outputF[count][jF]=-2;
count++;
}
/* for(int i=0;i<count;i++)
{
for(int j=0;outputF[count][j]!=-2;j++)
{
cout<<(outputF[count][j]==-1)?'.':outputF[count][j];
}
cout<<endl;
}*/
return 0;
}
气










