当前位置: 首页 > 知识库问答 >
问题:

如何修复在相同输入下无法工作两次的循环

胡越泽
2023-03-14

我试图制作一个简单的程序,要求输入一个整数,如果该整数是质数,则输出其因子。如果用户的输入不是主因子,它会要求用户输入主因子。问题是,如果我在一行中输入两次有效的素数因子,它不会给出正确的输出。我已经在这方面工作了一段时间了,我想这一定是我明显缺少的东西,因为我无法理解它。

class Program
{
    static void Main(string[] args)
    {
        List<int> factors = new List<int>();
        int a, b, c;
        Console.Write("Hello,\n Please enter an integer: ");
        string userInput = Console.ReadLine();
        while (userInput != "quit")
        {
            try
            {
                a = int.Parse(userInput);
                c = a;
                bool negative = a < 0;
                int letter = Convert.ToInt32(Int32.TryParse(userInput, out letter));
                if (!negative && letter != 0)
                {
                    for (b = 2; a > 1;)
                        if (a % b == 0)
                        {                
                            while (c % b == 0)
                            {
                                c /= b;
                                factors.Add(c);
                            }
                            Console.WriteLine($"{a} has factors: { String.Join(", ", factors)}");
                            Console.Write("Please enter another integer: ");
                            factors.Clear();
                            userInput = Console.ReadLine();
                            a = int.Parse(userInput);


                        }
                }
                else
                {
                    Console.Write("Please enter a valid prime factor: ");
                    userInput = Console.ReadLine();
                }

            }
            catch
            {
                Console.Write("Please enter a valid prime factor: ");
                userInput = Console.ReadLine();
            }
        }
    }
}

您好,请输入一个整数:64
64有系数:32、16、8、4、2、1请输入另一个整数:y
请输入有效的基本因子:

现在如果我在一行中做两个有效的素数因子

您好,请输入一个整数:64
64有系数:32、16、8、4、2、1请输入另一个整数:8
8有系数:请输入另一个整数:

然而

你好,请输入一个整数:64...
64有因数:32, 16, 8, 4, 2, 1请输入另一个整数:y...
请输入一个有效的素数因数:8 8有因数:4,2,1请输入另一个整数:

共有1个答案

沈俊晤
2023-03-14

通常我不会只提供答案,因为开发人员能够自己解决这些问题很重要。但我无法在评论中回复。所以我会提供一些反馈,让我找到解决方案和一些一般性评论。

如果您花时间进行调试,您将能够看到代码中的问题。添加简单控制台。WriteLines指示代码流中哪里开始出错。

您还需要为变量提供更好的名称。a、b、c是没有意义的,并且很难理解的目的。更好的变量名称意味着我们可以更好地理解您遇到的问题,以及代码试图做什么。编写良好的代码块应该在5秒内可读且通常可以理解。我尽了最大努力将其应用于您的代码,而无需重组太多,以便您可以在比较中看到代码中的冗余点。

问题是当我调试您的代码时,似乎发生了无限循环或int解析的一些奇怪之处。因为我不想花太多时间去理解为什么会发生这种情况,所以我对代码提出了上述建议,看看是否可以通过降低代码复杂性和提高易读性来降低错误发生的风险。

下面的解决方案可能与您所追求的并不完全一致,基于缺乏预期结果,很难知道这一点。

using System;
using System.Collections.Generic;

public class Program
{
    public static void Main(string[] args)
    {
        List<int> factors = new List<int>();
        while (true)
        {
            Console.WriteLine("Please enter an integer: ");
            var userInput = Console.ReadLine();
            if (userInput.Equals("quit"))
                break;

            if (!Int32.TryParse(userInput, out var firstOut)
               || !Int32.TryParse(userInput, out var secondOut))
                continue; 

            if (firstOut % 2 != 0 || firstOut < 0)
                continue;

            while (secondOut % 2 == 0)
            {
                secondOut /= 2;
                factors.Add(secondOut);
            }

            Console.WriteLine($"{firstOut} has factors: {String.Join(", ", factors)}");
            factors.Clear();
        }
    }
} 
 类似资料:
  • 我有两个不同的方法,在两个不同的类中。我希望他们都能阅读同一行输入,并检查不同的内容。一个查找“给我冲杯咖啡”之类的说明,另一个查找不同的关键字,如“请”和“谢谢”(这些影响程序对我的反应): 然后我在我的主字符串中调用它们,只是为了测试它们: 我的控制台显示如下: 我知道发生了什么,但我想不出其他办法。我也尝试过使用同一个扫描仪,不同的字符串,但仍然不起作用。我怎样才能使这两种方法都能读取我的第

  • 下面的代码循环了两次。第一个while循环要求用户输入(以做出选择)。我把选择默认值设置为“n”,使它变得更简单。 因此,它命中if语句并开始第2个while循环。现在它要求用户进行另一个选择。用户只能输入“a”,因为其他任何东西都会出现错误陷阱。用户输入“a”并得到添加一个数字的提示(变量num=0)。用户输入一个数字。 使用更多信息更新的代码 我已经尝试使用不同的变量进行选择。它不起作用。我想

  • 我遇到了一个循环问题,我必须输入两次温度才能启动循环。我想我知道问题在哪里,只是不知道如何解决。我已经编写了总共三周的代码,所以我在这方面完全是个初学者。 这是我有问题的代码部分: 我想你明白我的意思了。我唯一能让循环工作的方法就是重复int.Parse(Console.ReadLine()),但也许还有另一种修复方法可以修复必须输入两次温度的问题? 真希望有人能帮我解决这个问题。

  • 我的表格中有以下输入代码: 我用下面的代码更改了一个无效的消息: 问题是,如果我单击提交,字段为空,字段显示错误,因此我需要填充字段,但填充字段后,即使填充不为空,我仍会收到警告。 我做错了什么???

  • 我是一个Java的新手,我有一个问题,我不能想出比较前一个输入的数字(int)和下一个连续,我需要编写一个程序,反复读取数字从用户的键盘。当用户连续两次键入相同的数字时,程序停止循环。 谢谢你的指导。 下面是程序的运行示例:5 13 21 5 4 5 5完成! 以下是我失败的努力:) 扫描器输入=新扫描器(System.in);system.out.println(“输入数字”);

  • 我正在进行模拟测试,我正在努力创建一个循环,将循环输入12次,同时将每个输入添加到总和。 确定一个人在特定年份的平均体重。 对于每个月,您的算法应该输入该人当月的体重(正实数)。您的算法应该循环,重复输入,直到输入为正。 最后,您的算法输出平均权重。 在浏览了关于迭代控制结构的课堂笔记后,我想到了这个: 不幸的是,所有这些对我来说都是重复输入无限次,直到我输入一个大于12的数字。 我只想让控制台输