今天就不跟大家卖关子了,直接放题目跟答案
把一个大于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下载的包也是这样来的,不同的模块实现不同的功能,组合在一起,也就变成一个大项目了
网友评论