Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
Re:C++代码,网上找到的测试例子都试过,但提交后仍然WA,哪位高人可以抽空帮忙指点一下,多谢In Reply To:C++代码,网上找到的测试例子都试过,但提交后仍然WA,哪位高人可以抽空帮忙指点一下,多谢 Posted by:ah_syh at 2013-11-18 14:08:36 > #include <stdio.h> > #include <vector> > #include <string> > #include <string.h> > #include <iostream> > > > using namespace std; > > const int MAX_BIT_NUMBER=256; > > //Super interger class > class SI { > public: > int point_pos; > int length; > unsigned char digitals[MAX_BIT_NUMBER]; > > SI& operator=(int i); > SI& operator=(SI& tmp); > SI& operator+(SI& tmp); > SI& operator*(int i); > SI& operator*(SI& tmp); > > void print(); > void adjust(); > > public: > SI(); > SI(int i); > SI(char* str); > SI(SI& tmp); > virtual ~SI(); > }; > > SI::SI():point_pos(0),length(1) { > // TODO Auto-generated constructor stub > memset(digitals,0,MAX_BIT_NUMBER*sizeof(unsigned char)); > } > > SI::SI(int i):point_pos(0),length(0) { > memset(digitals,0,MAX_BIT_NUMBER*sizeof(unsigned char)); > while(i!=0) > { > digitals[length] = i%10; > i /= 10; > length++; > } > } > > void SI::adjust() > { > //eliminate the latest 0 after point > int i=0; > for(i=0;i<point_pos;i++) > { > if(digitals[i]!=0)break; > } > if(i!=0) > { > for(int j=0;j<length;j++) > { > if(j<length-i) > digitals[j]=digitals[j+i]; > else > digitals[j]=0; > } > length -= (i); > point_pos -= i; > } > > for(i=0;i<length;i++) > { > if(digitals[length-i-1]!=0)break; > } > > if(i!=0) > { > length -= i; > } > if(length==0) > length = 1; > } > > SI::SI(char* str):point_pos(0),length(0) { > memset(digitals,0,MAX_BIT_NUMBER*sizeof(unsigned char)); > > int new_length = strlen(str); > length=0; > for(int i=0;i<new_length;i++){ > if(str[new_length-i-1]=='.') > point_pos = length; > else > { > digitals[length]=str[new_length-i-1]-'0'; > length++; > } > } > adjust(); > } > > SI::SI(SI& tmp):point_pos(tmp.point_pos),length(tmp.length){ > // TODO Auto-generated constructor stub > memcpy(digitals,tmp.digitals,MAX_BIT_NUMBER*sizeof(unsigned char)); > } > > SI::~SI() { > // TODO Auto-generated destructor stub > } > > SI& SI::operator=(int i) { > // TODO Auto-generated destructor stub > point_pos = 0; > length = 0; > memset(digitals,0,MAX_BIT_NUMBER*sizeof(unsigned char)); > while(i!=0) > { > digitals[length] = i%10; > i /= 10; > length++; > } > return *this; > } > > SI& SI::operator=(SI& tmp) { > // TODO Auto-generated destructor stub > point_pos = tmp.point_pos; > length = tmp.length; > memcpy(digitals,tmp.digitals,MAX_BIT_NUMBER*sizeof(unsigned char)); > return *this; > } > > SI& SI::operator+(SI& tmp) { > // TODO Auto-generated destructor stub > SI result(*this); > //point_pos = tmp.point_pos; > > int new_length = (length > tmp.length)?length:tmp.length; > int jinwei=0; > result.length = new_length; > for(int i=0;i<(new_length);i++){ > result.digitals[i]=digitals[i]+tmp.digitals[i]+jinwei; > jinwei = result.digitals[i] / 10; > result.digitals[i] = result.digitals[i] % 10; > } > > if(jinwei!=0) > { > result.digitals[new_length]=jinwei; > result.length = new_length+1; > } > > return result; > } > > SI& SI::operator*(int i) { > SI result; > > if(i==0) return result; > if(length==1&&digitals[0]==0) return result; > if(i==10) { > result.digitals[0]=0; > for(int j=0;j<length;j++){ > result.digitals[j+1]=digitals[j]; > } > result.length = length+1; > return result; > } > > int jinwei=0; > result.length = length; > for(int j=0;j<length;j++){ > result.digitals[j]=digitals[j]*i+jinwei; > jinwei = result.digitals[j] / 10; > result.digitals[j] = result.digitals[j] % 10; > } > > if(jinwei!=0){ > result.digitals[result.length]=jinwei; > result.length = length+1; > } > > return result; > } > > SI& SI::operator*(SI& tmp) { > // TODO Auto-generated destructor stub > SI result; > SI temp_val1(*this); > SI temp_val2; > > for(int i=0;i<tmp.length;i++){ > int j=tmp.digitals[i]; > temp_val2 = temp_val1*j; > result = result+temp_val2; > temp_val1=temp_val1*10; > } > result.point_pos = point_pos + tmp.point_pos; > //point_pos = tmp.point_pos; > > result.adjust(); > > return result; > } > > void SI::print(){ > if(length<=point_pos) > { > printf("."); > > for(int i=0;i<point_pos-length;i++){ > printf("0"); > } > for(int i=0;i<length;i++){ > printf("%d",digitals[length-i-1]); > } > printf("\n"); > > return; > } > int i; > > for(i=0;i<length-point_pos;i++){ > printf("%d",digitals[length-i-1]); > } > if(point_pos!=0) > { > printf("."); > for(;i<length;i++){ > printf("%d",digitals[length-i-1]); > } > } > printf("\n"); > return; > } > > void cal_exponent(char* s1,int d){ > if(d==0) > { > printf("1\n"); > return; > } > > SI result(1); > SI tmp_val(s1); > > while(d!=0) > { > if(d&0x1) > result = result*tmp_val; > tmp_val = tmp_val*tmp_val; > d=d>>1; > } > result.print(); > } > > int main(void) > { > char s1[128]; > int d; > > > while(scanf("%s%d",s1,&d)!=EOF) > { > s1[6] = '\0'; > cal_exponent(s1,d); > } > > return 0; > } 第一,首先的邏輯都錯了, 0.0100 的 3次方,你居然算出 .000001060900 第二,你的main函數裏面的那個while循環寫得有問題,我之前也是這樣,看到你的源碼發現 cal_exponent裏面有print語句,也就是說輸入兩個數據就馬上計算然後打印,這是不對的。要把一組數據全部計算完後再一起打印,這樣才正確。可以參考一下我用C通過的代碼,鏈接如下:http://poj.org/showmessage?message_id=341901 Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator