【问题标题】:Find number on a certain position in array, depending on some rules, added plural to "numbers"根据某些规则在数组中的某个位置查找数字,将复数添加到“数字”
【发布时间】:2016-04-20 21:10:00
【问题描述】:

我是编程初学者,我正在尝试编写一个程序来解决以下数学问题:

“在一个圆圈上,我们有 108 个数字。任何 20 个连续数字的总和总是 1000。在位置“1”我们有数字 1,在位置“19”我们有数字 19,在位置“50”我们有 50 号。我们在位置“100”上有什么数字?”数字总是整数。

到目前为止,我知道如何使用数组和循环结构,如“for”。

我试图设置一个变量“check”,我将其初始化为“false”,以便稍后将其更改为 true,当我会在位置“100”上找到数字时。

我最初的想法是遍历数组并计算每 20 个连续数字的总和。我使用了两个变量来为每个不是 1、19 或 50 的位置分配值,然后求和。我在两个“for”结构中做到了这一点,一个在另一个内部。当然,这会产生一个问题,即我无法正确计算前 20 个数字的值。

我在 MSDN 上查看了有关“队列”结构的一些信息,但我不明白如何在我的特定情况下使用它。

如果有人对我应该如何处理这个问题有一些建议,请告诉我。 谢谢。

正如你所问,这是我目前为止编写的代码。请考虑到我真的是在乞求编程,我还有很多东西要学。

check = true;
int[] array = new int[108];

for (counter = 1; counter <= array.Length; counter++)
    {
        if (counter !=1 || counter !=19 || counter !=50)
        {
            for (i = 1; i <= 999; i++) 
            {
                array[counter] = i;
                if (counter >= 20) 
                {
                    for (consecutive = counter; consecutive => 2; consecutive--)
                    {
                        checkValue = array[consecutive] + array[consecutive]-1;
                    }
                    if (checkvalue != 1000) check = false;
                }
            }
        }
    }

【问题讨论】:

  • 我们需要看一些代码。有人将您指向Queue 吗?它可能不一定是最佳选择。到目前为止,我很难理解这些要求,因为我看不到你已经拥有的东西。
  • 请编码......并且在位置“21”我们有值 21?或者这些位置是固定的,其余字段可以有随机数?
  • 我认为解决方案取决于前 20 个数字。您可以使用数组并将您的索引除以 108。例如,当您从 107 数字计算数字时,您将从 107 计算到 126,或者作为索引 107 mod 108 = 107 和 126 mod 108 = 18。
  • 我自己找到了“队列”,我真的没有人指导我。只有位置“1”、“19”和“50”具有这些固定值。其余的可以是任何东西,我基本上试图找出满足规则的位置“100”上的哪个值。
  • @Pedro Delarte,您需要算法或有用的数据结构来解决问题吗?

标签: c# arrays algorithm math queue


【解决方案1】:

我用数组解决了这个问题,但最好使用某种类型的循环列表。这是关于结构的选择。

一般来说你应该用逻辑来解决这个问题,计算机只能帮助你检查结果或可视化数据。我将附加代码来展示我如何使用数组来解决这个问题:

N = 108
step = 20
a = [None] * (N + 1)
def toArrayIndex(i):
    if i < 0:
        return toArrayIndex(N + i)
    if i % N == 0:
        return N
    else:
        return i % N


def setKnownNumbers(value, index):
    while a[toArrayIndex(index)] != value:
        if a[toArrayIndex(index)] != None:
            print "ERROR: problem unsolvable i = %d" % toArrayIndex(index)
        a[toArrayIndex(index)] = value
        index += step

setKnownNumbers(1, 1)
setKnownNumbers(19, 19)
setKnownNumbers(50, 50)

现在您只需要了解如何完成它。这并不难;)

您可以使用此代码输出数组并检查正确性

# output 
for i in range(1,N + 1):
    print i, a[i]

counter = 0
for i in range(1,N + 1):
    s = 0
    for j in range(0,step):
        s += a[toArrayIndex(i + j)]
    if s == 1000:
        counter += 1

if counter == N:
    print "Correct"
print "a[100] = %d" % a[100]

【讨论】:

  • 星期五,非常感谢您的努力。最后请澄清一下。我看到您使用 python 编写代码,我并不十分熟悉。我将此代码放在 ideone 上,但出现运行时错误。 ideone.com/6HgDTP可能是什么原因造成的?
  • 是的,因为圆圈中的某些数字未设置。我认为最好自己猜。尝试在数字中找到顺序。
  • 如果您认为我的回答是对的,请+1 并接受。谢谢。
【解决方案2】:

正如@fryday所说,这个问题的代码没有任何逻辑意义,所以在阅读本文之前你应该很好地理解解决方案。

让我给你解释一下这个问题的逻辑,然后阅读代码(你会发现这很简单)。首先你可能会注意到,每次你得到 20 个连续的数字,下一个数字必须等于 20 个连续的第一个,因为你有

x_1 + x_2 + ... + x_20 = 1000

x_2 + ... + x_20 + x_21 = 1000

所以

x_1 + x_2 + ... + x_20 = x_2 + ... + x_20 + x_21

最后

x_1 = x_21

根据这一见解,我们所要做的就是从位置 1、19 和 50 开始遍历数组,用这些值填充数组中的位置,然后计算下一个位置,将 20 加到当前位置和mod by 108,重复该过程,直到数组中的值在每种情况下都等于 1、19 或 50。那么数组中的值等于 0 意味着所有的值都必须相同(并且还没有找到)。要找到这个值,将 20 个连续值相加,然后将差值除以 1000 除以这 20 个连续值中值为 0 的元素的计数。您可以注意到位置 100 是其中一个值等于 0 的位置。最后我们得到 130 的值。

这是代码:

using System;

namespace Stackoverflow
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] values = { 1, 19, 50 };
            int[] arr = new int[108];

            foreach (var val in values)
            {
                int pos = val - 1;
                while (arr[pos] != val)
                {
                    arr[pos] = val;

                    pos += 20;
                    pos %= 108;
                }
            }

            int sum = 0;
            int zeros = 0;
            for (int i = 0; i < 20; i++)
            {
                if (arr[i] == 0) zeros++;
                sum += arr[i];
            }

            Console.WriteLine((1000 - sum) / zeros);
        }
    }
}

【讨论】:

    猜你喜欢
    • 2020-10-04
    • 1970-01-01
    • 1970-01-01
    • 2015-06-20
    • 2021-08-28
    • 2021-11-29
    • 2015-03-01
    • 2019-07-04
    • 2017-12-01
    相关资源
    最近更新 更多