天天看點

POJ 1131 Octal Fractions G++

#include <iostream> 
#include <string>
#include <algorithm>
using namespace std;
string add(string x,string y)
{
	string c;
	c.reserve(100);
	string a;
	a.reserve(100);	
	string b;
	b.reserve(100);	
	a=a+x;
	b=b+y;
	if(x.size()>y.size())
	{
		for(int i=y.size();i<x.size();i++)
		{
			b=b+'0';
		}
	}else if(x.size()<y.size())
	{
		for(int i=x.size();i<y.size();i++)
		{
			a=a+'0';
		}		
	}
	//cout<<"a "<<a<<" b "<<b<<endl;
	int jw=0;
	for(int i=a.size()-1;i>=0;i--)
	{
		if(a[i]!='.')
		{
			if(i>=0)
			{
				c=c+(char)((a[i]-'0'+b[i]-'0'+jw)%10+'0');
				jw=(a[i]-'0'+b[i]-'0'+jw)/10;
			}
		}else
		{
			c=c+'.';
		}
	}
	reverse(c.begin(),c.end());
	return c;
}
string mul(string a,int b)//a小數 b個位數 
{
	string t;
	t.reserve(100);
	int jw=0;
	for(int i=a.size()-1;i>=0;i--)
	{
		if(a[i]!='.')
		{
			t=t+(char)(((a[i]-'0')*b+jw)%10+'0');
			jw=((a[i]-'0')*b+jw)/10;	
		}else
		{
			t=t+'.';
		}
	}
	reverse(t.begin(),t.end());
	return t;
}
string dev(string a)//除8
{
	string t;
	t.reserve(100);
	int ys=0;
	for(int i=0;(i<a.size())||(ys!=0);i++)
	{
		if(i>=a.size())
		{
			t=t+(char)((ys*10)/8+'0');
			ys=(ys*10)%8;			
		}else if(a[i]!='.')
		{
			t=t+(char)((a[i]-'0'+ys*10)/8+'0');
			ys=(a[i]-'0'+ys*10)%8;	
		}else if(a[i]=='.')
		{
			t=t+'.';
		}
		if((ys==0)&&(i>=a.size()))
		{
			return t;
		}
	}
} 
int main()
{
	//cout<<add("0.0","0.875")<<endl;
	while(1)
	{
		string a;
		cin>>a;
		if(cin.eof()==1)
		{
			break;
		}
		string ba="1.0";
		string sum;
		sum.reserve(100);
		sum="0.0";
		for(int i=2;i<a.size();i++)
		{
			ba=dev(ba);
			//cout<<"ba "<<ba<<endl;
			string t;
			t=mul(ba,a[i]-'0');
			//cout<<"mul "<<t<<endl;
			string jg;
			jg=add(sum,t);
			sum.reserve(100);
			sum=jg;
			//cout<<"sum "<<sum<<endl;
		}
		cout<<a<<" [8] = "<<sum<<" [10]"<<endl;	
	}
	return 0;
}
           
POJ 1131 Octal Fractions G++
POJ 1131 Octal Fractions G++

給出n位8進制小數,求對應10進制小數不超過3n位。 謝謝博友文章。

#include <iostream>
#include <string>
#include <cstring>
using namespace std;
//抄博友好程式 
int ans[1000008];
int main()
{
	while(1)
	{
		string s;
		cin>>s;
		if(cin.eof()==1)
		{
			break;
		}
		memset(ans,0,sizeof(ans));
		int t=0;
		for(int i=s.size()-1;i>1;i--)
		{
			int j=0;
			int d2=s[i]-'0';
			while(j<t||d2!=0)//抄博友 沒掌握 
			{
				d2=d2*10+ans[j];
				ans[j]=d2/8;
				d2=d2%8;
				j++;
			}			
			t=j;
			/* 
			for(int i=0;i<t;i++)
			{
				cout<<ans[i];
			} 
			cout<<endl;	*/					
		}
		cout<<s<<" [8] = 0.";
		for(int i=0;i<t;i++)
		{
			cout<<ans[i];
		} 
		cout<<" [10]"<<endl;
	}
	return 0;
}
           

繼續閱讀