| ||||||||||
| 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:该程序本质上的计算过程是这样的In Reply To:该程序本质上的计算过程是这样的 Posted by:aoxboxcox at 2009-06-22 12:55:11 > 还以0.123为例
> 初始时: 0[8]=0[10]
> 两边加上3[8]: 3[8]=3[10]
> 两边除以8[10]:0.3[8]=0.375[10]
> 两边加上2[8]: 2.3[8]=2.375[10]
> 两边除以8[10]:0.23[8]=0.296875[10]
> 两边加上1[8]: 1.23[8]=1.296875[10]
> 两边除以8[10]:0.123[8]=0.162109375[10]
>
> myDivide里做的事情就是对a[]除以8。
> 主函数里对a[0]的赋值相当于在个位数上做加法。
> 算法巧妙地利用了个位数上8进制数等于10进制数,匠心独具,赞一个。
感谢啊!!
我的代码:
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
char a[300];
int b[300];
while(cin>>a)
{
int i;
if(a[2]=='\0')
{
cout<<"0. [8] = 0. [10]"<<endl;
continue;
}
int lena=strlen(a);
int lenb=1;
memset(b,0,sizeof(b));
for(i=lena-1;i>=2;i--)
{
b[0]=a[i]-'0';
int j;
for(j=lenb-1;j>=0;j--)
{
int temp=b[j]*1000/8;
b[j]=temp/1000;
temp=temp-b[j]*1000;
b[j+1]+=temp/100;
b[j+2]+=temp%100/10;
b[j+3]+=temp%10;
}
lenb+=3;
}
int add=0;
for(i=lenb-1;i>=0;i--)
{
b[i]+=add;
add=b[i]/10;
b[i]%=10;
}
b[lenb]='\0';
for(i=lenb-1;b[i]==0;i--)
lenb--;
cout<<a<<" [8] = 0.";
for(i=1;i<lenb;i++)
cout<<b[i];
cout<<" [10]"<<endl;
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator