zoukankan      html  css  js  c++  java
  • 魔术师猜数【更优解】

    任务描述
    在一种室内互动游戏中,魔术师要每位观众心里想一个三位数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;
    }
    
    
    求各位看官推荐 ღ( ´・ᴗ・` )
  • 相关阅读:
    20170416
    汇总02
    总结
    在编程的世界中,如何高效地学习理论知识,应用理论知识来解决实际生产中的问题
    周末待整理
    web 性能提升
    es6
    http、https、 json、 ajax
    微信小程序 问题收集
    eslint
  • 原文地址:https://www.cnblogs.com/Judge/p/15474711.html
Copyright © 2011-2022 走看看