【列舉】ISBN碼
阿新 • • 發佈:2018-12-03
問題 D: 【列舉】ISBN碼
時間限制: 1 Sec 記憶體限制: 64 MB
題目描述
Farmer John的奶牛們喜歡看書,並且Farmer John發現在他的奶牛們稍微看了些有關於自然科學的書時,會產出更多的牛奶。他決定更新牛棚裡的圖書館,把原廉價的小說換成算術和數學的課本。不幸的是,有些新書掉到了泥漿裡面,現在它們的ISBN號碼很難分辨出來了。
ISBN(國際標準圖書編號)是由十個阿拉伯數字組成的編碼,用來唯一地標識一本書。前九個阿拉伯數字描述這本書的一些資訊,最後一個數字用來驗證ISBN碼是否正確。要驗證ISBN碼的正確性,你要把第一個數字乘以十,把第二個數字乘以九,把第三個數字乘以八……直到最後一個數字乘上一,再把這些積累加起來,如果所得的和可以被11整除的話,那麼這就是一個合法的ISBN碼。比如說0201103311是一個合法的ISBN,因為
10×0+9×2+8×0+7×t+6×1+5×0+4×3+3×3+2×1+1×1=55
前九個數字都在0到9之間。有時候,最後一個數字需要取到10,那麼我們就把最後一個數字寫成大寫X(這時就不叫數字了,呵呵),比如156881111X也是一個合法的ISBN碼。你的任務就是在給你丟失了一個數字的ISBN碼之後,確定那個丟失的數字。丟失數字的地方用“?”表示。
輸入
一個十個數字組成的ISBN碼,其中包含用“?”表示的一個丟失的數字。
輸出
就是那個丟失的數碼(0~9或大寫X)。如果標有“?”的位置上沒有數字可以使之成為一個合法的ISBN碼的話,就輸出-l。
樣例輸入
複製樣例資料
02011?3311
樣例輸出
0
/**/ #include <cstdio> #include <cstring> #include <cmath> #include <cctype> #include <iostream> #include <algorithm> #include <map> #include <set> #include <vector> #include <string> #include <stack> #include <queue> typedef long long LL; using namespace std; char s[15]; int main() { //freopen("in.txt", "r", stdin); //freopen("out.txt", "w", stdout); scanf("%s", s); int ans = 0, pos = 0; for (int i = 0; i < 10; i++){ if(s[i] == 'X'){//當存在X時 ans += 10; continue; } if(s[i] == '?') pos = i; else ans += (10 - i) * (s[i] - '0'); } if(ans == 0){ //和為0的時候特判 printf("-1\n"); return 0; } int flag = 0; for (int i = 0; i < 10; i++){ if((ans + i * (10 - pos)) % 11 == 0){ printf("%d\n", i); flag = 1; break; } } //cout << ans << endl; if(!flag){ if((ans + 10) % 11 == 0 && pos == 9){//最後一位可以為X printf("X\n"); }else{ printf("-1\n"); } return 0; } return 0; } /**/