Function 添加一个数字直到得到一个数字

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)

假设用户输入一个类似“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)
            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