題目 Problem#
題目連結:https://zerojudge.tw/ShowProblem?problemid=d635
敘述 Description#
你說什麼?777=511?怎麼可能…?
因為這裡是八進位的777轉換成10進位的511了~(好爛ˇ)
給你十進位的數字,請你把他們轉成八進位好嗎?
輸入 Input#
每個測資點有多筆測資,請以EOF作為結束。 每組測資一行,有整數n(0<=n<=511),表示要轉換成八進位的數字 最後出現小於0的整數表示測資結束。
<所有出現的整數皆可以signed 32-bits int儲存>
輸出 Output#
對於每一行測資請輸出整數n的八進位表示。 對於最後一個小於0的整數,請輸出-1。
範例輸入 Sample Input#
277
511
123
456
-1
範例輸出 Sample Output#
425
777
173
710
-1
提示 Hint#
1.進位制轉換 2.共三個測資點30%、35%、35%, 第一個測資點即範例測資。
題解 Solution#
以EOF作為結束?最後出現小於0的整數表示測資結束?
$10$進位的
$$511_{(10)}$$會是
$$ 511_{(10)} = 5 * 10^2 + 1 * 10^1 + 1 * 10^0 $$$8$進位的
$$777_{(8)}$$會是
$$ 777_{(8)} = 7 * 8^2 + 7 * 8^1 + 7 * 8^0 = 511_{(10)} $$$8$進位的
$$173_{(8)}$$會是
$$ 173_{(8)} = 1 * 8^2 + 7 * 8^1 + 3 * 8^0 = 123_{(10)} $$大致上不論是轉成$N$進位都差不多
$10$進位轉成$8$進位
先把數字 $MOD\ 8$ 就可以求出$8$進位中的個位數 $123%8=3$ 再把數字 $/\ 8$ 後再 $MOD\ 8$ 就可以求出$8$進位中的下個位數 $123/8=15$ $15%8=7$ 再把數字 $/\ 8$ 後再 $MOD\ 8$ 就可以求出$8$進位中的下個位數 $15/8=1$ $1%8=1$
然後把數字倒敘輸出就可以拿到$1,7,3$
如果可以EOF結尾,我就把負數自動設定為$-1$
輸入$0$出來會是空白,所以還加了特判
程式碼 Accepted Code#
#include <bits/stdc++.h>
#define _ ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
using namespace std;
int main(){
_
long long int enter;
while(cin>>enter){
if(enter<0){
cout<<"-1"<<'\n';
continue;
}
if(enter==0){
cout<<"0"<<'\n';
continue;
}
int ans[10]={0},len=0;
while(enter){
ans[len++]+=enter%8;
enter/=8;
}
for(int i=len-1;i>=0;i--)
cout<<ans[i];
cout<<'\n';
}
return 0;
}
後記 Afterword#
這題題目敘述真的是爛到吃了好幾個 WA 寫 UVa 題目也有碰過一次,題目沒有寫清楚 最後還是看了一下 AC Code 才知道在寫什麼