任务描述
在一种室内互动游戏中,魔术师要每位观众心里想一个三位数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;
}