2012-11-14 39 views
0

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

  i = myInt; 

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

       } 
       else 
        i--; 
       goto; 
      } 
+15

转到?我想我只是在嘴里吐了一下。 –

+1

这是功课吗?第二次删除goto! –

+0

那么有什么不工作?它是否会产生错误,你是否得到误报,没有答案,它是否永远运行,是否给出了错误的答案,它只是有时工作,你是否真的没有运行它,它不会编译,[...]? – Servy

回答

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

      } 
      else 
       i--; 
      goto label; 
     } 

会做。但是,这是一个非常糟糕的主意。宁可学习如何使用while

+4

看起来你应该重构,摆脱那GOTO ... YUK ...! – MethodMan

+1

虽然这比OP的代码更好,但这有点像说99999.99美元比10000美元更好。这是不值得指出的那种差异。 – Bobson

+2

为什么downvotes? Yossarian正在向OP展示如何改变代码的工作方式,并告诉他最好使用'while'。 – comecme

0

正如其他人在评论中所说的那样,您应该避免使用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; 
    } 
} 
+0

我会把'{}'放在其他地方,但这是一种风格。没有不同的功能,直到你不小心添加了一条应该在else和not中的新行。 – Bobson

+0

@Bobson好点,我总是这么做,只是不想大幅改变OP的代码。不过,我经常收到一些问题,比如“我只有一​​个声明时需要括号吗?” –

+0

而不是'myInt> myInt2? myInt2:myInt;'我会用'Math.Max'。它使意图更清楚。你也可以使用'for'循环而不是'while',因为你在开始时创建了一个循环变量,并且每次都在一段时间内取而代之。再次,只是使意图更清晰,而不是实际功能的任何变化。哦,并且不需要布尔型的“找到”。既然你只在循环的“结束”处将它设置为true,你可以在'for' /'while'条件下有效地使'if'成为表达式;它会清理代码。 – Servy