大家好,又见面了,我是你们的朋友全栈君。
1.获得两个数相除的商和余数
console.log(10/3); //商:3.3333
console.log(10%3);//余数:1
//获得两个数相除的商和余数
console.log(Math.floor(10/3)); //1 3
//Math.floor(向下取整)、Math.ceil(向上取整)、round(四舍五入)
console.log(0.1+0.2);//在js中,尽量避免做小数点运算
//如果有小数位的运算
var sum = (0.1*100+0.2*100)/100;
console.log(sum); //0.3
//其他数据类型---》数值类型:
"null/false/'' --> 0
undefined/object/'aaaaa'-->NaN
'123' '0123'-->123 10进制
'0x133'-->16进制
console.log(123+"123");//123123 字符串的拼接运算
console.log(123-"123");//0 隐式的数据类型转换 string-->number
console.log(-null);-0
console.log(-undefined);//NaN
console.log(-true,-false);//-1 -0
console.log(-"123");//-123
console.log(-"",-"abc",-"123abc",-"0123",-"0x12");//-0 NaN NaN -123 -18(十六进制)
2.递增递减操作符
var a=10;
var b=a++;//b=10 a=11
var c=++a;//a=12 c=12
var d=--a;//a=11 d=11
var e=a--;//e=11 a=10
console.log(a,b,c,d,e);
//console.log(++c---a+b--); //js error 语法错误
3.人民币大小写
//1.验证数据的合法性
//2.业务处理
var num='';
if(typeof num=='number' && num>=0 && num<=10){
if(num==0) console.log('零');
else if(num==1) console.log('壹');
else if(num==2) console.log('贰');
else if(num==3) console.log('叁');
else if(num==4) console.log('肆');
else if(num==5) console.log('伍');
else if(num==6) console.log('陆');
else if(num==7) console.log('柒');
else if(num==8) console.log('捌');
else if(num==9) console.log('玖');
else console.log('拾'); //else if(num==10) console.log('拾');
}else{
console.log('非法数值');
}
console.log('over');//结束执行
//数据不合法的情况
if(!(typeof num=='number')){
console.log('非数值类型的');
//return;在函数中的话有return
}else if(num<0 || num>10){
//else if(!(num>=0 && num<=10))
console.log('不是指定数字');
//return;
}
if(num==0){
console.log('壹');}
else if(num==1){
}
else if(num==10){
}
四、判断成年人和未成年人,以及成年人可以执行后序工作
function isCheng(age){
//验证数据的合法性
if(typeof age=='number' && age>0 && age<200){
if(age>18){
console.log("是成年人");
}else{
console.log("未成年人");
return;//判断结束,跳出循环 return后面不一定有值
}
}else{
//非法数值
return;//跳出循环,不在执行后面的
}
//后续业务处理--比如:办信用卡
console.log("办信用卡");
}
//测试
isCheng('abc');//非法数值
isCheng(300);//非法数值
isCheng(20);//是成年人 办信用卡
isCheng(10);//未成年人
//注意:一个函数中可以出现多次return,就算连着出现两个return都不会报错,但只会执行第一个return。
五、函数与普通变量提升的区别
普通变量提升<函数提升
console.log(print);// 全文查找print 发现它是一个函数,输出[Function print]
print();//调用函数
console.log(foo);// 全文查找print 发现它是一个值 但具体值不知道 输出undefined
//foo(); error! 此时foo不是一个函数
function print(){
console.log('print');}
var foo=function(){
console.log('foo');}
比如:下面看这个笔试题
console.log(say);//[Function say]
say();//可以执行 say
function say(){
console.log('say')};//函数
var say='name';
console.log(say);//name
//say();//error!
六、10的阶乘
1.使用arguments方法:
function result(num){
if(num<=1){
return 1;
}else{
return num*arguments.callee(num-1);
}
}
console.log("递归方法10!的结果为: "+result(10));
2.for循环(do…while 和while同理)
var result=1;
for(var i=1;i<11;i++){
result=result*i;
}
console.log("10的阶乘为:"+result);
//循环的三要素:初始值、判断条件(结束条件)、迭代器(条件对应的值发生改变)
七、arguments练习
// 求任意个数值的和
function add(){
var result = 0;
for(var key in arguments){
result += arguments[key];
}
return result;
}
console.log(add(1,2,3,4,5));
八、this练习
例题1
//var name='zs';//文件内的全局 name='zs' this.name=undefined
name='zs';//运行环境的全局 node global
function say(){
//console.log(this.name,name);//undefined zs
console.log(name,this.name);//zs zs
}
say();
例题2
var age=100;//文件
function print(){
var age=200;//函数
console.log(age,this.age);//函数 运行环境(node) //第一个age就近取 第二个还未定义,所以结果是undefined
//age 取数原则: 先就近取--》函数内取---》文件内取----》全局取
}
print();
var classmate='haha';
var stu={
classmate:'wwwww',
tell:function(){
//console.log(classmate); 本函数-》文件内-》全局
console.log(classmate,stu.classmate,this.classmate);//haha wwwww wwwww
}
};
//tell(); error! //此时的tell依赖于stu存在的,不能直接这样写
stu.tell();
console.log(stu.classmate);//wwwww
var s1=stu;//传值
例题3
//var name ='zs'; //如果用var 此时下面的name就是undefined
name='zs';
function sayName(){
console.log('函数内:',this.name);// 这里的this.name = xx.name
}
var p1={
name:'terry',
//sayName:sayName 相当与sayName1(key和value的值相等,可以只写一个)
sayName
};
var p2={
name:'robin',
sn:sayName
};
var p3={
sayName
}
p1.sayName();//terry
p2.sn();//robin
sayName();//zs
p3.sayName();//undefined 等价于 console.log(p3.name);
九、九九乘法表
在vim编辑器实现99乘法表,效果图如下:
//正序
var a="";
for(var i=1;i<=9;i++){
//倒99 for(var i=9;i>=1;i++)
for(var j=1;j<=i;j++){
if(i*j>9){
a+=j+"*"+i+"="+i*j+" ";
}else{
a+=j+"*"+i+"="+i*j+" ";
}
if(i==j){
a+="\n";
}
}
}
console.log(a);
十、重复数
例题:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
var num=0;//三位数
var count=0;//数量
// 1.先把三位数都列举出来,筛选
for(var i=1;i<5;i++){
for(var j=1;j<5;j++){
for(var k=1;k<=4;k++){
if(i!=j&&j!=k&&k!=i){
num=i*100+j*10+k;
console.log(num);
count++;
}
}
}
}
console.log("count="+count);//count=24
十一、素数
例题:判断101-200之间有多少个素数,并输出所有素数(只能被1和它本身整除的自然数为素数)
var count=0;
for(var i=101;i<200;i+=2){
//偶数能被2整除,肯定不是素数
for(var j=2;j<=i;j++){
if(i%j==0 && i!=j) break;//结束内层循环,外层的i肯定不是素数
else if(i%j==0){
//或者条件写 i==j都行
console.log(i);//打印该素数
count++;
}
}
}
console.log("prime number between 101 and 200 total count="+count);//count=21
十二、水仙花数
例题:打印出所有的水仙花数,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个“水仙花数”,因为153=1的三次方+5的三次方+3的三次方。
//方法一:
var a=0,b=0,c=0;
for(var i=100;i<=999;i++){
a=parseInt(i/100); //parseInt 解析字符串,并返回整型
b=parseInt(i%100/10);
c=i%10;
if((Math.pow(a,3)+Math.pow(b,3)+Math.pow(c,3))==i){
//Math.pow(a,b)表示a的b次幂
console.log(i);
}
}
//方法二:
var num=0;
for(var i=1;i<=9;i++){
for(var j=0;j<=9;j++){
for(var k=0;k<=9;k++){
num=i*100+j*10+k;
//if((Math.pow(i,3)+Math.pow(j,3)+Math.pow(k,3))==num)
if((i*i*i+j*j*j+k*k*k)==num){
console.log(num);
}
}
}
}
十三、正因式分解
例题:将一个正整数分解质因数。例如:输入90,打印出90=233*5。
/* 对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成: 1.如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。 2.如果n不等于k,k能被n整除,则应打印出k的值,并用n除以k的商,作为新的正整数n,重复执行第一步。 提示:如果一个自然数能写成两个自然数的乘积,那么这两个自然数就叫作原来那个数的因数。 */
function divide(num){
if(typeof num != 'number'){
console.log("Please input one number");
return;
}
var result=num+"="
var k=2;
while(k!=num){
if(num%k==0){
result+=k+"*";
num=num/k;
k=1;//因为if后面有k++,之后起始值还是k=2
}
k++;
}
result+=k;
console.log(result);
}
divide(90);
divide(9);
十四、公约数
例题:求任意两个正整数的最大公约数(GCD)和最小公倍数(LCM)
辗转相除法的算法为:首先将 m除以 n(m>n)得余数 r,再用余数 r 去除原来的除数,得新的余数,重复此过程直到余数为0时停止,此时的除数就是m 和 n的最大公约数。求 m和 n的最小公倍数: m和 n的积除以(m和 n 的最大公约数)。
function deal(num1,num2){
num1=parseInt(num1);
num2=parseInt(num2);
var a=num1,b=num2,c=0;
while(b!=0){
c=a%b;//c为两个数的余数
a=b;//被除数作为新的除数
b=c;//余数作为新的被除数
}
var gcd=a;//此时的除数就是最大公约数
var lcm=num1*num2/gcd;//最小公倍数
console.log(num1+"和"+num2+"的最大公约数是"+gcd+",最小公倍数是"+lcm);
}
deal(25,10);
十五、完全数
例题求1000以内的完全数(若一个自然数,恰好与除去它本身以外的一切因数的和相等,这种数叫做完全数。)
例如,6=1+2+3
28=1+2+4+7+14
496=1+2+4+8+16+31+62+124
先计算所选取的整数a(a的取值1~1000)的因数,将各因数累加于m,若m等于a,则可确认a为完全数。
//1000以内求完全数
var result="";
for(var i=1;i<1000;i++){
var sum=0;
//循环求因子,并且累加
for(var j=1;j<=i/2;j++){
if(i%j==0) sum+=j;
}
//判断因子之和是否等于数字本身
if(sum==i) result+=i+"\t";
}
console.log(result);
十六、计算累加阶乘
输出结果为 1!+2!+3!+4!+5!+6! = xxx
//方法一:
function addAndMul(num){
var addResult = 0;
var str = ''; //就是拼接的字符串 1!+2!+3!+4!+5!+6! =
for(var i=1;i<=num;i++){
//拼接字符串
str += i == num?i+'!=':i+'!+';
//计算i的阶乘
var mulResult = 1;
for(var j=i;j>0;j--){
mulResult *= j;
}
addResult += mulResult;
}
var result = str + addResult;
console.log(result);
}
addAndMul(6);
//方法二:
function addFun(num){
var result = 0;
var str = '';
if(num>=1){
for(var i=1;i<=num;i++){
str += i==num?i+'!=':i+'!+';
//result += mulFun(i);
result += Digui(i);
}
console.log(str+result);
}else{
console.log('请输入大于1的数值进行累加阶乘');
}
}
addFun(10);
十七、数组最大差值
方法一
Array.prototype.outputMaxPrice = function outputMaxPrice (array) {
/* 求一组数中最大值和最小值直接使用内置对象函数Math中的min()和max()方法即可。 注意,apply方法的第二个参数必须是一个数组,第二个参数用来替换原函数的参数 apply用于更改this指向,但这道题我们是不需要的,我们只需要将math.max及math.min应用到数组上即可 */
const item1 = Math.max.apply( null, array );
const item2 = Math.min.apply( null, array );
// const item1 = Math.max(10,5,11,7,8,9);
// const item2 = Math.min(10,5,11,7,8,9);
return item1 - item2;
}
const array = new Array;//创建实例
var arr = [10,5,11,7,8,9]
var result = array.outputMaxPrice (arr) // 6
console.log(result);
方法二
十八、 数组去重
注意:数组的十大经典算法,可以参照:https://www.jianshu.com/p/5c894e8b1f88
十九、排序
1.冒泡排序Bubble Sort
思路:
1.比较相邻的元素。如果第一个比第二个大,就需要互相交换。
2.对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
3.针对所有的元素重复以上的步骤,除了最后一个。
4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
具体实现:
let arr=[5,2,3,4,1];
// 第一轮比较:2,3,4,1,5
// 第二轮比较:2,3,1,4,5
// 第三轮比较:2,1,3,4,5
// 第四轮比较:1,2,3,4,5
let bubbleSort=(arr)=>{
// 控制比较的轮数
for(i=0;i<arr.length-1;i++){
//控制每轮的比较 这里用到的arr.length-i-1,是减少了一步操作,起到优化项目的作用。
for(j=0;j<arr.length-i-1;j++){
//当前项>下一项 ---》交换
if(arr[j]>arr[j+1]){
let temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp
}
}
}
return arr;
}
console.log(bubbleSort(arr));
2.选择排序 select Sort
思路:
第一次从待排序的数组元素中选出最小的一个元素,存放在序列的起始位置,然后再从剩余
的未排序元素中寻找到最小元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数
据元素的个数为零。选择排序是不稳定的排序方法。
let arr=[15,32,6,3,46,2,14,5,1];
let selectSort=(arr)=>{
for(i=0;i<arr.length-1;i++){
let temp=i;
for(j=i+1;j<arr.length;j++){
//当前项<前一项 arr[j]表示当前项 arr[temp]前一项
if(arr[j]<arr[temp]){
let swap = arr[j];
arr[j]=arr[temp];
arr[temp]=swap;
}
}
}
return arr;
}
console.log(selectSort(arr));
3.插入排序 insert Sort
思路:
插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素
除外(让数组多一个空间才有插入的位置),而第二部分就只包含这一个元素(即待插入元素)。在
第一部分排序完成后,再将这个最后元素插入到已排好序的第一部分中。
插入排序的基本思想是:每步将一个待排序的记录,按其值的大小插入前面已经排序的数据中适
当位置上,直到全部插入完为止。
let arr=[12,5,3,7,8,1,6,4];
let insertSort=(arr)=>{
for(i=0;i<arr.length-1;i++){
//n-1个数已经排好序
for(j=i+1;j>0;j--){
//n个数插入到前面的有序数列中
if(arr[j]>arr[j-1]){
//后一项小于前一项,需要交换位置
let temp=arr[j];
arr[j]=arr[j-1];
arr[j-1]=temp;
}
}
}
return arr
}
console.log(insertSort(arr));
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/147539.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...