有谁做过北大的online judge

fight_flight 2010-03-12 12:55:10
下面是网址:
我编的可以在vs08上运行,且示例数据也正确,但提交上去老是说Compile error。
http://acm.pku.edu.cn/JudgeOnline/problem?id=1001

代码如下:个人感觉效率不是多好
请高手指导指导

#include<iostream>
#include<string>
using namespace std;

void set_zero(string& s){ //将string全部置零
for(int i=0;i<s.size();i++)
s[i]='0';
}
string fun(string s,char c){ //多位于一位相乘,结果为正确的反序
string sum;
sum.resize(s.size()+1);
set_zero(sum);
int dan_wei_ji,jin_wei_1=0,jin_wei_2=0,pos=0;
for(int i=s.size()-1;i!=-1;--i,++pos){
dan_wei_ji=(s[i]-48)*(c-48);
sum[pos]=(dan_wei_ji%10+jin_wei_1+jin_wei_2)%10+48;
jin_wei_2=(dan_wei_ji%10+jin_wei_1+jin_wei_2)/10;
jin_wei_1=dan_wei_ji/10;
}
sum[pos]=jin_wei_2+jin_wei_1+48;
return sum;
}
void add(string& sum,string& s,int pos){ //多位相加
int jin_wei=0,temp=0;
for(int j=0;j<s.size();j++,pos++){
temp=(sum[pos]-48)+jin_wei+(s[j]-48);
sum[pos]=temp%10+48;
jin_wei=temp/10;
}
while(true){
if(jin_wei==0)
return ;
else{
temp=(sum[pos]-48)+jin_wei;
sum[pos]=temp%10+48;
jin_wei=temp/10;
}
}

}

string fun(string s1,string s2){ //多位相乘
string sum;
string temp;
sum.resize(s1.size()+s2.size());
temp.resize(s1.size()+1);
set_zero(sum);
set_zero(temp);
for(int i=s2.size()-1,pos=0;i!=-1;--i,++pos){
temp=fun(s1,s2[i]);
add(sum,temp,pos);
}
return sum;
}

string _tream(string s){ //去除整数部分前面的零
int count=0,i;
for(i=0;s[i]=='0';i++)
count++;
if(count==s.size()){
string str="";
return str;
}
if(count==0)
return s;
string str;
str.resize(s.size()-count);
for(int j=0;j<str.size();j++,i++)
str[j]=s[i];
return str;
}
string tream_(string s){//去除小数部分后面的零
int count=0,i;
for(i=s.size()-1;s[i]=='0';--i)
count++;
if(count==0)
return s;
if(count==s.size()){
string s="";
return s;
}
string str;
str.resize(s.size()-count);
for(int j=str.size()-1;j>-1;j--,--i)
str[j]=s[i];
return str;
}

string reverse(string& s){//将string反序
char c;
for(int i=0;i<s.size()/2;i++){
c=s[i];
s[i]=s[s.size()-i-1];
s[s.size()-i-1]=c;
}
return s;
}
int main(void){
string s,s1,s2,s1_t;
int n;
while(cin>>s>>n){
int i,j,count=0;
for(i=0;s[i]!='.';i++)
count++;
s1.resize(s.size()-1);
for(i=0,j=0;i<s.size();i++)
if(s[i]!='.'){
s1[j]=s[i];
j++;
}
s1_t=s1;
for(i=1;i<n;i++)
s1_t=reverse(fun(s1_t,s1));//循环算出去除小数点的n次方
int len=(s.size()-count-1)*n;
s1.resize(s1_t.size()-len);//保留整数部分
s2.resize(len); //保留小数部分
for(i=0;i<s1_t.size();i++){
if(i < s1_t.size()-len)
s1[i]=s1_t[i];
else{
s2[i-s1_t.size()+len]=s1_t[i];
}
}
cout<<_tream(s1)<<"."<<tream_(s2)<<endl;//输出结果
}

return 0;
}
...全文
289 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
fight_flight 2010-03-12
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 baihacker 的回复:]
string reverse(string& s)
string fun(string s1,string s2)

fun的结果是一个右值,你把右值作为reverse的参数,当然不对了。
你把reverse的参数改为string s就OK。
[/Quote]
对了
baihacker 2010-03-12
  • 打赏
  • 举报
回复
string reverse(string& s)
string fun(string s1,string s2)

fun的结果是一个右值,你把右值作为reverse的参数,当然不对了。
你把reverse的参数改为string s就OK。
alexhilton 2010-03-12
  • 打赏
  • 举报
回复
在做Online的时候最好用GCC/G++编译器,楼主可以用Dev C++来做题,这样可以保证你不会出现编译错误
alexhilton 2010-03-12
  • 打赏
  • 举报
回复
第一要看你用的是什么编译器。
如果用G++,有问题的话
在提交的时候改用C++

64,648

社区成员

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

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