-3

1から88,888,888までで、各桁の和が8以下になる組み合わせは?

たとえば、
70000001 = 7+0+0+0+0+0+0+1 = 8 リストにある必要があります
00000021 = 0+0+0+0+0+0+2+1 = 3 リストにある必要がありますリスト。
20005002 = 2+0+0+0+5+0+0+2 = 9 リストにないはずです。

Sub Comb()
Dim r As Integer 'Row (to store the number)
Dim i As Integer 'Range
r = 1
For i = 0 To 88888888
If i = 8
'How can I get the sum of the digits on vba?
ActiveSheet.Cells(r, 1) = i
r = r + 1
End If
Else
End Sub
4

3 に答える 3

1

...これはあなたが探しているものですか?

Function AddDigits(sNum As String) As Integer

Dim i As Integer

   AddDigits = 0
   For i = 1 To Len(sNum)
      AddDigits = AddDigits + CInt(Mid(sNum, i, 1))
   Next i

End Function

CStr()(関数に渡す数値で使用することを忘れないでください。

そうでない場合は、もう少し詳しく説明してください。

お役に立てれば

于 2013-02-11T17:49:53.400 に答える
0

あなたが提案する方法はかなりブルートフォースです。私のマシンでは、すべての数値を計算するのに 6.5 分かかりました。これまでのところ、より効率的なアルゴリズムを見つけようとしました。

これには約 0.5 秒かかります。

Private Const cIntNumberOfDigits As Integer = 9
プライベート mStrNum を文字列として
範囲としてのプライベート mRng

プライベート サブ GetNumbers()
    Dim dblStart As Double
    mRng = Range("a1") を設定します
    dblStart = タイマー
    mStrNum = Replace(Space(cIntNumberOfDigits), " ", "0")
    subGetNumbers 8
    Debug.Print (タイマー - dblStart) / 10000000、(タイマー - dblStart)
サブ終了


Private Sub subGetNumbers (整数としての intMaxSum、整数としてのオプションの intStartPos = 1)
    Dim i As Integer

    If intStartPos = cIntNumberOfDigits Then
        Mid(mStrNum, intStartPos, 1) = intMaxSum
        mRng.Value = Val(mStrNum)
        mRng = mRng.Offset(1) を設定します。
        ミッド (mStrNum、intStartPos、1) = 0
        サブを終了
    終了条件

    i = 0 の場合 intMaxSum へ
        Mid(mStrNum, intStartPos, 1) = CStr(i)
        subGetNumbers intMaxSum - i, intStartPos + 1
    次は
    ミッド (mStrNum、intStartPos、1) = 0
サブ終了

範囲に直接書き込んでオフセットするのではなく、配列を使用することで約 10 倍高速化できますが、今のところはそれで十分です。:-)

于 2013-02-11T20:27:19.643 に答える