程序员必备三十道算法题(1~10题)

程序员必备三十道算法题(1~10题)

1、题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
程序分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去
掉不满足条件的排列。

<script>
var arry=[1,2,3,4];
        for(var a=1;a<=arry.length;a++){
            for(var b=1;b<=arry.length;b++){
                if(a==b){
                    continue;
                }
                for(var c=1;c<=arry.length;c++){
                    if(a!=b && b!=c && a!==c){
                        console.log(''+a+b+c)
                    }
                }
            }
        }
</script>

2、题目:企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数?
1.程序分析:请利用数轴来分界,定位。注意定义时需把奖金定义成长整型。

<input type="text" id="li">
<button onclick="text()">奖金数</button>
<script>
    var sum=0;
    function text() {
        var lr=parseInt(document.getElementById('li').value);
        if(lr<=100000){
            sum=100000*0.1
        }else if(100000<lr<200000){
            sum=100000*0.1+(lr-100000)*0.075
        }else if(200000<=lr<400000){
            sum=100000*0.1+100000*0.075+(lr-200000)*0.05
        }else if(400000<=lr<600000){
            sum=100000*0.1+100000*0.075+200000*0.05+(lr-400000)*0.03
        }else if(600000<=lr<1000000){
            sum=100000*0.1+100000*0.075+200000*0.05+200000*0.03+(lr-600000)*0.015
        }else {
            sum=100000*0.1+100000*0.075+200000*0.05+200000*0.03+400000*0.015+(lr-1000000)*0.01
        }
        console.log(sum)
    }
</script>

3、题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
程序分析:在10万以内判断,先将该数加上100后再开方,再将该数加上268后再开方,如果开方后的结果满足如下条件,即是结果。

    <script>
        for(var i=0;i<=100000;i++){
            var a=parseInt(Math.sqrt(i+100));
            var b=parseInt(Math.sqrt(i+268));
            if(i+100==a*a && i+268==b*b){
                console.log(i)
            }
        }
    </script>

4、输入某年某月某日,判断是这一年的第几天

    <script>
        var year=parseInt(prompt('请输入年份'));
        var month=parseInt(prompt('请输入月份'));
        var day=parseInt(prompt('请输入哪一天'));
        var sum=0;
        var leep;
        switch(month){
            case 1: sum=0; break;
            case 2: sum=31; break;
            case 3: sum=59; break;
            case 4: sum=90; break;
            case 5: sum=120; break;
            case 6: sum=151; break;
            case 7: sum=181; break;
            case 8: sum=212; break;
            case 9: sum=243; break;
            case 10: sum=273; break;
            case 11: sum=304; break;
            case 12: sum=334; break;
            default:alert('请输入1~12之间的数');break;
        }
        sum+=day;
        if(year%4==0 &&year%100!==0 || year%400==0){
            leep=1
        }else {
            leep=0
        }
        if(leep==1 && month==2){
            sum++;
        }
        alert('这一天是这一年的'+sum+'天')
    </script>

5、题目:输入三个整数x,y,z,请把这三个数由小到大输出。
程序分析:我们想办法把最小的数放到x上,先将x与y进行比较,如果x>y则将x与y的值进行交换,然后再用x与z进行比较,如果x>z则将x与z的值进行交换,这样能使x最小。

方法一冒泡排序:

   <script>
        var num = prompt('输入n个数');
        var arr =new Array(num);
        for(var i = 0;i < num;i++){
            var temp = prompt('请输入第'+i+'个数');
            arr[i] = temp;
        }

        for(var i = 0;i < arr.length - 1;i++){
            for(var j = i + 1;j < arr.length;j++){
                if(arr[i] > arr[j]){
                    var temp = arr[i];
                    arr[i] = arr[j];
                    arr[j] = temp;
                }
            }
        }
        alert(arr)
    </script>

方法二Math函数:

<script>
    var a=parseInt(prompt('输入第一个整数'));
    var b=parseInt(prompt('输入第二个整数'));
    var c=parseInt(prompt('输入第三个整数'));
    var max=Math.max(a,b,c);
    var min=Math.min(a,b,c);
    var mid=a+b+c-max-min;
    alert(min+'<'+mid+'<'+max)
</script>

方法三:

<input type="text" id="m1">
<input type="text" id="m2">
<input type="text" id="m3">

<button onclick="text()">点击</button>
<script>
    function text() {
        var a=[document.getElementById('m1').value,document.getElementById('m2').value,document.getElementById('m3').value]
        console.log(a.sort(function (a,b) { return a-b }))
        console.log(a.join('<'))
    }
</script>

6、题目:输出9*9口诀。
程序分析:分行与列考虑,共9行9列,i控制行,j控制列。

<script>
    function text() {
        var res='';
        for(var i=1;i<=9;i++){
            for(var j=1;j<=i;j++){
                res+=j+'*'+i+'='+i*j+'\t'
            }
            res+='\n'
        }
        console.log(res)
    }
</script>

7、题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
程序分析:兔子的规律为数列1,1,2,3,5,8,13,21…
月份: 1 2 3 4 5 6 7 8 9
兔子: 1 1 2 3 5 8 13 21 34

方法一:

<script>
        var month=prompt('输入月数');
        var num1 = 1;
        var num2 = 1;
        var sum = 0;
        if(month == 1 || month == 2){
            alert('第' + month + '个月的数量为1')
        }
        for(var i=3;i<=month;i++){
            sum=num1 + num2;
            num1 = num2;
            num2 = sum;
        }
        alert('第' + month + '个月的数量为' + sum)
</script>

方法二递归:

<script>
     function text(month) {
            if(month == 1 || month == 2){
                return 1;
            }else {
                return text(month - 2) + text(month - 1);
            }
        }
        var month = prompt('输入月份')
    alert('第' + month + '个月的数量为' + text(month));
</script>

8、题目:判断101-200之间有多少个素数,并输出所有素数。
程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。

<script>
 var sum=0;
    for(var i=101;i<=200;i++){
        var tf=true;
        for(var j=2;j<i;j++){
            if(i % j==0){
                tf=false;
            }
        }
        if(tf){
            sum++;
            console.log(i)
        }
    }
    console.log('素数为'+sum+'个')
</script>

9、题目:打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个“水仙花数”,因为153=1的三次方+5的三次方+3的三次方。
程序分析:利用for循环控制100-999个数,每个数分解出个位,十位,百位。

<script>
    function text() {
        for(var i = 100;i <= 999;i++){
            var a=parseInt(i / 100)
            var b=parseInt(i / 10 % 10)
            var c=parseInt(i % 10)
            if(a * a * a + b * b * b + c * c * c == i){
                console.log(i)
            }
        }
    }
</script>

10、题目:将一个正整数分解质因数。例如:输入90,打印出90=233*5。
程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成:
(1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。
(2)如果n<>k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你n,
重复执行第一步。
(3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。

<script>
    var sum=parseInt(prompt('输入一个数'));
    var str=sum+'=';
    for(var i=2;i<=sum;i++){
        while(sum % i == 0){
            sum/=i;
            if(sum == 1){
                str+=i+'。'
            }else{
                str+=i+'*'
            }
        }
    }
    alert(str)
</script>
  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值