抽点时间,帮帮忙。。。

lanhxg 2010-10-14 11:35:37
//小弟在北大的ACM刷题,1001 接过那里的测试数据都过了,提交之后就是wrong answer ,我和我同学的正确程序对比过,
//数据都对。先在实在没法子了,请各位帮忙找下数据。。。也肯能本代码就是错误的

#include<iostream>
#include<string>
#include <string.h>

using namespace std ;
typedef int HP[250];

class CHP
{
HP m_Data ;
int m_PiontPos ;
public:
CHP();
CHP& operator *( const CHP & factor)const;
CHP & Pow(const int m )const;
//friend fution
friend std::istream & operator >>(std::istream & in ,CHP & hp);
friend std::ostream & operator <<(std::ostream & os ,const CHP & hp);
};
int main(void)
{
CHP a,b,c ;
int m;
while(cin>>a>>m)
{
c=a.Pow(m);
cout<<c<<endl ;
}
}
//----------------------------------
//about CHP member funtiong implement
CHP::CHP()
{
memset(m_Data,0,sizeof(m_Data));
m_PiontPos=0 ;
}
std::istream & operator >>(std::istream & in ,CHP & hp)
{
string tmp ;
bool bPoint = false;
in>>tmp ;
int i , j ;
for(j = tmp.size()-1, i = 1 ;j>=0 ;j--)
{
if(tmp[j]!='.')
hp.m_Data[i++] = tmp[j]-'0';
else
hp.m_PiontPos = tmp.size()-1-j , bPoint = true ;
}
if(bPoint == false )
hp.m_PiontPos = 0 ,hp.m_Data[0] = tmp.size() ;
else
hp.m_Data[0]=tmp.size()-1;
return in ;
}
std::ostream & operator <<(std::ostream & os ,const CHP & hp)
{
for(int i = hp.m_Data[0] ; i > 0 ;i-- )
{
if(i==hp.m_PiontPos)
os<<"." ;
os<<hp.m_Data[i];
}
return os ;
}

CHP& CHP::operator *( const CHP & factor)const
{
CHP Mul;
int len = this->m_Data[0]>=factor.m_Data[0]?this->m_Data[0]:factor.m_Data[0];
for(int i = 1 ; i <= this->m_Data[0] ; i++)
for( int j =1 ; j<=factor.m_Data[0] ; j++)
Mul.m_Data[i+j-1]+=this->m_Data[i]*factor.m_Data[j];
Mul.m_PiontPos = this->m_PiontPos+factor.m_PiontPos ; //积的小数位数为两为小数之和
len = this->m_Data[0]+factor.m_Data[0];
for(int i = 1 ;i<=len ;i++)
{
if(Mul.m_Data[i]>9)
{
Mul.m_Data[i+1]+=Mul.m_Data[i]/10;
Mul.m_Data[i]%=10;
}
}
while(Mul.m_PiontPos!=0&&len>Mul.m_PiontPos && Mul.m_Data[len]<=0) len-- ;
Mul.m_Data[0]=len ;
return Mul ;
}
CHP & CHP::Pow(const int m )const
{
int k = m;
CHP tmp, res ;
memcpy(tmp.m_Data,this->m_Data,sizeof(this->m_Data));
tmp.m_PiontPos = this->m_PiontPos;
res.m_Data[0]=res.m_Data[1]=1 ,res.m_PiontPos =0 ;
while(k!=0)
{
if(k&1)
res =res*tmp;
tmp=tmp*tmp;
k=k>>1;
}
res.m_PiontPos = this->m_PiontPos*m ;
//---------------------------------------------------------
//去末尾0工作
int left =1 ;
while(res.m_Data[left]==0&&left<=res.m_PiontPos) left++; //末尾有left 个0
if(left!=1)
{
left-=1;
for(int i=left+1 ;i<=res.m_Data[0];i++)
{
res.m_Data[i-left]=res.m_Data[i];
}
res.m_Data[0]-=left ;
if(left==res.m_PiontPos) res.m_PiontPos=0;
else res.m_PiontPos-=left;
}
int right = res.m_Data[0];

while(res.m_Data[right]==0&&right>res.m_PiontPos) right-- ;
res.m_Data[0]=right;
return res ;
}
...全文
49 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
bluejays 2010-10-14
  • 打赏
  • 举报
回复
CHP& CHP::operator *( const CHP & factor)const
{
CHP Mul;
......
return Mul ;
}
返回局部变量的引用,很可疑。

CHP & CHP::Pow也有类似问题,return res 也是局部变量的引用
lanhxg 2010-10-14
  • 打赏
  • 举报
回复
题目网址是:http://poj.org/problem?id=1001&lang=zh-CN

64,684

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧