js的一些较为常见的语句算法题
下面各题解法可能存在一些时间和空间复杂度问题,有些没有做到最优化,还请谅解!!!
1、用for循环实现10的阶乘。
//使用for循环方法解答 var num = 10 var sum = 1; var str = ''; for(var i=10;i>=1;i--){ sum *= i; if(i == 1){ str += i; }else{ str += i+'*'; } } console.log(num+'! = '+str+' = '+sum);
2、打印九九乘法表
for(var i=1;i<=9;i++){ var str = ''; for(var j=1;j<=i;j++){ str += i+'*'+j+'='+i*j+'\t'; } console.log(str); }
3、有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?【该处时间复杂度相对较大,代码仅供参考】
var n =10; var str = ''; for(var i=1;i<=n;i++){ for(var j=1;j<=n;j++){ if(j != i){ for(var k=1;k<=n;k++){ if(k != i && k != j){ str = str+i+j+k+'\t'; } } } } } console.log(str);
4、判断101-200之间有多少个素数,并输出所有素数(只能被1和它本身整除的自然数为素数)
// console.log(Math.sqrt(101)); //101开平方
var str = ''; var count = 0; for(var i=101;i<=200;i++){ var flag = true; for(var j=2;j<=Math.sqrt(i);j++){ if(i%j == 0){ //不是质数 var flag = false; break; //节省运算时间,后面循环不需要再执行了 } } if(flag){ str += i+'\t'; count++; } } console.log('101~200之间有'+count+'个素数\n分别为:\n'+str);
5、打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个“水仙花数”,因为153=1的三次方+5的三次方+3的三次方
// console.log(Math.pow(10,3)); //计算10的三次方
for(var i=100;i<1000;i++){ var hundred = parseInt(i/100); var ten = parseInt((i-hundred*100)/10); var unit = i-hundred*100-ten*10; // console.log('................'); var sum = Math.pow(hundred,3)+Math.pow(ten,3)+Math.pow(unit,3); if(sum == i){ console.log(i); } }
6、将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。
var num = 90; var str = ''; for(var i=2;i<=num;i++){ // console.log(i); if(num == i){ str += i; } while(num != i){ if(isPrime(i)){ // console.log(i); if (num%i == 0) { num /= i; str += i+'*'; }else{ break; } }else{ break; } } } console.log(str); //判断一个数是否为素数 // console.log(isPrime(4)); 测试isPrime()函数 function isPrime(n){ var flag = true; for(var i=2;i<=Math.sqrt(n);i++){ if(n%i == 0){ flag = false; } } return flag; }
7、求任意两个正整数的最大公约数和(GCD)和最小公倍数(LCM)
/* 辗转相除法的算法为:首先将 m除以 n(m>n)得余数 r,再用余数 r 去除原来的除数, 得新的余数,重复此过程直到余数为 0时停止,此时的除数就是m 和 n的最大公约数。 求 m和 n的最小公倍数: m和 n的积除以(m和 n 的最大公约数)。 */ function gcdLcm(m,n){ var mn = m*n; var r = m%n; while(r != 0){ r = m%n; m = n; n = r; } console.log('最大公约数为:'+m+'\t最小公倍数为:'+mn/m); } gcdLcm(100,40)
8、求1000以内的完全数(若一个自然数,恰好与除去它本身以外的一切因数的和相等,这种数叫做完全数。)
// var sum = 0; for(var i=1;i<=1000;i++){ var sum = 0; for(var j=1;j<=i;j++){ if(i%j == 0 && i!=j){ sum += j; // console.log(sum); } } if(sum == i){ console.log(i); } }