Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 根据某些规则,在数组中的某个位置上查找数字,将复数形式添加到“中”;“数字”;_C#_Arrays_Algorithm_Math_Queue - Fatal编程技术网

C# 根据某些规则,在数组中的某个位置上查找数字,将复数形式添加到“中”;“数字”;

C# 根据某些规则,在数组中的某个位置上查找数字,将复数形式添加到“中”;“数字”;,c#,arrays,algorithm,math,queue,C#,Arrays,Algorithm,Math,Queue,我是一名编程初学者,我正在尝试编写一个能够解决以下数学问题的程序: 在一个圆上我们有108个数字。任何20个连续数字的总和总是1000。在“1”位置我们有数字1,在“19”位置我们有数字19,在“50”位置我们有数字50。在“100”位置我们有什么数字?“数字总是整数 到目前为止,我知道如何使用数组和循环结构,如“for” 我试图设置一个变量“check”,并将其初始化为“false”,以便在以后找到位置“100”上的数字时将其更改为true 我最初的想法是遍历数组,将每20个连续数字相加。我使

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

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

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

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

我最初的想法是遍历数组,将每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;
                }
            }
        }
    }
check=true;
int[]数组=新的int[108];
用于(计数器=1;计数器2;连续--)
{
校验值=数组[连续]+数组[连续]-1;
}
如果(checkvalue!=1000)check=false;
}
}
}
}

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

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

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)

正如@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,再乘以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);
        }
    }
}
使用系统;
命名空间堆栈溢出
{
班级计划
{
静态void Main(字符串[]参数)
{
int[]值={1,19,50};
int[]arr=新int[108];
foreach(值中的var val)
{
int pos=val-1;
while(arr[pos]!=val)
{
arr[pos]=val;
pos+=20;
pos%=108;
}
}
整数和=0;
整数零=0;
对于(int i=0;i<20;i++)
{
如果(arr[i]==0)为零++;
总和+=arr[i];
}
控制台写入线((1000-和)/0);
}
}
}

我们需要查看一些代码。有人给你指了指队列吗?这未必是最好的选择。到目前为止,我一直在努力理解需求,因为我看不到您已经拥有了什么。请输入代码..并且在位置“21”处,我们有值21?或者这些位置是固定的,其余字段可以有随机数?我认为解决方案取决于前20个数字。您可以使用数组并将索引修改108。例如,当您从107计算数字时,您将从107计算到126,或者作为索引107 mod 108=107和126 mod 108=18。我自己发现了“队列”,我并没有真正的人指导我。只有位置“1”、“19”和“50”具有这些固定值。其余的可以是任何东西,我基本上是想找出哪个值将位于位置“100”上,这符合规则。@Pedro Delarte,你需要算法或有用的数据结构来解决吗?Fryday,非常感谢你的努力。最后请澄清一下。我看到您使用python编写代码,但我并不十分熟悉。我把这段代码放在ideone上,得到一个运行时错误。原因是什么?是的,因为圆圈中的一些数字没有设置。我认为你自己猜会更好。试着找出数字的顺序。如果你认为我的答案是正确的,请+1并接受它。谢谢
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);
        }
    }
}