1. 程式人生 > 其它 >程式設計師必備三十道演算法題(1~10題)

程式設計師必備三十道演算法題(1~10題)

技術標籤:程式設計師必備常用演算法題javascript演算法

程式設計師必備三十道演算法題(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>