程序里面的‘脑筋急转弯’
数学中有一种特别常见的取巧算法,首尾相加,快速算和,高斯算法的背后小故事我都还记得清楚,真是让人羡慕的聪明脑子啊!所以我这种凡人只能通过苦思冥想才能发现程序与数学中的小陷阱和小技巧,记录下来做成标记,钉在我这平凡的人生号码牌上吧。
1. 使用while语句计算1到100的和。
首先给出我这平凡大脑错误的想法:
1 var i=0; 2 var sum=0; 3 while (i<=100){ 4 i++ 5 sum=sum+i; 6 } 7 console.log('1到100的和',sum); 8 //得到错误结果值5151
然后是我想不明白的正确写法:
1 var i=1; 2 var sum=0; 3 while(i<=100){ 4 sum+=i; 5 i++; 6 } 7 console.log('正确的结果--》',sum);//正确结果:5050
2. 获取某个字符在字符串中出现的次数。
正确的写法是这样的,我这愚笨的脑袋已经把自己犯错的点写下来了。o(╥﹏╥)o
1 var str="四十四,四十是四十" 2 var position=0;//记录出现的位置 3 var time=-1;//记录出现的次数,这里为什么是-1呢? 4 var index=0;//记录开始查找的位置 5 while(position!=-1){ 6 position=str.indexOf('四',index); 7 time++; 8 index=position+1; 9 } 10 console.log("共有几个字符串?--》",time)
3.生成指定位数的随机数,注意result的数据类型。
funtion randNumber(number){ var result=''; for(var i=0;i<number;i++){ result=result+Math.floor(Math.random()*10); } console.log(result);//注意,result本身是个字符串,不是number! }
4.生成指定位数的随机字符串。注意for循环中i的条件。
function randStr(digit){ var sourceStr='0,1,2,3,a,b,c'; arrStr=sourceStr.split(','); var result=''; var index=0; for(var i=0;i<=digit-1;i++){ index=parseInt(Math.random()*arrStr.length); result=result+arrStr[index]; } console.log(result); } randStr(3);
5.分位显示一个数据
注意:substr与substring的区别,前者是截取多少位,后者是截取的位置从哪里到哪里。
function convert(num){ //num:要进行分位显示的数字 var result=0; //result,最后显示出来的结果 var dec=""; //存储小数点和小数点后面的字符 if(isNaN(num)){ result=0; }else{ if(num.length<4){ result=num; }else{ pos=num.indexOf('.',1); //因为小数点不可能出现在第一位,所以开始寻找的顺序是从‘1’开始的 if(pos>0){ dec=num.substr(pos);//截取的小数点和小数点后字符 res=num.substr(0,pos);//整数部分,pos是长度,位置刚好等于长度,这个地方实际很精妙 }else{ res=num; //没有小数点,直接将数字赋予res } var tempResult=''; for(var i=res.length;i>0;i=i-3){ if(i-3>0){ tempResult=','+res.substr(i-3,3)+tempResult; }else{ tempResult=res.substr(0,i)+tempResult; } } result=tempResult+dec; } } return result; } var a=convert('33000000003.8'); console.log('a-->'+a);//显示结果:a-->33,000,000,003.8
6.获取从1到指定参数之间所有3的倍数;匿名函数的使用
var getOdd=function(num){ var arr=new Array(); // console.log(arr.constructor); for(var i=1;i<=num;i++){ if(i%3==0){ arr.push(i); continue; }else{ continue; } } return arr;//看到这个arr的位置了没有,注意,是在循环结束以后才return的 } var a=getOdd(9); console.log('a-->'+a);//a-->3,6,9 console.log(typeof a);//object console.log(a instanceof Array);//true
7.数字的分位显示
在看代码之前,首先你先给我记住,只有if(0)的时候,才是错误!即使里面是个负数,也是正确!
if(-1){ console.log('结果为true');//结果为true }