程序员必备三十道算法题(21~30题)

程序员必备三十道算法题(21~30题)

21、题目:求1+2!+3!+…+20!的和
程序分析:此程序只是把累加变成了累乘。

<script>
    var sum = 0;
    for(var i = 1;i <= 20;i++){
     
        var a = 1;
        for(var j = i;j > 0;j--){
     
            a *= j;
        }
        sum += a;
    }
    alert('和为' + sum);
</script>

22、题目:利用递归方法求5!。
程序分析:递归公式:fn=fn_1*4!

方法一递归:
<script>
    function text(a) {
     
        if(a == 0 || a == 1){
     
            return 1;
        }else {
     
            return a * text(a - 1)
        }
    }
    alert('5!为' + text(5))
</script>

方法二:
<script>
        var a = prompt('输入要求阶层的数');
        var sum = 1;
        if(a == 0 && a == 1){
     
            alert(1);
        }
        for(var i = 1;i <= a;i++){
     
            sum *= i;
        }
        alert(sum);
</script>

23、题目:打印出 100-1000之间所有的“水仙花数”;
说明:所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身,本题没有返回值,请把每一个答案使用console.log 打印在控制台。
例如:153是一个“水仙花数”,因为153=1的三次方+5的三次方+3的三次方

<script>
    for(var i = 100;i < 1000;i++){
     
        var a = parseInt(i / 100);
        var b = parseInt(i / 10 % 10);
        var c = parseInt(i % 10);
        if(i == a * a * a + b * b * b + c * c * c){
     
            console.log('水仙花数为' + i);
        }
    }
</script>

24、题目: 桌上有 n 堆硬币,每堆的数量保存在数组 coins 中。我们每次可以选择任意一堆,只能拿走其中的一枚或者两枚,
求拿完所有硬币的最少次数。
示例:
输入:[4,2,1]
输出:4
解释:第一堆最少需要拿 2 次,第二堆最少需要拿 1 次,第三堆最少需要拿 1 次,总共 4 次即可拿完

<script>
    var coins = [1,2,4];
    var sum = 0;
    for(var i = 0;i < coins.length;i++){
     
        if(coins[i] % 2 == 0){
     
            sum += coins[i] / 2;
        }else {
     
            sum += (coins[i] + 1) / 2;
        }
    }
    alert('最少次数为' + sum);
</script>

25、题目:小A 和 小B 在玩猜数字。小B 每次从 1, 2, 3 中随机选择一个,小A 每次也从 1, 2, 3 中选择一个猜。他们一共进行三次这个游戏,请返回 小A 猜对了几次?输入的guess数组为 小A 每次的猜测,answer数组为 小B 每次的选择。guess和answer的长度都等于3

<script>
    var guess = [];
    var answer = [];
    var sum = 0;
    for(var i = 0;i < 3;i++){
     
        var m =Math.floor(Math.random() * 3 + 1);
        guess.push(m);
    }
    alert('小A选择的数为' + guess);

    for(var j = 0;j < 3;j++){
     
        var n = Math.floor(Math.random() * 3 + 1);
        answer.push(n);
        if(guess[j] == answer[j]){
     
            sum++;
        }
    }
    alert('小B选择的数为' + answer);
    alert('小A猜对了' + sum + '次');
</script>

26、题目:打印出杨辉三角形

<script>
    function f(a,b) {
          //a代表第几行  b代表第几个
        if(a == 1){
            //每一行的第一个为1
            return 1;
        }else if(b == 1 || a == b){
          //每一行的最后一个为1
            return 1;
        }else {
     
            return f(a - 1,b) + f(a - 1,b - 1)
        }
    }

    function ff(sum) {
     
        //控制行
        for(var i = 1;i <= sum;i++){
     
            for(var j = 1;j <= i;j++){
     
                document.write(f(i,j) + '\n');
            }
            document.write('
'
); } } ff(8); </script>

27、题目:约瑟夫环:已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。
问最后留下的是原来的第几号。

var a = [];
    for(var i = 0;i <= 5;i++){
     
        a[i] = new Array(i + 1);
    }
    for(var i = 0;i <= 5;i++){
     
        for(var j = 0;j <= i;j++){
     
            if(j == 0 || j == i){
     
                a[i][j] = 1
            }else{
     
                a[i][j] = a[i-1][j-1] + a[i-1][j]
            }
        }
    }
    for(var i = 0;i <= 5;i++){
     
        var b = '';
        for(var j = 0;j <= 10 - i - 1;j++){
     
            b += ' '
        }
        console.log(b+a[i])
    }

28、题目:有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?
程序分析:利用递归的方法,递归分为回推和递推两个阶段。要想知道第五个人岁数,需知道第四人的岁数,依次类推,推到第一人(10岁),再往回推。

<script>
    function text(m) {
     
        if(m == 1){
     
            return 10;
        }else {
     
            return text(m - 1) + 2;
        }
    }
    alert('第五个人' +text(5) +'岁')
</script>

29、题目:一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。

<script>
    var i = prompt("请输入五位数");
    var a = parseInt(i / 10000);
    var b = parseInt(i % 10);
    var c = parseInt(i / 1000 % 10);
    var d = parseInt(i / 100 % 10);
    if(a == b || c == d){
     
        alert('这个数是回文数' + i)
    }else {
     
        alert('这个数不是回文数' + i)
    }
</script>

30、题目:对10个数进行排序
1.程序分析:可以利用选择法,即从后9个比较过程中,选择一个最小的与第一个元素交换,
下次类推,即用第二个元素与后8个进行比较,并进行交换。

<script>
    function text(array) {
     
        var a = 0,b = 0;
        for(var i = 0;i < array.length - 1;i++){
     
            a = i;
            for(var j = i + 1;j < array.length;j++){
     
                if(array[j] < array[a]){
     
                    a = j;
                }
            }
            b = array[i];
            array[i] = array[a];
            array[a] = b;
        }
        return array;
    }
    alert(text([3,2,5,1,6,7,8,9,4,11]));
</script>

你可能感兴趣的:(程序员算法题,程序员必备常用算法题,JavaScript算法题)