hihocoder-1623-有歧義的號碼
?
#1623 : 有歧義的號碼
描述
小Hi參加了一場大型馬拉松運動會,他突然發現面前有一位參賽者背后的號碼竟然和自己一樣,也是666。仔細一看,原來那位參賽者把自己號碼帖反(旋轉180度)了,結果號碼999看上去變成了號碼666。 ?
小Hi知道這次馬拉松一共有N名參賽者,號碼依次是1~N。你能找出所有可能因為貼反而產生歧義的號碼嗎? ?
一個號碼K可能產生歧義當且僅當反轉之后的號碼是合法的數字K',并且滿足1 ≤ K' ≤ N且K' ≠ K。 ?
例如:
3沒有歧義,因為貼反之后不是合法的數字。 ?
100沒有歧義,因為001以0開頭,不是合法號碼。 ?
101也沒有歧義,因為貼反之后還是101本身。 ?
假設N=10000000,則1025689有歧義,因為貼反之后變成6895201。如果N=2000000,則1025689沒有歧義,因為6895201大于N。
輸入
一個整數N。(1 ≤ N ≤ 100000)
輸出
從小到大輸出1~N之間所有有歧義的號碼。每個號碼一行。
- 樣例輸入
-
10
樣例輸出 -
6 9
?
直接使用暴力得到。
?
#include <cstdio>
/// 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
const int legal[10] = {1, 1, 1, 0, 0, 1, 1, 0, 1, 1};
const int Revse[10] = {0, 1, 2, 0, 0, 5, 9, 0, 8, 6}; bool Judge(const int num, int c){int ret = 0, cur = c; if(cur % 10 == 0){return false; }while(cur){if( legal[cur % 10] ){ret = 10*ret + Revse[cur % 10]; }else{return false; }cur = cur / 10; }if(ret <= num && c != ret ){return true; }return false;
}int main(){int n; while(scanf("%d", &n) != EOF){for(int i=1; i<=n; ++i){if( Judge(n, i) ){printf("%d\n", i );}}}return 0;
}
?