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,带入求和,大于总任务数
要求:每天工作为整数