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;
    }
    
    
    求各位看官推荐 ღ( ´・ᴗ・` )
  • 相关阅读:
    C#(16进制数据之间的转换)
    解决windows7您当前无权访问该文件夹的问题
    获取本周的周一和周日
    在GridView中使用Cache
    在C#中完成海量数据的批量插入和更新
    母版页中对控件ID的处理
    PostgreSQL函数和运算符(二)
    js检查首字符是否是英文字符
    Asp.net Ajax实现拖放实战
    js移除数组中指导位置元素
  • 原文地址:https://www.cnblogs.com/Judge/p/15474711.html
Copyright © 2011-2022 走看看