美文网首页
前端菜鸟成长记(五)+answer

前端菜鸟成长记(五)+answer

作者: 貓咪是大王 | 来源:发表于2018-12-19 10:37 被阅读0次

今天就不跟大家卖关子了,直接放题目跟答案

把一个大于2的因数分解为两质数之和,比如12,输入12,输出5和7

我先把自己的写法给大家看看跟改进,最后会给大家看标准一点的答案

//判断一个数是否为质数
    function isPrime(num){
      for(let i=2; i<num; i++ ){
          if(num%i==0){
              return false
          }
          return true;
      }  
    }
    
    var n = prompt("请输入你想判断的数字");
    if(n > 2){
        for(let i=3;i<n;i++){
            if(isPrime(i)==true && isPrime(n-i)==true){
                let j=n-i
                alert(n+"="+i+"+"+j);
            }
        }
    }

这个输出会有问题,会把9这种奇数都判定为质数,这里面我犯了一个错误,我以为写在if 后面的就算else语句了,但是仔细想想,



这种情况只要是一个不能被2整除的数字都会返回false



师傅建议我把上面那一块也封装成函数,因为这样的话,这个功能才能复用,不然只能用一次,上面我的答案还有一点不足,会重复输出,比如输入8,会输出3+5和5+3,师傅让我恰当的使用break语句,提高程序效率
//判断一个数是否为质数
    function isPrime(num){
      for(var i=2; i<num; i++ ){
          if(num%i==0){
              return false
          }
      }  
      return true;
    }

    function Access(e){
        for(let i=3;i<e;i++){
            if(isPrime(i)==true && isPrime(n-i)==true){
                let j=n-i;
                alert(n+"="+i+"+"+j);
                break;
            }A
        }
    }

    var n = prompt("请输入你想判断的数字");
    if(n > 2){
        Access(n)
    }


这里还有个小问题:
除了 构造函数 首字母大写,一般函数首字母都应该小写。

假设现在写的是一个比较大的项目,而且在不同的地方都会用到合数拆分成两个质数之和的功能
access函数和isPrime是强耦合的,access要依赖isPrime,所以他们属于同一个模块
// 标准
var divideToPrime = {
    isPrime: function (num) {
        for(var i=2; i<num; i++ ){
          if(num%i==0){
              return false
          }
      }  
      return true;
    },
    access: function (n) {
        for(let i=3;i<n;i++){
            if(this.isPrime(i)==true && this.isPrime(n-i)==true){
            //这里的this指向函数的调用者(对象),也就是divideToPrime,
            //因为它调用access,所以access的this都指向divideToPrime,
            //isPrime又是divideToPrime下的方法,当然要去divideToPrime里面找
                let j=n-i;
                alert(n+"="+i+"+"+j);
                break;
            }
        }
    }
}
var n = prompt("请输入你想判断的数字");
divideToPrime.access(n);


把上面的代码用耦合的方法写在一起,封装成模块,对外暴露接口,这样就做成一个模块,我们平常使用npm下载的包也是这样来的,不同的模块实现不同的功能,组合在一起,也就变成一个大项目了

相关文章

网友评论

      本文标题:前端菜鸟成长记(五)+answer

      本文链接:https://www.haomeiwen.com/subject/xmzqkqtx.html