JS程序員必做50道題及其答案
//1.由4個數字 1,2,3,4,可以組成多少個互不相同的三位數
var str='';
for(var i=1;i<=4;i++)
{
for(var j=1;j<=4;j++)
{
for(var k=1;k<=4;k++)
{
if (!(i==j==k))
{
var a=i.toString(),b=j.toString(),c=k.toString();
str=a+b+c;
console.log(str);
}
}
}
}
//1.由四個不同的數字組成,比如 1,5,7,8
var str='';
var count=0;
var array=[1,5,7,8]
for(var i=0;i<4;i++)
{
for(var j=0;j<4;j++)
{
for(var k=0;k<4;k++)
{
if ((array[i]!=array[j])&&(array[j]!=array[k])&&(array[i]!=array[k]))
{
count+=1;
var a=array[i].toString(),b=array[j].toString(),c=array[k].toString();
str=a+b+c;
console.log(str);
}
}
}
}
console.log('總共有'+count+'個不同的三位數');
//3 一個整數加上100是完全平方數,加上168又是一個完全平方數
for(i=0;i<1000;i++)
{
var x=parseInt(Math.sqrt(a+100));
var y=parseInt(Math.sqrt(a+168));
if((x*x==(a+100))&&(y*y==(a+168))
{
console.log(a);
}
}
//4 輸入某年某月某日,判斷這一天是一年當中的第幾天
var year=2100 ,month=3,day=10;
var monthArray1=[31,29,31,30,31,30,31,31,30,31,30,31];
var monthArray2=[31,28,31,30,31,30,31,31,30,31,30,31];
var result=0;
if (((year%4==0 && year%100!=0)|| year%400==0))
{
for(var i=0;i<month-1;i++)
{
result += monthArray1[i];
}
var newResult=result+day;
console.log(year +'-'+ month +'-' +day +'閏年的第'+ newResult + '天');
}
else
{
for(var i=0;i<month-1;i++)
{
result += monthArray2[i];
}
var newResult=result+day;
console.log(year+'-'+ month +'-'+day +'一年的第'+ newResult + '天');
}
//5 輸入三個數,把三個數按照從小到大排列輸出
var a=3,b=4,c=1;
if(a>b)
{
var max1=a;
a=b;
b=max1;
}
console.log(a,b,c);
if(c<b)
{
var max2=b;
b=c;
c=max2;
}
console.log(a,b,c);
if(a>b)
{
var max3=a;
a=b;
b=max3;
}
console.log(a,b,c);
// 6 用*輸出C字型的圖案
var str='';
str+=' '+'*'+'*';
str+='\n';
str+='*';
str+='\n';
str+='*';
str+='\n';
str+=' '+'*'+'*';
console.log(str);
//7.將一個正整數分解質因數,例如輸入90,打印出90=2*3*3*5
function primeCheck(n)
{
for(var i=2;i<n;i++)
{
if(n%i==0)
{
return false;
}
}
return true; //判斷是不是質數
}
function prime(k)
{
var str='';
for(var t=2;t<k;t++)
{
if(k%t==0) //先遍歷,看看能不能整除
{
if(primeCheck(t)) //再判斷是不是質數
{
str+=t+'*';
k/=t;
t=1; //讓t從2開始循環
}
}
}
str+=k //最后一個必然是質數,必然不會被小於它的數整除
return str;
}
var a=prime(100);
console.log(a);
//8.輸出9 9乘法表
for (var i=1;i<10 ;i++ )
{
var line='';
for(var j=1;j<=i;j++)
{
line += i+'*'+j+'='+i*j +'\n';
}
console.log(line);
}
//9.輸出國際象棋
//10.古典問題:有一對兔子, 從出生后第 3個月起每個月都生一對兔子, 小兔子長到第三 個月后每個月又生一對兔子,假如兔子都不死,問每個月的兔子總數為多少?
fibonaci數列
1.用遞歸的方法寫
function fibonaci(n)
{
if(n<=2)
{
return 1
}
return fibonaci(n-1)+fibonaci(n-2);
}
console.log(fibonaci(6));
2.不用遞歸的方法寫
function fibonaci(n)
{ var fibonaci1=1,fibonaci2=1;fib=0;
if(n<=2)
{return 1;}
for(i=3;i<=n;i++)
{ fib=fibonaci1+fibonaci2;
fibonaci1=fibonaci2;
fibonaci2=fib;
}
return fib;
}
console.log(fibonaci(100));
//判斷101到200有多少個素數,並且輸出
function primeCheck(n)
{
for(var i=2;i<Math.sqrt(n);i++)
{
if(n%i==0)
{
return false;
}
}
return true;
}
for(var k=101;k<201;k++)
{
var isPrime=primeCheck(k);
if(isPrime)
{
console.log(k);
}
}
//11.打印出所有的 “ 水仙花數 ” ,所謂 “ 水仙花數 ” 是指一個三位數,其各位數字立方和等於 該數本身。
例如:153是一個 “ 水仙花數 ” ,因為 153=1的三次方+5的三次方+3的三次方。
(1)
方法一 for(var a=1;a<10;a++){
for(var b=0;b<10;b++){
for(var c=0;c<10;c++){
if(a*a*a+b*b*b+c*c*c==a*100+b*10+c)
{
console.log(a*100+b*10+c);
}
}}}
方法二 for(var i=101;i<1000;i++)
{
var bai=parseInt(i/100);
var shi=parseInt((i%100)/10);
var ge=(i%100)%10;
if(bai*bai*bai+shi*shi*shi+ge*ge*ge==i)
{ console.log(i)}
}
方法三 將輸入的三位數變成字符串,然后將字符串的每一個位取出組成一個數組
for(var i=101;i<1000;i++)
{
var a=i.toString();
var b=a.split('');
if(b[0]*b[0]*b[0]+b[1]*b[1]*b[1]+b[2]*b[2]*b[2]==i)
{
console.log(i);
}
}
//12 判斷 101-200之間有多少個素數,並輸出所有素數。
function primeCheck(n)
{
for(var i=2;i<Math.sqrt(n);i++)
{
if(n%i==0)
{
return false;
}
}
return true;
}
for(var k=101,count=0;k<201;k++)
{
var isPrime=primeCheck(k);
if(isPrime)
{
count++
console.log(k);
}
}
console.log(count);
//13 利用條件運算符的嵌套來完成此題:學習成績 >=90分的同學用 A 表示, 60-89分之 間的用 B 表示, 6 0分以下的用 C 表示。
var great=92;
great>=60? (great>=90? console.log('A'): console.log('B')):console.log('C');
//14 輸入兩個正整數 m 和 n ,求其最大公約數和最小公倍數。
function maxYue(a,b)
{ var n=0;
var array=[];
a<b? n=a: n=b;
for(i=2;i<n;i++)
{
if (a%i==0 && b%i==0)
{
array.push(i);
}
} // 把a 和 b 的公約數都放在一個數組里面
var max_yue=array[0];
for(var t=1;t<array.length;t++)
{
if(max_yue<array[t])
{
max_yue=array[t];
}
} //求出這個公約數數組的最大的那一個就是最大公約數
return max_yue;
}
function getBei(a,b)
{
for(var i=2;i>=2;i++)
{
var bei1=i*a;
if((bei1%b==0)&&(bei1!=b)) //加后面的與是為了避免第一個數的倍數等於第二個數
{
return bei1;
}
}
}
console.log('最大公約數是'+maxYue(15,30));
console.log('最小公倍數是'+getBei(15,30));
15.輸入一行字符,分別統計出其中英文字母、空格、數字和其它字符的個數。
var str1='abc123 &-b';
var b=str1.split('');
for(var i=0,count1=0,count2=0,count3=0;i<b.length;i++)
{ if(b[i]===' ')
{
count1++; //代表空格的個數
}
var str2=Number(b[i]); //Number轉換帶有非數字的字符會返回Nan
if( isNaN(str2)) //如果是NAN,就代表非數字的字符
{
count2++; //代表字母和其他字符的個數之和
if( (b[i]>='a'&&b[i]<='z')||(b[i]>='A'&&b[i]<='Z')) //判斷非數字的字符里面的屬於字母的字符
{
count3++; //代表字母的個數
}
}
}
var count4=count2-count3 //代表除字母外的其他非數字字符的個數
var count5=b.length-count1-count2;
console.log(count1,count3,count4,count5);
//方法二:用正則判斷
var reg1=/\d/g;
var reg2=/\s/g;
var reg3=/[A-Za-z]/g;
var len1=str.match(reg1).length;//返回數字的個數
var len2=str.match(reg2).length;//返回空格的個數
var len3=str.match(reg3).length;返回字母的個數
//16.求 s=a+aa+aaa+aaaa+aa...a的值,其中 a 是一個數字。例如 2+22+222+2222+22222(此 時共有 5個數相加 )
,幾個數相加有鍵盤控制。
方法一:將每一位相加,然后用字符串拼接
function fn(a,n)
{ var array=[];
var str=''
for(var i=n,num=0,jinwei=0;i>0;i--)
{
num=(a*i)%10+jinwei; //先從個位開始 得到該位的數
jinwei=parseInt((a*i)/10);//計算進位
// str+=num;
array.push(num); //放到數組里面去
}
for(var i=array.length-1;i>=0;i--) //數組逆序遍歷
{
str+=array[i]; //將數組中的元素拼接到字符串里面去
}
return str; //返回字符串
}
console.log(fn(2,5));
方法二:從個位開始到最高位,依次開始加權相加
//17一個數如果恰好等於它的因子之和, 這個數就稱為 “ 完數 ” 。 例如 6=1+2+3. 編程找出1000以內的所有完數。
function wanshu(k)
{
for(var i=1,str='';i<k;i++) //外層表示K以內任何的數
{
for(var b=1,array=[];b<i;b++) //內層表示尋找K以內某個數的質因子
{
if(i%b==0) //找出該數的所有因子
{
array.push(b);
}
}
for (var t=0,sum=0;t<array.length;t++ ) //遍歷數組,將數組中的所有元素相加
{
sum+=array[t];
}
if(sum==i)
{
str+=i+' ';
}
}
return str;
}
console.log(wanshu(1000));
//18 一球從 100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第 10次落地時,共經過多少米?第 10次反彈多高?
function getHigh(h,n)
{
for(var i=1,sum=0;i<=n;i++)
{
sum+=h+h/2;
h/=2
}
return sum;
}
function high(h,n)
{
for(var i=1;i<=n;i++)
{
h/=2;
}
return h;
}
console.log(getHigh(100,12));
console.log(high(100,12));
//19 :猴子吃桃問題:猴子第一天摘下若干個桃子,當即吃了一半,還不癮,又多吃了一個 第二天早上又將剩下的桃子吃掉一半, 又多吃了一個。
以后每天早上都吃了前一天剩下的一 半零一個。到第 10天早上想再吃時,見只剩下一個桃子了。求第一天共摘了多少。
function taozi(i)
{
var leave=1;
do
{ leave=(leave+1)*2;
i--
}
while (i>=1);
return leave;
}
console.log(taozi(9));
//20 兩個乒乓球隊進行比賽,各出三人。甲隊為 a,b,c 三人,乙隊為 x,y,z 三人。已抽簽決 定比賽名單。
有人向隊員打聽比賽的名單。 a 說他不和 x 比, c 說他不和 x,z 比,請編程序 找出三隊賽手的名單。
//21有一分數序列:2/1, 3/2, 5/3, 8/5, 13/8, 21/13...求出這個數列的前 20項之和。
var fib1=2,fib2=3,fib=0,i=3; //分子
var afib1=1,afib2=2,afib=0; //分母
var sum1=fib1+fib2;
var sum2=afib1+afib2;
do
{
fib=fib1+fib2;
fib1=fib2;
fib2=fib; //分子是fibonaci 數列 前20項相加
sum1+=fib;
afib=afib1+afib2;
afib1=afib2; //分母也是fibonaci 數列 前20項相加
afib2=afib;
sum2+=afib;
i++;
}
while (i<21);
var total=sum1/sum2;
console.log(total);
//22 求 1+2!+3!+...+20!的和
function jc(k)
{ if(k<=1)
{
return 1;
}
return k*jc(k-1);
}
function add(n)
{ var sum =0;
for(var i=1;i<=n;i++)
{
sum+=jc(i);
}
return sum;
}
var a=add(20);
console.log(a);
//23利用遞歸方法求 5! 。
function jc(k)
{ if(k<=1)
{
return 1;
}
return k*jc(k-1);
}
console.log(jc(5));
//24利用遞歸函數調用方式,將所輸入的 5個字符,以相反順序打印出來。
var str1='abcde';
var b=str1.split('');
var str='';
function nixu(i)
{
if(i==0)
{
return b[0];
}
return str+=b[i]+nixu(i-1)
}
console.log(nixu(4));
//25 有 5個人坐在一起,問第五個人多少歲?他說比第 4個人大 2歲。問第 4個人歲數,
他說比第 3個人大 2歲。 問第三個人,又說比第 2人大兩歲。 問第 2個人, 說比第一個人大 兩歲。
最后問第一個人,他說是 10歲。請問第五個人多大?
var age=0;
function age(i)
{
if(i==1)
{
return 10;
}
return age=age(i-1)+2;
}
console.log(age(5));
// 26 給一個不多於 5位的正整數,要求:一、求它是幾位數,二、逆序打印出各位數字。
var a=12345;
function panduan (k)
{ var c=k.toString();
var b=c.split('');
var str='',str1='';
switch(b.length)
{
case 1: str='這是一個一位數';break;
case 2: str='這是一個兩位數';break;
case 3: str='這是一個三位數';break;
case 4: str='這是一個四位數';break;
case 5: str='這是一個五位數';break;
default:str='輸入錯誤';
}
for(var i=b.length-1;i>=0;i--)
{
str1+=b[i];
}
return str+' '+str1;
}
console.log(panduan(a));
//27 一個 5位數,判斷它是不是回文數。即 12321是回文數,個位與萬位相同,十位與千 位相同
var a=12321;
function panduan (k)
{ var c=k.toString();
var b=c.split('');
if(b[0]==b[4]&&b[1]==b[3])
{
return '這是一個回文數';
}
else
{
return '這不是一個回文數';
}
}
console.log(panduan(a));
//方法一 遍歷數組得到
function nixu(arr)
{ var newArr=[];
for(var i=0;i<arr.length;i++)
{
newArr[i]=arr[arr.length-1-i];
}
return newArr;
}
console.log(nixu([1,3,4,9]));
//方法二 遞歸輸出
var str='';
var a=[1,2,3,4];
function nixu(i)
{
if(i==0)
{
return str+=a[0];
}
return str+=a[i]+nixu(i-1)
}
console.log(nixu(3).split(''));
//28請輸入星期幾的第一個字母來判斷一下是星期幾, 如果第一個字母一樣, 則繼續判斷 第二個字母。
while(true)
{
var a=prompt('please input the first char');
if(a=='m'){alert('星期一');}
else if(a=='w'){alert('星期三');}
else if(a=='f'){alert('星期五');}
else if(a=='t'){a=prompt('please input the second char');
if(a=='u'){alert('星期二');}
if(a=='h'){alert('星期四');}}
else if(a=='s'){a=prompt('please input the second char');
if(a=='a'){alert('星期六');}
if(a=='u'){alert('星期日');}}
else
alert('wrong input!');
}
//29 對 10個數進行排序
/*function exchange(str)
{
for(var i=0;i<str.length-1;i++)
{
for(var j=0;j<str.length-1-i;j++)
{
if(str[j]>str[j+1])
{
var swap=str[j];
str[j]=str[j+1];
str[j+1]=swap;
}
}
}
}
inputStr=[1,4,2,5,11];
console.log('排序之前的數組' + inputStr);
exchange(inputStr);
console.log('排序之后的數組' + inputStr);
//30 求一個 3*3矩陣對角線元素之和
//31 有一個已經排好序的數組。現輸入一個數,要求按原來的規律將它插入數組中。
//32 將一個數組逆序輸出。
//方法一 遍歷數組得到
function nixu(arr)
{ var newArr=[];
for(var i=0;i<arr.length;i++)
{
newArr[i]=arr[arr.length-1-i];
}
return newArr;
}
console.log(nixu([1,3,4,9]));
//方法二 遞歸輸出
var str='';
var a=[1,2,3,4];
function nixu(i)
{
if(i==0)
{
return str+=a[0];
}
return str+=a[i]+nixu(i-1)
}
console.log(nixu(3).split(''));
方法三:用數組的API reverse()
//附加題:在一定范圍內產生隨機數
function getRandomNum(min,max)
{
var range=max-min;
var rand=Math.random();
return (min+Math.floor(rand*range))
}
console.log(getRandomNum(10,34)); 會隨機打印出在10到34之間的數
//附加題:福利彩票雙色球
function getRandomNum(min,max)
{
var range=max-min;
var rand=Math.random();
return min+Math.floor(rand*range); //產生0到32的下標
}
var arrRedRandom=[];
var arrRed=['01','02','03','04','05','06','07','08','09',10, //紅色球號碼
11,12,13,14,15,16,17,
18,19,20,21,22,23,24,
25,26,27,28,29,30,31,32,33];
var arrBlue=['01','02','03','03','04','05','06','07','08','09',10,11,12,13,14,15,16];
for(var i=0;i<6;i++)
{
var index=getRandomNum(0,arrRed.length); //隨機產生下標
arrRedRandom.push(arrRed[index]); //向數組中插入該下標的數組元素
arrRed.splice(index,1); //插入這個數后,就把數組庫里的這個元素刪除掉,以免下次隨機產生的時候重復
}
console.log('紅色雙號球的號碼:'+' '+arrRedRandom);
var index1=getRandomNum(0,arrBlue.length);
var str=arrBlue[index1];
console.log('藍色單號球的號碼:'+' '+str)
var redAddBlue=arrRedRandom.concat(Number(str));
console.log(redAddBlue)
33.打印出楊輝三角形(要求打印出 10行如下圖)
34 輸入數組,最大的與第一個元素交換,最小的與最后一個元素交換,輸出數組
var str=[1,2,0,5,6,2]
for(var i=1, temp=0;i<str.length;i++) //假設第一個數是最大的,和后面的數兩兩比較,如果大於第一個數,就交換
{
if(str[0]<str[i])
{
temp=str[0]
str[0]=str[i]
str[i]=temp
}
}
for(var i=str.length-2,temp=0;i>=0;i--) //假設最后一個數是最大的,和前面的數兩兩比較,如果小於第一個數,就交換
{
if(str[str.length-1]>str[i])
{
temp=str[str.length-1];
str[str.length-1]=str[i]
str[i]=temp;
}
}
console.log(str);
var str=[1,2,0,5,6,2]
for(var i=1,j=str.length-2 ,temp1=0,temp2=0;i<str.length,j>=0;i++,j--) //兩個for寫在一起
{
if(str[0]<str[i])
{
temp1=str[0]
str[0]=str[i]
str[i]=temp1
}
if(str[str.length-1]>str[j])
{
temp2=str[str.length-1];
str[str.length-1]=str[j]
str[j]=temp2;
}
}
console.log(str)
36//有 n 個人圍成一圈,順序排號。從第一個人開始報數(從 1到 3報數) ,凡報到 3的 人退出圈子,問最后留下的是原來第幾號的那位。
var n=10
var str='留下人的數字號碼是:'
var i=1;
do
{ if(i%3!=0)
{
str+=' '+i;
}
i++;
}
while (i<=n);
console.log(str);
37:寫一個函數,求一個字符串的長度,在 main 函數中輸入字符串,並輸出其長度。
38:編寫一個函數,輸入 n 為偶數時,調用函數求 1/2+1/4+...+1/n,當輸入 n 為奇數時,調 用函數 1/1+1/3+...+1/n
function addDouble(n)
{
var sum=0;
var i=2;
do
{
sum+=(1/i)
i+=2
}
while (i<=n);
return sum;
}
function addinDouble(n)
{
var sum=0;
var i=1;
do
{
sum+=(1/i)
i+=2
}
while (i<=n);
return sum;
}
var n=10;
n%2==0&&console.log(addDouble(n))
n%2!=0&&console.log(addinDouble(n))
39:海灘上有一堆桃子, 五只猴子來分。 第一只猴子把這堆桃子憑據分為五份, 多了一個, 這只猴子把多的一個扔入海中,
拿走了一份。 第二只猴子把剩下的桃子又平均分成五份, 又 多了一個,它同樣把多的一個扔入海中,拿走了一份,第三、第四、
第五只猴子都是這樣做 的,問海灘上原來最少有多少個桃子?
43//一個偶數總能表示為兩個素數之和。
function isPrime(k) //判斷是不是素數
{
for(var i=2;i<k;i++)
{
if(k%i==0)
{
return false
}
}
return true
}
function isDoubleNum(t) //判斷是不是偶數
{
if(t%2!=0)
{
return false
}
else
{
return true
}
}
function anyDoubleNum(n) //先找小於該數的素數,用該數減去該素數,載判斷剩下的是不是素數,一旦是的話,就return
{
if(isDoubleNum(n))
{
for(var i=2;i<n;i++)
{
if(isPrime(i))
{
var k=n-i;
if(isPrime(k)&&k>=2)
{
console.log(n,i,k)
return ;
}
}
}
}
}
anyDoubleNum(4);//調用函數
//附加題 將字符串的首字母變成大寫字母
var str1='miao-wei-ke-tang'
function strToUpperCase(str)
{
var arr=str.split('-')
for(var i=0;i<arr.length;i++)
{
arr[i]=arr[i].substr(0,1).toUpperCase()+arr[i].substr(1)
}
var res=arr.join('')
return res;
}
console.log(strToUpperCase(str1))
//附加題:去掉字符串中前后的空格
var str1=' abc d '
function myTrilm(str)
{
var start=0; //
var end=str.length-1;
while(!str.charAt(start)&&!str.charAt(start+1))
{
start++;
}
while(!str.charAt(end)&&!str.charAt(end-1))
{
end--;
}
var newStr=str.slice((start+1),end)
return newStr;
}
console.log(str1)
console.log(myTrilm(str1))
//附加題 寫一個方法,找出字符串‘abcabcabcabda’中ab出現的次數和位置
function getCountandLocation(str)
{ var count=0;
var locate=[];
for(var i=0;i<str.length;i++)
{
if((str.charAt(i)=='a')&&(str.charAt(i+1)=='b'))
{
count++;
locate.push(i+1);
}
}
var res=locate.concat(count)
return res;
}
console.log(getCountandLocation())
//判斷是函數 數組 對象的幾種方法
var arr=[1,2];
function fun(){}
var obj={};
console.log(arr instanceof Array);
console.log(obj instanceof Object);
console.log([].constructor == Array); //true
console.log({}.constructor == Object); //true
console.log("string".constructor == String); //true
console.log((123).constructor == Number); //true
console.log(true.constructor == Boolean); //true
function isArray(o) {
return Object.prototype.toString.call(o);
}
var arr=[2,5,6,8];
var obj={name:'zhangsan',age:25};
var fn = function () {}
console.log(isArray(arr)); //[object Array]
console.log(isArray(obj)); //[object Object]
console.log(isArray(fn)); //[object function]
//隨機生成10-100的10個數字,並且升序排列。
function getArr(min,max,len)
{
var arr=[]; //寫一個空數組來接收產生的隨機數
var range=max-len+1;
for(var i=0;i<=len-1;i++)
{
var a=Math.floor(Math.random()*range+min);//隨機生成10-100
if(arr.indexOf(a)==-1)//如果該數組中的沒有該數就將數放進數組中
{
arr.push(a);
}
else{//如果該數組中有這個數字,就重新循環一次生成隨機數
i--;
}
}
arr.sort(function(a,b){return a-b;})
return arr;
}
console.log(getArr(10,100,10));