Function 添加一个数字直到得到一个数字
假设用户输入一个类似“3452”的数字,我想要一个函数一个接一个地添加这个数字,直到得到一个数字,如我在下面提到的: 第一个方面是:Function 添加一个数字直到得到一个数字,function,vbscript,asp-classic,Function,Vbscript,Asp Classic,假设用户输入一个类似“3452”的数字,我想要一个函数一个接一个地添加这个数字,直到得到一个数字,如我在下面提到的: 第一个方面是: 3+4=7->7+5=12->(如果位数超过1)1+2=3->3+2=5 第二个方面是: 3+4=7->7+5=12->12+2=14->1+4=5 我写道: Function Sum(number) Dim i, intTemp intTemp = 0 For i=1 to Len(number)
3+4=7->7+5=12->(如果位数超过1)1+2=3->3+2=5 第二个方面是:
3+4=7->7+5=12->12+2=14->1+4=5 我写道:
Function Sum(number)
Dim i, intTemp
intTemp = 0
For i=1 to Len(number)
intTemp = intTemp + CInt(Mid(number, i, 1))
Next
Sum = intTemp
End Function
但是这个函数返回的是两位数而不是一位数…请指导我
编辑:我在if语句中放入Do while循环,if语句检查intTemp数字的长度,如下所示:
if Len(intTemp)>1 then
Do While Len(intTemp) = 1
some code like first section
Loop
end if
但它不起作用!:(如果您这样做了又如何。它假设您传递的数字超过一个位数(大于9),并将继续循环,直到您得到一个位数的结果
Function Sum(number)
Dim i, intTemp, workingNum
workingNum = number
Do
intTemp = 0
For i=1 to Len(workingNum)
intTemp = intTemp + CInt(Mid(number, i, 1))
Next
workingNum = intTemp
Loop until workingNum < 9
Sum = intTemp
End Function
函数和(数)
Dim i、intTemp、workingNum
workingNum=编号
做
intTemp=0
对于i=1到Len(workingNum)
intTemp=intTemp+CInt(中间(编号,i,1))
下一个
workingNum=intTemp
循环直到workingNum<9
总和=intTemp
端函数
由于我不能完全脱离您的规范,因此我创建了一个“让实验变得容易”脚本,用于使用两个函数,为您的(单个!)示例提供预期的结果:
我真的很想得到你试图解决的现实世界问题的一点提示。你的数字求和逻辑对我来说相当简单。只要intTemp有两个数字,你就需要递归(我将名称改为DigitSum): 这里我声明变量并赋值 这里我使用临时值来打印@end of result
好了,更好了?我改成了Do/Loop…它应该仍然有效,我没有在你原来的代码中添加任何不存在的东西。我已经知道这不是你想要的,但是有没有任何理由直接不做
number Mod 9
?@MCND这应该是答案;只是基本但聪明的算法。@MCND,@AutomatedChaos:麻木er Mod 9
方法仅适用于不是9的倍数的数字。如果数字为9,则9 Mod 9
为零,但用户需求将为9,与18相同…@PatricK:如果输入为0,则0 Mod 9
将为0。测试这种情况。在任何其他情况下,如果num Mod 9
为0
,则方法的结果应为b因此,Sum=number Mod 9:如果Sum=0和number=0,那么Sum=9
Option Explicit
Const cbDebug = False
WScript.Quit demoMain()
Function demoMain()
Dim aTests : aTests = Array( _
Array("3452", 5, 5) _
, Array("0", 0, 0) _
, Array("", 0, 0) _
, Array("99", 9, 9) _
, Array("999999", 9, 9) _
, Array("991999", 1, 1) _
)
Dim aTest
For Each aTest In aTests
Dim sInp : sInp = aTest(0)
WScript.Echo "--------", qq(sInp)
Dim nExp : nExp = aTest(1)
Dim nAct : nAct = fancySum01(sInp)
WScript.Echo " Asp 1:", nExp, nAct, CStr(nExp = nAct)
nExp = aTest(2)
nAct = fancySum02(sInp)
WScript.Echo " Asp 2:", nExp, nAct, CStr(nExp = nAct)
Next
demoMain = 0
End Function
'' "3452" 3+4=7 -> 7+5= 12 ->( if number of digits exceed from 1 ) 1+2= 3 -> 3+2= 5
Function fancySum01(sInp)
fancySum01 = 0
Dim p
For p = 1 To Len(sInp)
fancySum01 = fancySum01 + CByte(Mid(sInp, p, 1))
If fancySum01 > 9 Then fancySum01 = (fancySum01 \ 10) + (fancySum01 Mod 10)
If cbDebug Then WScript.Echo " *", p, fancySum01
Next
End Function
'' "3452" 3+4= 7 -> 7+5= 12 -> 12+2= 14 -> 1+4= 5
Function fancySum02(sInp)
fancySum02 = 0
Dim p
For p = 1 To Len(sInp)
fancySum02 = fancySum02 + CByte(Mid(sInp, p, 1))
If cbDebug Then WScript.Echo " *", p, fancySum02
Next
Dim r : r = CStr(fancySum02)
If 1 < Len(r) Then fancySum02 = fancySum02(r)
End Function
Function qq(s) : qq = """" & s & """" : End Function
cscript 20845743.vbs
-------- "3452"
Asp 1: 5 5 True
Asp 2: 5 5 True
-------- "0"
Asp 1: 0 0 True
Asp 2: 0 0 True
-------- ""
Asp 1: 0 0 True
Asp 2: 0 0 True
-------- "99"
Asp 1: 9 9 True
Asp 2: 9 9 True
-------- "999999"
Asp 1: 9 9 True
Asp 2: 9 9 True
-------- "991999"
Asp 1: 1 1 True
Asp 2: 1 1 True
Function DigitSum(number)
Dim i, intTemp, sNumber
intTemp = 0
sNumber = CStr(number)
For i = 1 To Len(sNumber)
intTemp = intTemp + CInt(Mid(sNumber, i, 1))
If Len(CStr(intTemp)) > 1 Then intTemp = DigitSum(intTemp)
Next
DigitSum = intTemp
End Function
Dim str
str = InputBox("Enter the value")
temp = str
otp = 0
sum = 0
while(Len(str)>1)
For i = 1 to Len(str)
sum = sum+cint(mid(str,i,1))
Next
If otp = 0 Then
otp = sum
End If
str = cstr(sum)
sum = 0
wend
MsgBox "Total sum = "& otp
MsgBox "Single digit of "&temp+" is :"&str