文章目录
- 第7-45题
- 第7题:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。
- 第8题:输出9*9口诀。
- 第9题:要求输出国际象供棋盘。
- 第10题:古典问题:有一对兔子,从出生后第3个月起每个月都生一-对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
- 第11题:判断101-200之间有多少个素数,并输出所有素数。
- 第12题:打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个“水仙花数”, 因为153=1 的三次方+5的三次方+3的三次方
- 第13题:利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89 分之间的用B表示,6 0分以下的用C表示。
- 第14题:输入两个正整数m和n,求其最大公约数和最小公倍数
- 第15题:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
- 第16题:求s=a+aa+aaa+aaa+…a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加由键盘控制
- 第17题:一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2+3.编程找出1000以内的所有完数。
- 第18题:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?
- 第19题:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个第二天早.上又将剩下的桃子吃掉-一半,又多吃了一个。以后每天早上都吃了前一一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一一个桃子了。求第一天共摘了多少。
- 第20题:两个乒乓球队进行比赛,各出三人。甲队为ab,c三人,乙队为xy;z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。
- 第21题:有一分数序列: 2/1, 3/2, 5/3, 8/5,13/8, 21/13… 求出这个数列的前20项之和。
- 第22题:求1+2!+3!+…+20!的和。
- 第23题:利用递归方法求5!。
- 第24题:利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来。
- 第25题:有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?
- 第26题:给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。
- 第27题:一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同
- 第28题:请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样, 则继续判断第二个字母
- 第29题:对10个数进行排序。
- 第30题:求一个3*3矩阵对角线元素之和。(n*n阶计算方法相同)
- 第31题:有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。
- 第32题:将一个数组逆序输出
- 第33题:打印出杨辉三角形
- 第34题:输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组。
- 第35题:有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数
- 第36题:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
- 第37题:写一个函数,求一个字符串的长度,在main函数中输入字符串,并输出其长度。
- 第38题:编写一个函数,输入n为偶数时,调用函数1/2+1/4+…+1/n,当输入n为奇数时,调用函数1/1+1/3+…+1/n
- 第39题:海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子平均分为五份,多了一个,这只猴子把多的一个扔入海中,拿走了一份。第二只猴子把剩下的桃子又平均分为五份,又多了一个,它同样把多的一个扔入海中,拿走了一份,第三、第四、第五只猴子都是这样做的,问海滩上原来最少有多少个桃子?
- 第40题:809*??=800*??+9*??+1其中??代表的两位数.8*??的结果为2位数,9*??的结果为3位数。求??代表的两位数,及809*??后的结果
- 第41题:八进制转换为十进制
- 第42题:求0——7所能组成的奇数个数。
- 第43题:一个偶数总能表示为两个素数之和。
- 第44题:判断一个素数能被几个9整除
- 第45题:某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的,加密规则如下:每位数字都加.上5,然后用和除以10的余数代替该数字,再将第1位和第四位交换,第二位和第三位交换。
- 1-6前面有分开写,为了方便查阅,这里只展示代码,略详细的翻一下前面的博客吧
- 第1题:1,2,3,4组成不同不重复的三位数
- 第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%提成,从键盘输入当月利润,求应发放奖金总数?
- 第3题:一个整数,它加上100后是一-个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
- 第4题:输入某年某月某日,判断这一天是这一年的第几天?
- 第5题:输入三个整数x,y,z,请把这三个数由小到大输出。
- 第6题:用*号输出字母C的图案。
- 总结
第7-45题
写完才发现50题只有45道,终于写完啦!!!最后还是附了1-6题,所以是个大合集~
第7题:将一个正整数分解质因数。例如:输入90,打印出90=233*5。
1.代码
var n=90,m=n
var a=n+'='
for(var i=2;i<=m;i++){
if(m%i == 0){//遍历比输入数小的每一个数,从最小的质数开始累乘
a+=i.toString()+'*'
m=m/i
i=1
}
}
//最后会多个'*',将字符串转为数组,去掉最后一个字符再转为字符串打印
var arr=a.split('')
arr.splice(-1)
a=arr.join('')
console.log(a)
2.结果展示
第8题:输出9*9口诀。
1.代码
//两个for循环,一个管行,一个管列
for(var i=1;i<=9;i++){
//三角形的形成原因是j的范围
for(var j=1, a='';j<=i;j++){
a+=j+'*'+i+'='+(i*j)+' '
}
console.log(a)
}
2.结果展示
第9题:要求输出国际象供棋盘。
1.代码
for(i=1;i<=8;i++){
var a=''
for(j=1;j<=8;j++){
//注意这里,如果直接用j的值计算就没有交替现象了,i就是改变奇偶性的
if((j+i)%2===0){
a+='■'
}else{
a+= '□'
}
}
console.log(a)
}
2.结果展示
第10题:古典问题:有一对兔子,从出生后第3个月起每个月都生一-对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
1.代码
function fib(n){
if(n==1 ||n==2){
return 1
}
return fib(n-2)+fib(n-1)
}
console.log(fib(10))
2.结果展示
3.注意
我没在函数里写console,记得调用函数
第11题:判断101-200之间有多少个素数,并输出所有素数。
1.代码
var a=0
for(var prime=101;prime<=200;prime++){
//声明变量保存统计的因数的个数
var count=0
for(i=1;i<=parseInt(prime/2);i++){
if(prime%i===0){
//遍历小于n的数,如果n除以这个数i能整除,就给count+1
count++
}
}
//如果count数等于1,说明遍历过小于n/2的所有数后这个数只有1一个因数
if(count===1){
//此时这个数是质数,除数这个质数
console.log(prime)
//统计质数个数
a++
}
}
console.log(a)
2.结果展示
3.注意
注意质数是指除了1和它本身没有其他因数的数,因为n的因数最大不会超过它的一半,所以我用n/2,不用遍历到它本身,大概可以省点时间?
这题其实可以从2开始算,这样判断count为0比较好理解,我这方法有点笨了
第12题:打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个“水仙花数”, 因为153=1 的三次方+5的三次方+3的三次方
1.代码
for(num=100;num<1000;num++){
var a =parseInt(num/100)//百位
var b =parseInt((num%100)/10)//十位
var c =num%10//个位
if(a*a*a+b*b*b+c*c*c===num){
console.log(num+'是水仙花数')
}
}
2.结果展示
第13题:利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89 分之间的用B表示,6 0分以下的用C表示。
1.代码
var score=10
if(score<0 || score>100){
console.log('非法成绩')
}
else if(score>=90){
console.log('A')
}
else if(score>=60){
console.log('B')
}
else{
console.log('C')
}
2.结果展示
第14题:输入两个正整数m和n,求其最大公约数和最小公倍数
1.代码
//输入两个正整数m和n,求其最大公约数和最小公倍数
var m=11
var n=22
var a=0
var b=0
if(m<n){
a=m
m=n
n=a
}
var arr1=[]
var arr2=[]
var arr3=[]
var j=0,k=0,l=0
//遍历求得m的所有因数存在arr1中
for(i=1;i<=m;i++){
if(m%i==0){
arr1[j]=i
j++
}
}
//遍历求得n的所有因数存在arr2中
for(b=1;b<=n;b++){
if(n%b==0){
arr2[k]=b
k++
}
}
//找到arr1和arr2中相同公因数,存在arr3中
for(a=0;a<arr1.length;a++){
for(i=0;i<arr2.length;i++){
if(arr1[a]==arr2[i]){
arr3[l]=arr1[a]
l++
}
}
}
console.log(m+'和'+n+'的最大公因数为:'+arr3[arr3.length-1])
//将mn直接相乘再除以arr3中所有值的积即可得到最小公倍数(数学问题)
for(i=0;i<arr3.length;i++){
a=(m*n)/arr3[i]
}
console.log(m+'和'+n+'的最小公倍数为:'+a)
2.结果展示
3.注意
这题我写的变量用的很乱,但是思路比较简单,写完有点久了懒得改了,就先凑合着吧,这方法还笨得很,大家踊跃思考,欢迎交流呀~
第15题:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
1.代码
var str='0fewofho0234l%^$'
var arr=[]
var alpha=0,space=0,num=0,chars=0 //声明变量保存要计算的值得数量
for(var i=0;i<str.length;i++){
arr[i]=str.charAt(i) //charAt,依次取出字符
}
//下面的判断条件就是字符对应的ASCII码
for(i=0;i<arr.length;i++){
if(arr[i].charCodeAt()===32){
space++
}else if(arr[i].charCodeAt()>=65 && arr[i].charCodeAt()<=90 ||arr[i].charCodeAt()>=97 && arr[i].charCodeAt()<=122){//英文字母范围
alpha++
}else if(arr[i].charCodeAt()>=48 && arr[i].charCodeAt()<=57){
num++
}else{
chars++
}
}
console.log('英文字母有:'+alpha+' 空格有'+space+' 数字有:'+num+' 其他字符有:'+chars)
console.log(arr[0],typeof arr[0],arr[0].charCodeAt())
2.结果展示
3.注意
也可以用charAt(),比较字符0-9,a-z,但是对于空格和特殊符号比较麻烦,所以我还是更喜欢用ascii码
第16题:求s=a+aa+aaa+aaa+…a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加由键盘控制
1.代码
var a=7
var arr=[]
var sum=0
for(var i=0,b=2,c='';i<a;i++){
//将每一个加数保存在数组中
c = (b).toString()+c
arr[i]=c
console.log(arr[i])
}
for(i=0,str='';i<arr.length;i++){
str+=arr[i]+'+'//获得前面的字符串
sum+=Number(arr[i])//得到最终结果
}
//将字符串转为数组去掉最后的加号再转回字符串
var arr1=str.split('')
arr1.splice(-1,1)
str=arr1.join('')
console.log(str+'='+sum)
2.结果展示
3.注意
这里可以用函数封装起来,做之前还没看函数封装部分,我懒,学了后不想改了
第17题:一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2+3.编程找出1000以内的所有完数。
1.代码
var arr=[]
for(var a=1;a<=1000;a++){
for(var i=1,j=0;i<a;i++){
if(a%i===0){ //把每个数对应的因数存在数组arr中
arr[j]=i
j++
}
}
for(i=0,sum=0;i<arr.length;i++){
sum+=arr[i] //计算这个数因数之和
}
//判断是否为完数
if(a===sum){
console.log(a)
}
arr.length=0 //清空数组中的值,继续寻找
}
2.结果展示
3.注意
一定要记得每次清空数组,否则前面因数数量>后面因数的数量时,有部分值无法被覆盖,会导致运算结果错误
第18题:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?
1.代码
for(var i=1,h=100,s=0;i<=10;i++){
s+=2*h
h/=2
// console.log(h)
}
s=s-100-h
console.log(h,s)
2.结果展示
第19题:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个第二天早.上又将剩下的桃子吃掉-一半,又多吃了一个。以后每天早上都吃了前一一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一一个桃子了。求第一天共摘了多少。
1.代码
function fn(n){
if(n===1){
return 1
}
return (fn(n-1)+1)*2
}
console.log(fn(10))
2.结果展示
3.注意
递归最重要的就是条件啦,这里虽然它第10天是剩1个桃,但本质上还是每天吃一半零1个的重复,10是个计数作用,所以我这边算的时候是反着算的,于题目有些含义上的不符,觉得不合适的可以改一下条件
但是我觉得我这个可以算更多天,比如这个吃法吃了12天,那么第一天多少桃,直接传参12就好,所以看个人理解啦
第20题:两个乒乓球队进行比赛,各出三人。甲队为ab,c三人,乙队为xy;z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。
1.代码
var x='x'.charCodeAt()
var y='y'.charCodeAt()
var z='z'.charCodeAt()//找出x,y,z的ascii码依次遍历
for(var i=x;i<=z;i++){
for(var j=x;j<=z;j++){
for(var k=x;k<=z;k++){
if(i==x ||i==j|| k==x || k==z || i==k ||j==k){//ijk之间也不能相等,不能自己和自己比
continue
}
//将ASCII转为字母
console.log( 'a的对手是:'+String.fromCharCode(i) )
console.log( 'b的对手是:'+String.fromCharCode(j) )
console.log( 'c的对手是:'+String.fromCharCode(k) )
}
}
}
2.结果展示
第21题:有一分数序列: 2/1, 3/2, 5/3, 8/5,13/8, 21/13… 求出这个数列的前20项之和。
1.代码
function fn(n){
let a=2
let b=1
let sum=0
//第一个数单独考虑
if(n==1){
return sum += a/b
}else{
//后面的每一个数的分母都是前一个数的分子,分子是前一个数的分子分母之和
for(let i=2;i<=n;i++){
let t=a
a=a+b
b=t
sum += a/b
}
}
//因为第一个数单独考虑,所以如果数列项数大于等于2项时,要加上第一个数的数值
return sum+2
}
console.log(fn(20))
2.结果展示
3.注意
n=1时,要用return,否则后面的代码顺序执行,会出现错误
另外健壮性不够.
需考虑负数,0,非数值型数据,后面的程序也都有此问题,再添加判断即可
这里为了图快,类似的代码没有写
第22题:求1+2!+3!+…+20!的和。
1.代码
sum=0
for(j=1;j<=20;j++){
//每次都要给s的值置1,防止叠加错乱
var s=1
for (var i=1;i<=j;i++){
//算这个数的阶乘
s*=i
console.log(s)
}
sum+=s
}
console.log(sum)
2.结果展示
第23题:利用递归方法求5!。
1.代码
function fn(a){
if(a===1){
return 1
}
return fn(a-1)*a
}
console.log(fn(5))
2.结果展示
第24题:利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来。
1.代码
function fn(a){
if(a.length===1){
return a
}
// 计数+slice截取字符串并返回截取的部分
return a.charAt(a.length-1)+fn(a.slice(0,a.length-1))//从后往前取字符串,
}
var a='abcdef'
console.log(fn(a))
2.结果展示
第25题:有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?
1.代码
function fn(a){
if(a===1){//第一个人10岁
return 10
}
return fn(a-1)+2//本人比上一个大2岁
}
console.log( '第5个人'+fn(5)+'岁' )
2.结果展示
第26题:给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。
1.代码
function fn(num){
var num=String(num)//数值转为字符串
arr=num.split('')//将字符串转为数组
var revnum=arr.reverse()//翻转数组API
console.log(`${num}是${arr.length}位数,逆序打印各位数字是${revnum}`)
}
fn(12146786159)
2.结果展示
3.注意
测试的时候数字打多了,不影响
第27题:一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同
1.代码
function fn(num){
var arr=String(num).split('')
var revnum=Number(arr.reverse().join(''))
//回文数对称,所以数值全部翻转,即可将原来的个位与万位比较
//因为是数值,所以直接比较大小即可
if(num===revnum){
console.log( num+'是回文数' )
}else{
console.log( num+'不是回文数' )
}
}
fn(12344321)
2.结果展示
第28题:请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样, 则继续判断第二个字母
//Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday
//77 84 87 84 70 83 83
1.代码
var d=prompt('请输入星期的第一个字母:')
var s=d.charCodeAt()//charCode只识别第一个字母,所以只关注输入的第一个字母即可
//alert(s)
if(s>=97 || s<=122){//小写字母转为大写字母
s-=32
//alert(s)
}
//65-90 32
switch(s){
case 77:
alert('星期一')
break
case 84:
var k=prompt('请输入星期的第二个字母:')
var k=k.charCodeAt()
if(k>=97 || k<=122){//小写字母转为大写字母
k-=32
}
if(k==85){
alert( '星期二' )
}else if(k==72){
alert( '星期四' )
}else{
alert( '非法输入,请您重新输入' )
}
break
case 87:
alert('星期三')
break
case 70:
alert('星期五')
break
case 83:
var k=prompt('请输入星期的第二个字母:')
var k=k.charCodeAt()
if(k>=97 || k<=122){//小写字母转为大写字母
k-=32
}
if(k==65){
alert( '星期六' )
}else if(k==85){
alert( '星期天' )
}else{
alert( '非法输入,请您重新输入' )
}
break
default:
alert( '非法输入,请您重新输入' )
}
网页代码:
<script src="28.js" charset="utf-8"></script>
2.结果展示
3.注意
这里懒得改了,所以把网页代码也敲进去,记得要在网页打开,别用控制台哦
这里用ascii码做为case的选择判定
第29题:对10个数进行排序。
1.代码
API
var arr=[1,23,5,67,78,97,22,13,9,8]
arr.sort( (a,b)=>a-b )
console.log(arr)
//for循环,冒泡排序
for(var i=0;i<arr.length-1;i++){
for(var j=0;j<arr.length-i-1;j++){
if(arr[j]>arr[j+1]){//最大值会被交换到最后
var a=arr[j]
arr[j]=arr[j+1]
arr[j+1]=a
}
}
}
console.log(arr)
2.结果展示
3.注意
排序方式太多啦,没事练练手也好
第30题:求一个33矩阵对角线元素之和。(nn阶计算方法相同)
1.代码
var arr=[[2,2,3], //00,01,02 辅助寻找规律
[4,5,6], //10,11,12
[7,8,9]] //20,21,22
var sum1=0
var sum2=0
for(var i=0;i<arr.length;i++){
for(var j=0;j<arr.length;j++){
//下标相同的下对角线
if(i===j){
sum1 += arr[i][j]
}
//下标和相等且等于长度-1的上对角线
if( (i+j) == arr.length-1){
sum2 += arr[i][j]
}
}
}
console.log(sum1+sum2)
2.结果展示
第31题:有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。
1.代码
var arr=[1,2,3,4,5,7,8,9,10,11]
var n=-6
var a=0
//尾插法
if(arr[0]>n){//判断是否比第一个值小,小于第一个值就替换第一个值的位置
a=arr[0]
arr[0]=n
n=a
}
arr[arr.length]=n
for(var i=0;i<arr.length;i++){
var k=arr[arr.length-1]//暂存最后一个元素的值,因为要进行交换
if(k>=arr[i] && k<=arr[i+1]){//正好在两者之间时的位置
for(var j=i+1;j<arr.length;j++){//j从交换后的位置开始计算
a=arr[j]
arr[j]=arr[arr.length-1]
arr[arr.length-1]=a
}
}
}
console.log(arr)
2.结果展示
3.注意
这里用排序API两行代码就出来了,我傻…当时没想到
这里要注意尾插法如果第一个比插入的值还要大的话,就需要额外考虑,我这里是直接做了个交换
第32题:将一个数组逆序输出
1.代码
var arr=[1,2,3,4,5,6,7]
//数组转为字符串
arr=arr.reverse()//翻转数组API
console.log(arr)
2.结果展示
3.注意
API时刻谨记,真好用呀
第33题:打印出杨辉三角形
1.代码
function fn(n){
//创建数组对象
n=n-1
var arr=[]
for(i=0;i<=n;i++){
arr[i]=new Array()
for(var j=0;j<=i;j++){
if(j==0 || j==i){
arr[i][j]=1
}else{//上面的条件自动筛除了第1,2行
arr[i][j]=arr[i-1][j-1]+arr[i-1][j]
}
}
}
for(var i=0;i<n;i++){
var b=''
for(var j=0;j<parseInt((n-i+1)/2);j++){//+1只是为了让三角形第一行的位置好看一丢丢,虽然还是不好看
b+=' '
}
//逐行打印
console.log(b+arr[i])
}
}
fn(20)
2.结果展示
第34题:输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组。
1.代码
var arr=[12,134,11,4,65,76,8,9,111,10]
var max=arr[0]
var min=arr[0]
for(var i=0;i<arr.length;i++){//最大的与第一个元素交换
if(max<arr[i]){
max=arr[i]
arr[i]=arr[0]
arr[0]=max
}
}
for(var j=0;j<arr.length;j++){//最小的与最后一个元素交换
if(min>arr[j]){
min=arr[j]
arr[j]=arr[arr.length-1]
arr[arr.length-1]=min
}
}
console.log(arr)
2.结果展示
3.注意:
我这里因为得到一个相对最大(小)值就与开头(结尾)元素进行了交换,所以不仅改变了最大最小和第一个最后一个的位置,中间部分元素也会发生变动,
这里题目没硬性规定其他元素位置
如果想不变动,可以用一个变量存一下最大(小)值的坐标,全部遍历结束后再交换
第35题:有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数
1.代码
var arr=[1,2,3,4,5,6,7,8,9]
function fn(m){
var arr1=arr.splice(-m)//返回被截掉的数
var arr2=arr1.concat(arr)//将返回的数拼接的剩余数的前面
console.log(arr2)
}
fn(5)
2.结果展示
第36题:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
1.代码
function fn(n){
var arr=[]
var a=0
for(var i=0;i<n;i++){
//几个人玩就将几个人从1开始放入数组,可以对应自己的号数
arr[i]=i+1
}
//如果数组值为1,也就是剩余人数不为1,一直执行
while(arr.length!==1){
for(var count=1;count<=3;count++){
//逢3删除数组开头的一个元素
if(count==3){
arr.shift()
}
a=Number(arr.splice(0,1))//取第一个元素放入变量a中
arr.push(a)//将a压入数组最后一个元素,完成循环
}
}
console.log(`留下的是原来第${arr[0]}的那位`)
}
fn(10)
2.结果展示
第37题:写一个函数,求一个字符串的长度,在main函数中输入字符串,并输出其长度。
1.代码
function main(str){
console.log(str.length)
}
main('gfuiheow')
2.结果展示
第38题:编写一个函数,输入n为偶数时,调用函数1/2+1/4+…+1/n,当输入n为奇数时,调用函数1/1+1/3+…+1/n
1.代码
function fn(n){
var sum=0
var str=''
if(n%2===0){//n为偶数时
for(var i=2;i<=n;i++){
if(i%2===0){//分母都是2的倍数
str += (`1/${i}`)+'+'
sum += 1/i
}
}
}else{//n为奇数时
for(var i=1;i<=n;i++){
if(i%2!==0){
str += (`1/${i}`)+'+'
sum += 1/i
}
}
}
var arr=str.split('')
arr.splice(-1)
str=arr.join('')//去掉最后一个加号
console.log(str+'='+sum)
}
fn(10)
2.结果展示
第39题:海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子平均分为五份,多了一个,这只猴子把多的一个扔入海中,拿走了一份。第二只猴子把剩下的桃子又平均分为五份,又多了一个,它同样把多的一个扔入海中,拿走了一份,第三、第四、第五只猴子都是这样做的,问海滩上原来最少有多少个桃子?
1.代码
for(var i=0;;i++){
var tao1=i
if(tao1%5==1){
var tao2=tao1-1-(tao1-1)/5
if(tao2%5==1){
var tao3=tao2-1-(tao2-1)/5
if(tao3%5==1){
var tao4=tao3-1-(tao3-1)/5
if(tao4%5==1){
var tao5=tao4-1-(tao4-1)/5
if(tao5%5==1){
console.log(`海滩上原来最少有${tao1}个桃子`)
break;
}
}
}
}
}
}
2.结果展示
3.注意
我觉得这题可以用递归,但是我没想明白,烦请大佬指教
我知道这样做很呆,但是别的我都不理解
第40题:809*??=800*??+9*??+1其中??代表的两位数.8*??的结果为2位数,9*??的结果为3位数。求??代表的两位数,及809*??后的结果
1.代码
var a=0
for(var i=1;i<=9;i++){
for(j=0;j<=9;j++){
a=10*i+j
//console.log(a)
if((8*a>=10&&8*a<100) && (9*a>=100&&9*a<1000)){
console.log(`两位数是:${a}`)
console.log(`809*${a}的结果是:${a*809}`)
}
}
}
2.结果展示
3.注意
这个+1我不能理解,+1后这个数就不存在啦,数学上感觉是不通的,不知道哪位高人可以给指点一下不
第41题:八进制转换为十进制
1.代码
var a=123456
a=a.toString()
var arr=a.split('')
var sum=0
for(var i=0;i<arr.length;i++){
//用当前位置上的数*8的数位-1次方
sum += Number(arr[i])*(8**(arr.length-i-1))
}
console.log(sum)
2.结果展示
第42题:求0——7所能组成的奇数个数。
1.代码
var count=0
for(var a=0;a<=7;a++){
for(var b=0;b<=7;b++){
for(var c=0;c<=7;c++){
for(var d=0;d<=7;d++){
for(var e=0;e<=7;e++){
for(var f=0;f<=7;f++){
for(var g=0;g<=7;g++){
for(var h=0;h<=7;h++){
var str=a,b,c,d,e,f
var num=Number(str)
if(a%2===0){
count++
}
}
}
}
}
}
}
}
}
console.log(count)
2.结果展示
3.注意
0打头的数字也不会影响计算,所以直接组合算就可以啦
第43题:一个偶数总能表示为两个素数之和。
1.代码
var a=[]
var count=0
function fn(n){
if(i<4){
return console.log('非法的数')
}
if(n%2!==0){
return console.log(n+'不是偶数')
}
/***********************************/
for(var i=2;i<=n;i++){//1不是素数,所以从2开始
count=0
for(var j=2;j<i;j++){//求出小于n的所有素数
if(i%j===0){
count++
}
}
if(count==0){//将小于n的所有素数压入数组
a.push(i)
}
}
/*遍历数组,找到和为n的两个素数*/
for(var i=0;i<a.length;i++){
for(var j=i;j<a.length;j++){
if( a[i]+a[j]==n ){
console.log(a)
console.log(`${a[i]}+${a[j]}=${n}`)
}
}
}
}
fn(18)
2.结果展示
3.注意
2是最小的素数,且为偶数,所以单独考虑,对非法数的判断从4开始
第44题:判断一个素数能被几个9整除
1.代码
function fn(n){
var str=''
if(typeof(n)!='number' || n==0 ||n==1){
return console.log(n+'是非素数')
}
if(n===2){
return console.log(n+'不能被9整除')
}
//从2开始判断素数,所以对2单独考虑
for(var i=2;i<n;i++){
//先判断这个数是不是素数
if(n%i===0){
return console.log(n+'不是素数')
}
}
for(var j=1;j<=20;j++){
str += '9'//从9到20个9
if(Number(str)%n===0){
return console.log(n+'能被'+str.length+'个9整除')
}
}
console.log('20个9仍不能整除'+n)
}
fn(1)
fn(2)
fn(0)
fn(97)
fn('abc')
2.结果展示
第45题:某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的,加密规则如下:每位数字都加.上5,然后用和除以10的余数代替该数字,再将第1位和第四位交换,第二位和第三位交换。
1.代码
function fn(pwd){
var str=pwd.toString()
var arr=str.split('')
var arr1=[]
var arr2=[]
var j=0
var k=0
for(var i=0;i<arr.length;i++){
arr1[j] = Number(arr[i])+5 //每个数字+5
arr2[k]=arr1[j]%10 //除以10取余
j++
k++//加完后k后移,对应位置没有值
}
//交换1,4位置
k=arr2[0]
arr2[0]=arr2[3]
arr2[3]=k
//交换2,3位置
j=arr2[1]
arr2[1]=arr2[2]
arr2[2]=j
str=arr2.join('')
console.log(str)//以字符串格式输出
}
fn(6789)
2.结果展示
1-6前面有分开写,为了方便查阅,这里只展示代码,略详细的翻一下前面的博客吧
第1题:1,2,3,4组成不同不重复的三位数
for(var i=1;i<5;i++){
for(var j=1;j<5;j++){
for(var k=1;k<5;k++){
if(i!=j && i!=k && j!=k){
console.log(i,j,k)}
}
}
}
第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%提成,从键盘输入当月利润,求应发放奖金总数?
var salary = 1000001
var bonus=0
if(salary<100000){
bonus=salary*0.1
}
else if(salary>=100000 && salary<200000){
bonus=(salary-100000)*0.075+100000*0.1
}
else if(salary>=200000 && salary<400000){
bonus=100000*0.075+100000*0.1+(salary-200000)*0.05
}
else if(salary>=400000 && salary<600000){
bonus=100000*0.075+100000*0.1+200000*0.05+(salary-400000)*0.03
}
else if(salary>=600000 && salary<1000000){
bonus=100000*0.075+100000*0.1+200000*0.05+400000*0.03+(salary-600000)*0.015
}
else{
bonus=100000*0.075+100000*0.1+200000*0.05+400000*0.03+600000*0.015+(salary-1000000)*0.01
}
console.log(bonus)
第3题:一个整数,它加上100后是一-个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
for(var i=1;i<=100000;i++){
var a = parseInt(Math.sqrt(i+100))
var b = parseInt(Math.sqrt(i+168))
if(a*a==(i+100) && b*b==(i+168)){
console.log(i)
}
}
第4题:输入某年某月某日,判断这一天是这一年的第几天?
var year =2000 ,month=3, day=7,days=0
var monthday=[31,28,31,30,31,30,31,31,30,31,30,31]
for(var i=0;i<month-1;i++){
days+=monthday[i]
}
days+=day
if(month>2 &&(year%4==0&&year%100!=0 || year%400==0)){
days++
}
console.log(`${year}年${month}月${day}日是这一年的第${days}天`)
第5题:输入三个整数x,y,z,请把这三个数由小到大输出。
var x = 2
var y = 1
var z = 3
var a=0;
if(x>y){
a=x
x=y
y=a
}
if(x>z){
a=x
x=z
z=a
}
if(y>z){
a=y
y=z
z=a
}
console.log(x,y,z)
第6题:用*号输出字母C的图案。
for(var i=1;i<6;i++){
var a = ''
if(i==1 || i==5){
for(var j=1;j<5;j++){
a+='* '
}
}else{
a='* '
}
console.log(a)
}
总结
欢迎指正与建议