最高公因数C#

最高公因数C#,c#,C#,我有目前的编码,我觉得它似乎是接近我需要的,但我似乎无法让它为我想要的工作。我试图让它输出输入的两个数字中的最高公因数 i = myInt; { if (myInt % i == 0 && myInt2 % i == 0) { Console.Write("Your GCF is...");

我有目前的编码,我觉得它似乎是接近我需要的,但我似乎无法让它为我想要的工作。我试图让它输出输入的两个数字中的最高公因数

            i = myInt;

            {
                if (myInt % i == 0 && myInt2 % i == 0)
                {
                    Console.Write("Your GCF is...");
                    Console.Write("{0} ", i);
                    Console.ReadLine();

                }
                else
                    i--;
                goto;
            }

行。然而,这是一个非常糟糕的想法。与其像其他人在评论中所说的那样学习如何使用
,,不如真正避免使用
goto
语句,因为它们是不好的做法,尤其是在学习大学编程课程(通常应符合结构化编程)时。相反,使用
while
循环(或任何其他)和两个条件,如示例中所示。此外,我认为您应该从较小的数字开始搜索(第一次输入的数字不需要较小),这在性能方面有一点改进。代码如下:

static void Main(string[] args)
{    
    string myInput;
    int myInt;
    string myInput2;
    int myInt2;
    int i;

    Console.Write("Please enter a number: ");
    myInput = Console.ReadLine();
    myInt = Int32.Parse(myInput);

    Console.Write("Please enter another number: ");
    myInput2 = Console.ReadLine();
    myInt2 = Int32.Parse(myInput2);

    i = myInt > myInt2 ? myInt2 : myInt;
    bool found = false;
    while(!found && i>0)
    {
        if (myInt % i == 0 && myInt2 % i == 0)
        {
            Console.Write("Your GCF is...");
            Console.Write("{0} ", i);
            Console.ReadLine();
            found = true;
        }
        else
            i--;
    }
}
编辑:由于@Servy,我加入了其他可能的解决方案

bool found = false;
for( i = Math.Min(myInt, myInt2); !found && i>0; i--)
{
    if (myInt % i == 0 && myInt2 % i == 0)
    {
        Console.Write("Your GCF is...");
        Console.Write("{0} ", i);
        Console.ReadLine();
        found = true;
    }
}

后藤?我想我只是有点呕吐。这是作业吗?第二,移除goto!那么什么不起作用呢?它是否会产生错误,是否会出现误报,是否没有答案,是否会永远运行,是否会给出错误的答案,是否只是有时才起作用,是否还没有实际运行它,是否还没有编译,[…]?使用该语句进行循环,不是一个
goto
@AthensHolloway它很可能被否决了,因为提问者没有努力回答这个问题。他把整个代码库都放在了问题中,说“它不工作”和“plz修复”。他没有努力解决自己的问题,确定实际问题是什么,解释他做了什么,确定他代码库的哪个部分导致了问题,等等。在这个问题上明显缺乏努力往往会遭到反对票。(他用了一个后置键。)看起来你应该重构它,然后去掉后置键…唷。。。!虽然这比OP的代码要好,但这有点像说欠某人9999.99美元比欠他们10000美元要好。这是一种不值得指出的区别。为什么会有反对票?Yossarian向OP展示了可以更改哪些内容以使代码正常工作,并告诉他最好在
时使用
。在功能上没有什么不同,直到你意外地在else中添加了一行新行,而这行本应该在else中,但却不在else中。@Bobson good point,我总是这样做,只是不想显著地更改OP的代码。然而,我经常收到这样的问题:“当我只有一条语句时,我需要这些括号吗?”而不是
myInt>myInt2?myInt2:myInt
我会使用
Math.Max
。它使意图更加明确。您还可以对
循环使用
,而不是
while
,因为您在开始时创建循环变量,并在一段时间内每次递减。再次强调,只是让意图比实际功能中的任何更改更清晰。哦,而且不需要找到布尔值
。由于您仅在循环的“末尾”将其设置为true,因此可以有效地使
if
成为
for
/
while
条件中的表达式;它会清理代码。@NikolaD Nick为什么你坚持说
for
循环应该提前退出?当定义它应该退出的条件表示它应该退出时,它应该退出
for
循环在实践中或概念上都不需要有固定的迭代次数。它实际上只是
while
循环的包装器,您应该这样想,而不仅仅是执行块X次的魔法代码。这就是需要避免的概念上的理解不足。@Bobson-教授们是否也喜欢复杂的
for
循环而不是
while
循环?
bool found = false;
for( i = Math.Min(myInt, myInt2); !found && i>0; i--)
{
    if (myInt % i == 0 && myInt2 % i == 0)
    {
        Console.Write("Your GCF is...");
        Console.Write("{0} ", i);
        Console.ReadLine();
        found = true;
    }
}