目录
做练习写代码时要多思考思考,想想有没有更简便的写法
一、练习1(求100以内3的倍数)
练习:求100以内所有3的倍数(求它们个数和总和)
方法一:
<script>
//创建计数器
let count = 0
//用来存储计算结果(累加结果)
let sum = 0
for(let i=0;i<100;i++){
//获取3的倍数
if(i % 3 == 0){
count++
sum = sum + i
}
}
console.log(`100以内3的倍数的一共有${count}个,总和为${sum}`)
</script>
方法二:(直接加3)
<script>
//创建计数器
let count = 0
//用来存储计算结果(累加结果)
let sum = 0
for(let i=3;i<=100;i+=3){
count++
sum = sum + i
}
console.log(`100以内3的倍数的一共有${count}个,总和为${sum}`)
</script>
输出的结果:100以内3的倍数的一共有34个,总和为1683。
二、练习2(求水仙花数)
练习:求1000以内的水仙花数
水仙花数:一个n位数(n>=3), 如果它各个位上数字的n次幂之和还等于这个数,那么这个数就是一个水仙花数。如153=1^3+5^3+3^3.
方法一:
<script>
for(let i=100;i<1000;i++){
// 求百位数字
let a = parseInt(i / 100)
//求十位数字
let b = parseInt((i % 100) / 10)
//或者b = parseInt((i - a*100)/10)
//求个位数字
let c = i % 10
//判断是否是水仙花数
if(i == a**3+b**3+c**3){
console.log(i)
}
}
</script>
方法二:
字符串可以通过索引获得其对应内容,如a=’hello’,a[0]就是h, a[1]是e.
<script>
for(let i=100;i<1000;i++){
let strI = i + ""//转换为字符串
//无需转换为数值,运算时可自动转换为数值
if(i == strI[0] ** 3 + strI[1] ** 3 + strI[2] ** 3){
console.log(i)
}
}
</script>
输出结果:153,370,371,407.
三、练习3(判断质数)
练习:获取用户输入的整数(暂时不考虑输错的情况)
然后编写代码检查这个数字是否是质数,并打印结果
质数:一个数如果只能被1和它自身整除,那么这个数就是质数。
1既不是质数也不是合数。
<script>
let num = +prompt("请输入一个大于1的数字")
//用来记录num的状态,默认是true,num是质数
let flag = true
for(let i=2;i<num;i++){
if(num % i == 0){
//如果num能被i整除,说明num一定不是质数
//当循环执行时,如果从来没有进入过判断(判断代码没有执行),说明num是质数
//如果判断哪怕只执行了依次,也说明num不是质数
flag = false
}
}
if(flag){
alert(`${num}是质数`)
}else{
alert(`${num}不是质数`)
}
</script>
四、循环嵌套
在循环中也可以嵌套其他的循环
当循环发生嵌套时,外层循环每执行一次,内层循环就会执行一个完整的周期
<script>
//这个for循环,可以用来控制图形的高度
for(let i=0;i<4;i++){
//创建一个内层循环来控制图形的宽度
for(let j=0;j<4;j++){
document.write('** ')//用 来设置星号之间的空格,
//因为在JS中多个空格仍表现出一个空格。
}
document.write('<br>')//在网页文档中换行使用<br>
}
</script>
注意,输出的星号是在网页中打印输出,所以应使用<body>中的换行标签<br> 。
<script>
//外层循环,用来控制图形的高度
for(let i=0;i<5;i++){
//内层循环,用来控制图形的宽度
for(let j=0;j<i+1;j++){
document.write("* ")
}
document.write("<br>")//在网页文档中换行使用<br>标签
}
</script>
五、练习(99乘法表)
练习:在网页中打印99乘法表(循环嵌套的练习)
<style>
span{
display:inline-block;
width:80px;
}
</style>
<script>
//创建一个外层循环,控制图形的高度
for(let i=1;i<10;i++){
//创建内层循环控制图形的宽度
for(let j=1;j<i+1;j++){
document.write(`<span>${j}*${i}=${i*j}</span>`)//在网页中打印,使用<span>标签
//将等式写在span中,并对其进行设置,以使更整洁对齐
}
//打印换行
document.write("<br>")
}
</script>
注意:使用span,并对span进行设置,以保证对齐
六、练习(100以内的质数)
编写代码,求100以内所有的质数
<script>
for(let num=2;num<100;num++){
//检查num是否是质数
//创建一个变量,记录num的状态
let flag = true
//获取2-num之间的数
for(i=2;i<num;i++){
//判断num能不能被i整除
if(num % i == 0){
//进入判断,说明num不是质数,修改flag为false
flag = false
}
}
//判断结果
if(flag){
console.log(num)
}
}
</script>
七、break和continue
break:
– break用来终止switch和循环语句
– break执行后,当前的switch或循环会立刻终止
– break会终止离他最近的循环
<script>
for(let i=0;i<5;i++){
console.log(i)
for(let j=0;j<5;j++){
if(j == 1) break
console.log('内层循环',j)
}
}
</script>
continue:
– continue用来跳过当次循环
– continue会跳过离他最近的循环
<script>
for(let i=0;i<5;i++){
console.log(i)
for(let j=0;j<5;j++){
if(j === 1) continue
console.log('内层循环',j)
}
}
</script>
八、修改质数练习一
在开发中,除了实现功能外,还要考虑代码的执行性能(执行速度)。测试代码的执行性能(时间)通过在代码前加console.time(’名字‘)和代码结束后加console.timeEnd(’名字‘),可以获得代码的执行时间。如:
<script>
//开始一个计时器
console.time('质数练习:')
for(let num=2;num<100;num++){
let flag = true
for(i=2;i<num;i++){
if(num % i == 0){
flag = false
}
}
if(flag){
// console.log(num)
}
}
//停止计时器
console.timeEnd('质数练习:')
</script>
添加break,内层循环循环次数减少
<script>
//开始一个计时器
console.time('质数练习:')
for(let num=2;num<100;num++){
let flag = true
for(i=2;i<num;i++){
if(num % i == 0){
flag = false
//进入判断说明num一定不是质数,后续检查没有执行的必要
break
}
}
if(flag){
console.log(num)
}
}
//停止计时器
console.timeEnd('质数练习:')
</script>
九、修改质数练习二
修改内层循环的终止次数条件,对于判断质数,只需取到这个数的开方即可,无需取完所有比这个数的所有整数。
<script>
//开始一个计时器
console.time('质数练习:')
for(let num=2;num<100;num++){
let flag = true
//第二次优化,将i<num 改为i <= num ** 0.5
for(i=2;i<=num**0.5;i++){
if(num % i == 0){
flag = false
//进入判断说明num一定不是质数,后续检查没有执行的必要
break
}
}
if(flag){
console.log(num)
}
}
//停止计时器
console.timeEnd('质数练习:')
</script>
还可以优化,只对除2以外的其余奇数进行判断是否是质数即可。对于外层循环来说,是把100以内所有的整数都进行判断,但是除了2以外所有的偶数都不是质数,所以可以把2单独拿出来,然后从初始变量3开始,修改初始变量也以2进行递增然后判断。