problem 1086

八進制浮點數轉十進制浮點數。

直接轉有點麻煩,因爲會同時涉及到乘法和除法。我的做法是先轉成二進制再轉十進制。八進制轉二進制非常簡單,二進制轉十進制則無需做乘法(乘1或者乘0)。

Accepted 1086 C++ 00:00.00 388K

#include<stdio.h>
#include
<string.h>
const char list[8][4= {"000","001","010","011","100","101","110","111"};
void add(char a[],char
 b[])
{
    
int lena =
 strlen(a);
    
int lenb =
 strlen(b);
    
int c = 0
;
    
int len = lena >= lenb ?
 lena : lenb;
    
for(int i = lena; i < len; a[i] = b[i],i++
);
    len 
= lena >= lenb ?
 lenb : lena;
    
while(--len > 1
)
    {
        
int temp = a[len] + b[len] - '0' * 2 +
 c;
        a[len] 
= temp % 10 + '0'
;
        c 
= temp / 10
;
    }
}
void div2(char
 num[])
{
    
if(num[0== '1'
)    
    {
        num[
0= '0',num[1= '.',num[2= '5'
;
        
return
;
    }
    
int i = 1,r = 0
;
    
while(num[++i] == '0'
);
    
for(; num[i]; i++
)
    {
        
int temp = 10 * r + num[i] - '0'
;
        num[i] 
= temp / 2 + '0'
;
        r 
= temp % 2
;
        
    }
    num[i] 
= '5'
;
}
void solve(char
 num[])
{
    
char bnum[60= ""
;
    
int
 i;
    
for(i = 2; num[i]; i++
)
        bnum[(i 
- 2* 3= list[num[i] - '0'][0
],  
        bnum[(i 
- 2* 3 + 1= list[num[i] - '0'][1
],
        bnum[(i 
- 2* 3 + 2= list[num[i] - '0'][2
];
    
char flag[50= "1"
;
    
char res[50= "0.0"
;
    i 
= 0
;
    
while
(bnum[i])
    {
        div2(flag);
        
if(bnum[i++== '1'
)    add(res,flag);
    }
    printf(
"%s [8] = %s [10]/n"
,num,res);
}
int
 main()
{
#ifndef ONLINE_JUDGE
    freopen(
"1086.txt","r"
,stdin);
#endif

    
char num[20];
    
while(scanf("%s",num) !=
 EOF)
        solve(num);
#ifndef ONLINE_JUDGE
    fclose(stdin);
#endif

    
return 0;
}
發佈了78 篇原創文章 · 獲贊 3 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章