项目Euler问题16在visual basic中。数字的总和2 ^ 1000

时间:2009-05-29 13:07:33

标签: vb.net

项目欧拉的问题16: 2 ^(15)= 32768,其数字之和为3 + 2 + 7 + 6 + 8 = 26.

数字2 ^(1000)的数字总和是多少?

我一直试图在几天内解决这个问题而且我无法弄清楚如何让vb.net 2008识别出那个大数字附近的任何地方。我在其他帖子中看到像java这样的软件有整数类型BigNumber或BigInteger,但我在visual basic中找不到类似的东西。我使用Visual Basic遇到了很多这个问题。我也似乎无法在Visual Basic中找到任何标准的高级数学特征,例如阶乘和其他一些我不记得但在数学特征下找不到的。有什么建议? (抱歉,让我重新说一下,如何在不改用其他编程语言的情况下完成这些工作的任何建议。)

4 个答案:

答案 0 :(得分:4)

您可以免费使用几个可以使用的BigInteger库。

在这种情况下,限制不一定是语言。除基本数学运算外,Visual Basic在很大程度上取决于BCL的功能。对于在CLR上运行的大多数语言(包括C#)都是如此。但在大多数情况下,可以使用库来增强框架的功能。

答案 1 :(得分:4)

这里是我写的函数,纯粹为了这个目的而自己实现BigInteger并不是那么困难(但很难让它变得高效和通用,但这就是库的用途)

Public Shared Function Problem16(ByVal power As Integer) As String

    Dim digits As Integer = CInt(Int(power * Log10(2)))

    Dim number(digits) As Byte
    number(digits) = 1

    For i As Integer = 1 To power
        Dim carry As Byte = 0
        For j As Integer = digits To 0 Step -1
            number(j) <<= 1
            number(j) += carry
            If number(j) > 9 Then
                carry = number(j) \ CByte(10)
                number(j) -= CByte(10)
            Else
                carry = 0
            End If
        Next
    Next

    Dim result As Integer
    For i As Integer = 0 To digits
        result += number(i)
    Next
    Return result.ToString

End Function

答案 2 :(得分:0)

我没有尝试过,但似乎有一个Big Integer构造用于Visual Basic。

答案 3 :(得分:0)

public static void main(String[] args) {
    int m = 2, ci = 1, n = 1000, i;
    int[] arr = new int[n + 1];
    arr[1] = 1;
    for (i = 1; i <= n; i++) {

        int carry = 0;
        for (int j = 1; j <= ci; j++) {
            arr[j] = arr[j] * m + carry;
            carry = arr[j] / 10;
            arr[j] = arr[j] % 10;
        }
        if (carry > 0) {
            while (carry > 0) {
                ci++;
                arr[ci] = carry % 10;
                carry = carry / 10;
            }
        }
    }
    int sum = 0;
    System.out.println(ci + "\n \n ");
    for (int j = ci; j > 0; j--) {
        System.out.print(arr[j]);
        sum = sum + arr[j];
    }
    System.out.println("\n \n " + sum);
}

答案: 2 ^ 1000:302

中的位数

2 ^ 1000 = 10715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531468251871452856923140435984577574698574803934567774824230985421074605062371141877954182153046474983581941267398767559165543946077062914571196477686542167660429831652624386837205668069376

数字之和:1366