1. 程式人生 > >【列舉】ISBN碼

【列舉】ISBN碼

問題 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;
}
/**/