CSDN竞赛第五期竞赛-习题解析

CSDN竞赛第五期竞赛题目:

1、题目名称:寻因找祖

寻找因子个数为n的最小整数x。

思路:从1开始循环,统计每个数字的因数之和

function getFactor(n) {
   var x = 1;
   var status = true;
   //选择do while,不满足条件,一直循环下去,知道寻找到最终结果,跳出循环
   do {
       var j = 0;
       for (var i = 1; i <= x; i++) {
       	   //统计因数之和
           if (x % i == 0) {
               j++;
           }
       }
       if (j == n) {
       	   //跳出循环
           status = false;
       } else {
           //继续循环
           x++;
       }
   } while (status);
   return x;
}
var number = 10;
console.log('因子个数为'+number+'的最小整数x:' + getFactor(number));

2、题目名称:通货膨胀-x国货币

X国发行货币最高面额为n。 次高面额为n的因子。 以此类推。 X国最多发行多少种货币。

思路:找到n的全部因数,统计求和

function getMoney(n) {
   var m = 0;
    for (var i = 1; i < n; i++) {
        if (n % i == 0) {
            m++;
        }
    }
    return m;
}

var money = 1000;
console.log('X国发行货币最高面额为' + money + '。 次高面额为n的因子,X国最多发行' + (parseInt(getMoney(money)) + 1) + "种货币");

3、题目名称:莫名其妙的键盘

有一个神奇的键盘,你可以用它输入a到z的字符,然而每当你输入一个元音字母(a,e,i,o,u其中之一)的时候,已输入的字
符串会发生一次反转! 比方说,当前输入了tw,此时再输入一个o,此时屏幕上的字符串two会反转成owt。 现给出一个
字符串,若用该键盘输入,有多少种方法可以得到?

几道题中最有意思的一道题

结果:

1、字符串无元音,1种方法

按照顺序输出

2、字符串有元音,开头不是元音,无方法
3、字符串有元音,开头是元音,结尾不是元音,1种方法,

输出顺序根据元音个数而定
如果为奇数个元音,从中间元音开始,向右依次输出,碰见元音,折返向左倒叙输出,循环反复,得到初始值
如果为偶数个元音,从中间较大的元音开始,向左倒叙输出,碰见元音,折返向右依次输出,循环反复,得到初始值
在这里插入图片描述

4、字符串有元音,开头是元音,结尾是元音,1种方法

将字符串去掉第一个元音,反转,变成一个以元音开头,结尾不是元音的字符串
根据3方法计算出字符串,然后加上去掉的元音,即可得初始字符串

//第三步得获取原始字符串方法
console.log(getStr('abcdefghijklmnopqrstuvwxyz'));
//输入字符串为:ijklmnohgfepqrstudcbavwxyz
function getStr(str) {
    var vowel = ['a', 'e', 'i', 'o', 'u'];
    //判断首字母是否是元音
    if (vowel.indexOf(str[0]) >= 0) {
        //判断尾字母是否是元音
        if (vowel.indexOf(str[str.length - 1]) < 0) {
            var arr = str.split('');
            var vowel_arr = [];
            //获取所有元音在字符串中的key
            for (var i = 0; i < arr.length; i++) {
                if (vowel.indexOf(arr[i]) >= 0) {
                    vowel_arr.push(i);
                }
            }
            //偶数元音-奇数元音
            if (vowel_arr.length % 2 == 0) {
                //计算中间元音,作为初始字符串开始字符
                var begin_num = vowel_arr.length / 2;
                //定义初始字符串首字母
                var begin_str = arr[vowel_arr[begin_num]];
                vowel_arr.push(arr.length - 1);
                //先向左倒叙,向右正序,循环往复
                for (var j = 1; j <= begin_num; j++) {
                    for (var k = vowel_arr[begin_num - j + 1] - 1; k >= vowel_arr[begin_num - j]; k--) {
                        begin_str += arr[k];
                    }
                    for (var k = vowel_arr[begin_num + j - 1] + 1; k <= vowel_arr[begin_num + j]; k++) {
                        begin_str += arr[k];
                    }
                }
            } else {
                //计算中间元音,作为初始字符串开始字符
                var begin_num = (vowel_arr.length - 1) / 2;
                //定义初始字符串首字母
                var begin_str = arr[vowel_arr[begin_num]];
                vowel_arr.push(arr.length - 1);
                //先向右正序,向左倒叙,循环往复
                for (var j = 1; j <= begin_num + 1; j++) {
                    for (var k = vowel_arr[begin_num + j - 1] + 1; k <= vowel_arr[begin_num + j]; k++) {
                        begin_str += arr[k];
                    }
                    for (var k = vowel_arr[begin_num - j + 1] - 1; k >= vowel_arr[begin_num - j]; k--) {
                        begin_str += arr[k];
                    }
                }
            }
            return '输入字符串为:' + begin_str;
        }
    }
    return '无法输出';
}

4、题目名称:三而竭

一鼓作气再而衰三而竭。 小艺总是喜欢把任务分开做。 小艺接到一个任务,任务的总任务量是n。 第一天小艺能完成x份任务。 第二天能完成x/k。 。。。 第t天能完成x/(k^(t-1))。 小艺想知道自己第一天至少完成多少才能完成最后的任务。(该题的测试用例为:n=59,k=9 输出 x=54)

思路:t天,每天工作的的任务加起来大于总任务量,t-1天,所有任务加起来小于总任务量(x+x/k+x/k2 +x/k3+…>=n)
都说等比数列,我不会,直接循环走起,便利x,带入求和,大于总任务数
要求:每天工作为整数

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值