任務描述
在一種室內互動游戲中,魔術師要每位觀眾心里想一個三位數abc(a、b、c分別是百位、十位和個位數字),然后魔術師讓觀眾心中記下acb、bac、bca、cab、cba五個數以及這5個數的和值。只要觀眾說出這個和是多少,則魔術師一定能猜出觀眾心里想的原數abc是多少。例如,觀眾甲說他計算的和值是1999,則魔術師立即說出他想的數是443,而觀眾乙說他計算的和值是1998,則魔術師說:“你算錯了!”。請編程模擬這個數字魔術游戲。
編程要求
根據提示,在右側編輯器補充代碼,要求用函數實現,函數原型為:int magic(int m);其中形參m代表觀眾計算的和值,返回值是觀眾心里想的原數abc。如果觀眾計算錯誤,請返回-1。main函數已隱藏,接受的輸入包含t+1個正整數,第一個是測試次數t,隨后t個則是觀眾計算的和值,程序計算輸出t個結果。
普通解法是窮舉,直接枚舉 a b c ,如果滿足條件就輸出,易證解至多一個,代碼很好打就不給了
思考了一下,要求觀眾記下五個數之和,但可以發現 abc 的排列是 A(3,3)=6 的,然后看了一下五個數中恰好少了 abc ,也就是說我們可以枚舉六個數之和減去觀眾給的 m ,然后判斷 得出的 tmp_abc 的合法性,合法則輸出
考慮優化可行性,發現六個數之和為 222*(a+b+c) ,其中 a+b+c∈(1,27) ,(a≠0,且 a,b,c<=9)
注意 t 需要拆分之后加起來,然后和枚舉的 a+b+c 的值比對一下,不能只判斷 t 是否是三位數(腦抽被坑的人落淚)
int magic(int m){
for(int i=1;i<=27;++i){
int t=222*i-m;
int a=t/100,b=t/10%10,c=t%10;
if(t>100&&t<1000&&a+b+c==i)
return t;
}
return -1;
}