程式設計師必備三十道演算法題(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,求應發放獎金總數?
<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>