【问题标题】:Project Eulers problem 16 in visual basic. Sum of digits in the number 2^1000Visual Basic 中的 Project Euler 问题 16。数字 2^1000 中的数字总和
【发布时间】:2015-01-23 01:59:00
【问题描述】:

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

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

我这几天一直在尝试解决这个问题,但我只是不知道如何让 vb.net 2008 识别接近这么大的数字的任何地方。我在其他帖子中看到,像 java 这样的一些软件具有整数类型 BigNumber 或 BigInteger,但我在 Visual Basic 中找不到类似的东西。我在使用 Visual Basic 时经常遇到这个问题。我似乎也无法在 Visual Basic 中找到任何标准的高级数学功能,例如阶乘和其他一些我不记得但在数学功能下找不到的功能。有什么建议么? (对不起,让我改写一下,关于如何在不切换到其他编程语言的情况下做这些事情的任何建议。)

【问题讨论】:

  • 不使用其他语言?但它在 python 中只有 4 行...
  • 我怀疑有一种更优雅的方法,而不是简单地在 BigInteger 中创建 2^1000 并将由此生成的数字相加。
  • 对于python它的一个衬里:>>> sum([int(x) for x in str(2**1000)]) 1366

标签: vb.net


【解决方案1】:

这是我编写的函数,纯粹为此目的自己实现 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

【讨论】:

  • 我在考虑我的解决方案,发现你已经实现了它;)
  • 很高兴你这样做了。我认为使用库而不是数组或字符串解决方案很便宜。
  • 好吧,这行得通,我只是不知道如何......我什至从未见过或使用过 += 或 -= 少得多 = 、。整个数字(数字)作为字节也让我感到困惑。 result += number(i) 和 result = result + number (i) 意思一样吗?
  • @Bryan,a+=1 与 a=a+1 相同。 a
  • 很高兴知道,数字(数字)类型的东西呢。这被认为是一个全新的变量还是变量数字以某种方式与之交互?
【解决方案2】:

有几个 BigInteger 库可供您免费使用。

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

【讨论】:

  • 这似乎可行,但我在实施时遇到问题。我似乎无法真正进入参考下载的内容,甚至在它说已下载时找到下载。我已经能够让 Microsoft.JScript 选项出现,但这似乎没有帮助,因为我在其中的任何地方都找不到 BigInteger 或类似的东西。有谁知道我哪里出错了? p.s.我不太确定如何将其他库和诸如此类的东西包含到我的项目中
  • 据说也应该有一个 systems.numeric 命名空间,其中也有 bigint,但据我在 vb.net 2008 中所知,我没有 systems.numeric
  • 尝试以下操作。打开解决方案资源管理器。右键单击您的项目并选择“添加参考”。选择浏览选项卡并导航到您将文件下载到的位置。选择所有 .dll 文件并点击 OK。
  • 我很乐意,但正如我所说,我找不到下载到的位置。弹出一个屏幕说它正在下载,但没有给我任何存储选项,并且出现另一件事,说它已完成下载,但即使我查看我最近的下载,也没有任何内容。如果我尝试在我的计算机上搜索任何应该是我下载的文件名称的文件,我会收到一个错误,并且“我的计算机”屏幕会关闭并显示错误文本,基本上是说我的搜索被视为潜在病毒。
【解决方案3】:

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

【讨论】:

  • 指的是尚未发布的.Net 4.0 的文档。
  • 感谢您的关注。我以为我在 3.5 下搜索。我会把它归咎于左边那个愚蠢的可折叠菜单。道歉。
【解决方案4】:
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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-23
    • 1970-01-01
    • 1970-01-01
    • 2015-01-23
    • 1970-01-01
    • 2020-03-17
    • 2011-03-23
    • 2019-09-29
    相关资源
    最近更新 更多