目录
题目:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。
题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
题目:打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个“水仙花数”,因为153 = 1的三次方+5的三次方+3的三次方。
输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
求s = a + aa + aaa + aaaa + aa...a的值,其中a是一个数字。例如2 + 22 + 222 + 2222 + 22222(此时共有5个数相加),几个数相加由键盘控制。
题目:一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2+3.编程找出1000以内的所有完数。
题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?
题目:有一分数序列:2 / 1, 3 / 2,5 / 3,8 / 5,13 / 8,21 / 13...求出这个数列的前20项之和。
题目: 给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。
题目:判断是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。
JavaScript解决:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。
<script>
// 将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。
// 分析: 首先要明白质因数的概念 质因数: 分解成质数的乘积
// 指定循环跑不掉 首先要输出质数 然后循环
// 输入一个整数判断是指数进行整数与质数相同是边界条件进行输出
// 质数判断
function isPrime(n) {
// 首先判断n是不是<=1 <=1 不是素数 质数从2开始
if (n <= 1) { return false } //不是素数直接返回false
// 2~n-1 之间的所有整数
for (let i = 2; i < n; i++) { // 如果n除以 2~n-1 之间的所有整数 只要有一个能除尽,则为非素数
if (n % i === 0) { return false }
} // 循环结束也没有符合条件的 说明是质数
return true
}
function f(n) {
let arr = [] // 声明一个数组 保存符合条件的质数
function fn(n) { // 进行
for (let i = 1; i <= n; i++) {
if (isPrime(i) && (n % i === 0)) { //i 是 1~n之间的素数 i既满足质数,又符合能被n整除
n = n / i; // 先改变变量
arr.push(i) // 能够进来这一步 证明i是约数,添加到数组里面
if (n !== 1) fn(n) // 进行判断是否符合继续条件
break; // 终止循环 不能用return
}
}
return arr // 返回数组
}
fn(n) // 调用fn函数
let result = n + '=' + arr.join('*') // 数组转换为字符串并用*号链接
return result
}
</script>
题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
// 题目分析 组成一个三位数 只有1234四个数 小于5
// 用到for循环 并且 个十百的数字不能重复
var i, j, k, n = 0; //百十个
for (i = 1; i < 5; i++) {
for (j = 1; j < 5; j++) {
for (k = 1; k < 5; k++)
if (i != j && i != k && j != k) {
n++;
console.log(100 * i + 10 * j + k);
}
}
}
console.log('符合条件的个数为' + n + '个');
题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
// 首先要了解什么是完全平方数 可以分为两个相同的数相乘 例如 9可以为分为 3*3 那么9就是完全平方数
for (let i = 1; i < 2000; i++) { // i 是我们要得到的数
for (let j = 1; j < 1000; j++) {
if (i + 100 == j * j) { // i+100 符合 j*j 之后在进行循环k
for (let k = 1; k < 1000; k++) { // 循环k i+100+168 符合 k*k
if (i + 100 + 168 == k * k) {
console.log(i); // 以上条件都满足输出i
}
}
}
}
}
题目:输入某年某月某日,判断这一天是这一年的第几天?
function isDay() {
let d = prompt('请输入要查询的日期, 比如2022/12/11');
let d1 = new Date(d) // 保存输入时间
let arr = d.split('/') // 字符串转数组 split() 数组转字符串 join()
let d2 = new Date(`${arr[0]}/1/1`) // 那一年的第一天
let day = (d1.getTime() - d2.getTime()) / (1000 * 60 * 60 * 24) //时间戳是毫秒数转换为天数
return `今天是${arr[0]}的第${day + 1}天`
}
题目:输出9 * 9口诀。
// 有行有列双层for循环
for (let i = 1; i <= 9; i++) {
let result = '' //外层控制行
for (let j = 1; j <= i; j++) { //内层控制列
if (j === 3 && (i === 3 || i === 4)) {
result += ' ' // 美化对齐
}
result += j + '*' + i + '=' + j * i + ' '
}
console.log(result);
}
题目:要求输出国际象棋棋盘。
let str = '<table cellpadding="0" cellspacing="0">'; // 创建一个表格
let off = true;
for (let i = 1; i <= 8; i++) { //行
str += '<tr>'; // 生成表格行
for (let j = 1; j <= 8; j++) { //列 每一行的每一列
if (off) { // 因为有黑白格交替,所以用个条件判断
str += '<td class="td01"></td>'
off = !off
} else {
str += '<td class="td02"></td>'
off = !off
}
}
off = !off // 第一行结束后 反转
str += '</tr>'
}
str += '</table>' // 表格结束
document.write(str) // 书写文档流
题目:判断101-200之间有多少个素数,并输出所有素数。
// 先进性质数判断
function isPrime(n) {
if (n < 2) return false
for (let i = 2; i < n; i++) {
if (n % i === 0) return false
}
return true
}
// 循环101~200之间的所有数
for (let i = 101; i <= 200; i++) {
if (isPrime(i)) console.log(i + '是质数');
}
题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
// 从第三个月开始以后的每月兔子数量都是前两月之和 和斐波那契数列一样
function rabbit(n) {
if (n === 1 || n === 2) {
return 1
} else {
return rabbit(n - 1) + rabbit(n - 2)
}
}
// 先输出两年的
for (let i = 1; i <= 24; i++) {
console.log('第' + i + '个月的兔子数是:' + rabbit(i));
}
题目:打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个“水仙花数”,因为153 = 1的三次方+5的三次方+3的三次方。
// 分析题目
// 首先是三位数得出100~999这是范围
// 其次是每个位数的立方和等于本身这是条件 153 = 1**3 + 5**3 +3**3
for (let i = 100; i <= 999; i++) {
// 首先要获得每个位数的值
let bit = i % 10 //个位
let ten = parseInt(i / 10) % 10 //十位 JS中的除法不是保留整数
let hun = parseInt(i / 100) //百位
// 进行判断
// console.log(bit, ten, hun);
if ((bit ** 3 + ten ** 3 + hun ** 3) === i) {
console.log(i + "是水仙花数");
}
}
// 153 370 371 407
题目:输入两个正整数m和n,求其最大公约数和最小公倍数。
// 分析: 先了解最大公约数和最小公倍数的概念
// 最大公约数肯定比这两个数小,最小公倍数肯定被这两个数大 (也可能是本身)
// 首先判断m,n这两个的大小
// 然后最大公约数从小的数开始往更小的方向去找
// 最小公倍数从大的数王更大的方向去找
function fn(m, n) {
let max, min;
if (m > n) {
max = m
min = n
} else {
max = n
min = m
}
// console.log(max, min);
// 最小公倍数 从大的值开始找
while (true) {
if (max % m === 0 && max % n === 0) {
console.log('最小公倍数' + max);
break
}
max++
}
// 最大公约数从小的值开始找
while (true) {
if (m % min === 0 && n % min === 0) {
console.log('最大公约数' + min);
break
}
min--
}
}
fn(55, 66)
输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
// 分析: 第一步是把输入的字符串一个一个单独分出来
// 第二步进行判断,要知道怎么判断出是字母,数字或者其他
// 输入的数据都是字符型 字符进行判断是判断asc编码
// 第一步我想到了两种方法
// 一个是str[i] // i是下标 需要用到for循环 或者用charAt(i)方法
// 第二种是 for of迭代 也可以实现 下面这两种方法实现一下
function isChar1() {
// prompt() 浏览器会弹出一个输入框
let str = prompt('请输入')
// 需要统计数量
let string = 0, number = 0, symbol = 0;
for (let i = 0; i < str.length; i++) {
// 判断是不是字母 a~z A~Z
if (str[i] >= 'a' && str[i] <= 'z' || str[i] >= 'A' && str[i] <= 'Z') {
string++
} else if (str[i] >= '0' && str[i] <= '9') { //判断数字
number++
} else {
symbol++
}
}
return ('字母有' + string + '个,数字有' + number + '个,其他符号有' + symbol + '个')
}
// 第二种方法 for of
function isChar2() {
// prompt() 浏览器会弹出一个输入框
let str = prompt('请输入')
// 需要统计数量
let string = 0, number = 0, symbol = 0;
// 用for of遍历
for (let k of str) { // k 是每一个元素
if (k >= 'a' && k <= 'z' || k >= 'A' && k <= 'Z') {
string++
} else if (k >= '0' && k <= '9') { //判断数字
number++
} else {
symbol++
}
}
return ('字母有' + string + '个,数字有' + number + '个,其他符号有' + symbol + '个')
}
求s = a + aa + aaa + aaaa + aa...a的值,其中a是一个数字。例如2 + 22 + 222 + 2222 + 22222(此时共有5个数相加),几个数相加由键盘控制。
// 分析 先输入一个数,再输入一个项
// 首先要理解怎么输出 2 22 222 2222 这种形式的数
function fn16() {
let num = prompt('请输入一个数0~9') // 输入的是字符串类型 加法计算时要注意
let times = prompt('请输入次数')
let sum = 0 // 总值
let temp = 0
let str = '' // 保存住后面 2+22+222...这种形式
for (let i = 1; i <= times; i++) {
temp = temp * 10 + num * 1
// 进行判断第一次没有 * 号
i === 1 ? str += temp : str += '*' + temp
sum += temp
}
return (sum + '=' + str)
}
题目:一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2+3.编程找出1000以内的所有完数。
// 分析: 首先要理解因子的概念, a能后整除b 则b是a的一个因子 本身也是自己的因子
// 完数: 所有真因子之和(因子出去本身)
// 先判断一个数是不是完数,再用循环
// 声明一个临时变量temp,找出所有因子,每找到一个temp和它相加
// 最后判断temp和输入的数是否相等
function fn17() {
let arr = [] // 保存所有符合条件的数
for (var i = 1; i <= 1000; i++) {
let temp = 0 // 所有因子和
let str = '' // 保存因子: 1+2+3这种形式
for (var j = 1; j < i; j++) { // 循环 i 以下所有的数
if (i % j === 0) { // 如果 i 能除尽 则进行下一步操作,否则循环继续
temp += j // 每次符合条件都相加,最后判断真因子相加和是否等于本身
j === 1 ? str += j : str += '+' + j // 第一次没有 '+' 号
}
}
if (temp === i) { // 一个数循环结束,进行判断是否是完数
arr.push(i) // 是 添加到数组里
console.log(j + '=' + str) // 打印 6 = 1+2+3 这种形式
}
}
return arr // 返回数组
}
题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?
// 分析: 反弹 经过
// 变量:i m n m = 100/i/2 n = 100 + 2*m
// 第一次: 50 100
// 第二次: 25 200 = 100 + 50 + 50
// 第三次: 12.5 250 = 100 + 50 + 50 + 25 + 25
// 第四次: 6.25 275 = 100 + 50 + 50 + 25 + 25 + 12.5 + 12.5
//
function ballBounces(num) {
if (num === 0) return 0
let m = 100
let n = 0
let i = 0
do {
i++
m /= 2
i > 1 ? n += + 4 * m : n = 100
} while (i < num)
let arr = []
arr.push(m, n)
return arr
}
console.log(ballBounces(10));
题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个 第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。
// 分析: 倒着来算 (n/2)-1 = 1 n = (1+1)*2 ((n/2)-1)/2-1
// 第十天 1
// 第九天 4 (1+1)*2
// 第八天 10 (4+1)*2
// 第七天 22 (10+1)*2
// 这样看的话 第九天用到了第十天的数,可以用递归 边界条件是第十天的1个桃子
function monkey1(n = 1) { // 从第一天算
if (n === 10) {
return 1
} else {
return (monkey1(n + 1) + 1) * 2
}
}
console.log(monkey1());
function monkey2(n = 10) { // 从第十天算
if (n === 1) {
return 1
} else {
return (monkey2(n - 1) + 1) * 2
}
}
console.log(monkey2());
题目:两个乒乓球队进行比赛,各出三人。甲队为a, b, c三人,乙队为x, y, z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x, z比,请编程序找出三队赛手的名单。
// 分析: c : y a : z b : x
function fn20() {
let arr = ['x', 'y', 'z']
for (let a = 0; a < arr.length; a++) {
for (let b = 0; b < arr.length; b++) {
if (a != b) {
for (let c = 0; c < arr.length; c++) {
if (c != 0 && c != 2 && a != 0 && a != c && b != c) {
return `a vs ${arr[a]},b vs ${arr[b]},c vs ${arr[c]}`
}
}
}
}
}
}
题目:有一分数序列:2 / 1, 3 / 2,5 / 3,8 / 5,13 / 8,21 / 13...求出这个数列的前20项之和。
// 分析 设a = 2 ,b = 1
// 2/1 3/2
// a/b
// a = a + b (上一个数的b) b = a(上个数的a) 所以这两行代码谁写前写后都不行
function fn21(n) { // n是前多少项 , 前20项 n就等于20
let a = 2 // 初始值
let b = 1
let sum = 0 // 总值
for (let i = 0; i < n; i++) {
let temp = b // 临时变量保存上一次b的值
sum += a / temp // 主逻辑 求和
b = a // 上个数的a赋值给b
a = a + temp
}
return sum // 输出前多少项的和
}
题目:求1+2!+3!+...+20!的和
function fn22(n) {
let sum = 0 // 总数
for (let i = 1; i <= n; i++) {
sum += fn23(i) // 调用阶乘
}
return sum
}
题目:利用递归方法求5!。
// 递归 5!=5*4*3*2*1
function fn23(n) {
if (n === 1) {
return 1 // 最后一个值是1
} else {
return n * fn23(n - 1) // n * (n-1) * (n-2)* ... *1
}
}
题目:输入一行字符串,以相反的顺序打印出来
function fn25(str) {
return str.split('').reverse().join('')
// split() 字符转数组
// reverse() 数组翻转
// join() 数组转字符
}
题目: 给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。
// 分析: 先判断是否符合不多于5位的正整数,
// 几位数: 转为字符串toString() 直接用长度length
// 逆序,循环
function fn26(n) {
if (n < 0 || n > 99999) {
return '不符合要求'
}
n = n.toString() // 数字不能使用长度,字符可以
let length = n.length
let str = ''
for (let i = 0; i < n.length; i++) {
str += n[n.length - 1 - i]
}
return `${n}是${length}位数,逆序为${str}`
}
// 第二种方法
function fn261(n) {
if (n < 0 || n > 99999) {
return '不符合要求'
}
let arr = n.toString().split('')
let length = arr.length
let str = arr.reverse().join('')
return `${n}是${length}位数,逆序为${str}`
}
题目:判断是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。
// 首先判断一定不是回文数的情况: 不能是负数,不能0开头所以10的倍数肯定不是回文数
function isPalindrome(x) {
//先判断x不是回文数的情况,负数肯定不是 10的倍数肯定不是
if (x < 0 || (x % 10 === 0 && x !== 0)) {
return false;
}
let y = 0;
while (x > y) {
y = y * 10 + x % 10;
x = Math.floor(x / 10);
}
return x === y || x === Math.floor(y / 10);
};
// 第二种方法 数字转字符串转化为数组,数组翻转再转化为字符串
function fn27(x) {
let arr = x.toString().split('')
let temp = arr.reverse().join('')
return x == temp
}