d635. 幸運777?luck

題目 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的整數表示測資結束?
所以? —— 圖源:GIPHY
到底是我國文爛還是題目敘述爛?(好歹我大學國文門檻過了)
有些人會用C++內建轉$8$進位的,但還是要知道概念

$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 才知道在寫什麼