Javascript 在计算过程中运行Do…直到满足条件
我正在使用Javascript编写一个简单的do…while语句,该语句用于查看给定输入Javascript 在计算过程中运行Do…直到满足条件,javascript,conditional-statements,do-while,Javascript,Conditional Statements,Do While,我正在使用Javascript编写一个简单的do…while语句,该语句用于查看给定输入num的十进制长度,如果十进制长度大于或等于1,则取num并将其添加到自身,直到十进制长度等于0。目前,它适用于长度为1的小数,但如果大于1,它就会停止 例如,当num为8.75时,预期输出应为35,而不是17.5 该系列应采取4个步骤达到35 8.75 17.5 26.25 35 这是我的密码: const num = 8.75; var decimalLength = num.toString()
num
的十进制长度,如果十进制长度大于或等于1,则取num
并将其添加到自身,直到十进制长度等于0。目前,它适用于长度为1的小数,但如果大于1,它就会停止
例如,当num
为8.75时,预期输出应为35,而不是17.5
该系列应采取4个步骤达到35
8.75
17.5
26.25
35
这是我的密码:
const num = 8.75;
var decimalLength = num.toString().split(".")[1].length;
let result = "";
let i = num;
do {
i = i + num;
result = result + num;
newLength = decimalLength;
} while (newLength < 0);
console.log(i);
const num=8.75;
var decimalLength=num.toString().split(“.”[1]。长度;
让结果=”;
设i=num;
做{
i=i+num;
结果=结果+数量;
新长度=分贝长度;
}而(newLength<0);
控制台日志(i);
您可以使用一些奇特的数学来得到一个更明确的答案,这个答案不会反复出现:
const num=8.75;
var decimal=num%1//小数部分
var decimalPlaces=num.toString().split(“.”[1]?.length | | 0//小数点
//GCD函数
常数gcd=(x,y)=>(!y?x:gcd(y,x%y));
//GCD介于小数点和1之间,需要将其设为整数才能得到乘数,因此每个数乘以10^[小数点]
//同样,当除以10^[小数位]时,得到剩余的数值,看看乘以什么可以得到整数
var乘数=10**小数位数/gcd(10**小数位数,十进制*10**小数位数)
//使用基本属性的日志更改以2的幂获得值
var outputExponent=Math.log(乘数)/Math.log(2)
//乘法
var outputValue=num*乘数
console.log(outputExponent)//乘以2的幂得到整数
console.log(outputValue)//整数本身
此版本使用递归函数和容差来处理浮点舍入错误
const firstIntMultiple=(n,tol=1e-6,c=1)=>
Math.abs(n*c-Math.floor(n*c)) log(firstIntMultiple(14.058823529411764))/239/17
两个相互竞争的答案。哪个更好?没有办法知道,直到你测试出来。所以,这就是这个新答案试图做的
这些“测试”(如果您愿意的话)将每个函数运行50次,在清除控制台之前对每个迭代进行计时,并记录“平均时间”
8十进制精度
吸热龙:
const num=3.14159265;
//功能启动
常量firstIntMultiple=()=>{
var decimal=num%1;
var decimalPlaces=num.toString().split(“.”[1]?.length | | 0;
常数gcd=(x,y)=>(!y?x:gcd(y,x%y));
var乘数=10**小数位数/gcd(10**小数位数,十进制*(10**小数位数));
返回num*乘法器;
}
//功能端
变量时间=[]
对于(变量i=0;i<50;i++){
var startTime=新日期()
console.log(firstIntMultiple().toString())
推送次数((新日期()-startTime)/1000)
}
控制台清除()
console.log((times.reduce((a,b)=>a+b,0)/times.length)+“平均秒数”)
以下是所有答案的组合。这样做的好处是,它对每种输入都有一个“回退”。如果有终止小数,吸热龙的第一种方法就足够了。如果它是一个重复的十进制数,那么一个新的方法来确定一个答案就足够了。如果不足,则使用连分数作为回退
请注意,我最后包含连分数的唯一原因是因为它有时会导致小小数的错误。我只是想“修复”这个方法,但我不明白它是如何工作的,所以我把它作为一个后备方案
//位于顶部,以便查看
console.log(findMultiple(54.46333))/16339/300
console.log(findMultiple(8.333))//25/3
log(findMultiple(14.05882352941176))//非理性
log(findMultiple(94.03820382038203))//非理性
log(findMultiple(623.0549383482724))//1009349/1620
log(findMultiple(Math.PI))//非理性
log(findMultiple(13.000000221))//1829587379722249/140737488355328
log(findMultiple(1.0000003333))/1125900282105063/112589990642624
//主控
函数findMultiple(num,interpretLiteral=false,epsilon=1e-6){
if(num.toString().length<17 | | num%1==0 | |解释器文本){
返回吸热方法(num)//终止十进制
}
var checkRepeatingNum=CheckRepeating(num)
if(checkRepeatingNum!=false){
返回Math.round(吸热法(num,checkRepeatingNum)*num)//重复十进制
}否则{
return scottsauettefirstmethod(num,epsilon)//连分数
}
}
//预定义函数
//GCD
函数gcd(x,y){返回!y?x:gcd(y,x%y)};
//检查数字是否重复,如果重复,返回重复周期
函数检查重复(num){
var totalSearchLength=(num%1).toString().split('.')[1].切片(0,-1).length
var numTemp1=(num%1).toString().split('.')[1].切片(0,-1).split('').reverse().join('')
对于(变量i=1;i