洛谷 1013 進位制
阿新 • • 發佈:2018-12-18
題目描述
著名科學家盧斯為了檢查學生對進位制的理解,他給出瞭如下的一張加法表,表中的字母代表數字。 例如:
+ L K V E
L L K V E
K K V E KL
V V E KL KK
E E KL KK KV
其含義為:
L+L=LL+L=L,L+K=KL+K=K,L+V=VL+V=V,L+E=EL+E=E
K+L=KK+L=K,K+K=VK+K=V,K+V=EK+V=E,K+E=KLK+E=KL
…… E+E=KVE+E=KV
根據這些規則可推匯出:L=0L=0,K=1K=1,V=2V=2,E=3E=3
同時可以確定該表表示的是4進位制加法
//感謝lxylxy123456同學為本題新加一組資料
輸入輸出格式
輸入格式:
nn (n≤9)(n≤9)表示行數。
以下nn行,每行包括nn個字串,每個字串間用空格隔開。(字串僅有一個為‘+’號,其它都由大寫字母組成)
輸出格式:
① 各個字母表示什麼數,格式如:L=0L=0,K=1K=1,……按給出的字母順序。
② 加法運算是幾進位制的。
③ 若不可能組成加法表,則應輸出“ERROR!”
輸入輸出樣例
輸入樣例#1:
5 + L K V E L L K V E K K V E KL V V E KL KK E E KL KK KV
輸出樣例#1:
L=0 K=1 V=2 E=3 4
題解:
字母的數量等於進位制的大小
判錯的時候,可以看一下那個表格右下角的一個等腰三角形,就會發現有一個由兩位數字(字母)組成的三角形。
我們驗算一下,對於L ,在該三角形的雙位字母中的個位中出現了三次,則4-1-3=0 ,L代表的就是零了,然後依次驗算n-1-次數,發現都等於實際上的進位制數字。
然後我們依舊可以發現,在L這一行裡面,沒有雙位字母出現,所以我們可以給L判0,依次查下去,就會發現,下一行,K有一個雙位字母,然後K是1,等等。
由上兩條作為判錯依據,用map對映來統計這些次數,會方便很多。
#include <iostream> #include <map> using namespace std; map<char, int> a; map<char, int> total; char le[10];//letter string x, y; int main() { int n, i, j; cin >> n; cin >> x; for (i = 1; i <= n - 1;i++) { cin >> x; le[i] = x[0]; }//first line for (i = 1; i <= n - 1;i++) {//這是從第二行到第n-1行的意思 for (j = 1; j <= n;j++) { cin >> x; if (x==y&&j!=1&&j!=2) { //第一列是鍵,第二列單列無法比較 cout << "ERROR!"; return 0; } y = x; if (x.size()==2) { a[x[1]]++;//計算該字母在兩位數個位上的個數,具體見表的右下角等腰三角形內 total[le[i]]++;//第一行相當於第一列,計算該字母兩位數的個數 } } } for (i = 1; i <= n-1;i++) {//對應著上面的1到n-1,這是n-1個字元的意思 if (total[le[i]]!=n-2-a[le[i]]) {//字母總個數為n-1 cout << "ERROR!"; return 0; } } for (i = 1; i <= n-1;i++) { cout << le[i] << '=' << total[le[i]]<<' '; } cout << endl << n - 1; getchar(); getchar(); return 0; }