如何使用 C# 循环计算大笔付款

How to count down large payments with a loop with c#

我正在尝试使用循环语句进行自己的国债倒计时。我对编程还是很陌生,所以我很难弄清楚如何制作这个循环。我想显示如果每天支付 100,000,000 美元,还清债务需要多长时间。我想显示天数和年数,但我现在的首要任务是循环。到目前为止我有这个

namespace Count_Down_The_National_Debt
{
    class Program
    {
        static void Main(string[] args)
        {
            //step 1
            // use 19.9 trillion dollars 
            long national_debt = 19900000000000;
            // keep track of how many days and it years it takes to pay off the US National Debt
            int day = 0, years = 0;

我回顾了我制作的一个使用循环的更简单的程序,但它是用于向上计数而不是向下计数。这是我根据以前的程序做的;

int j = 0;
            Console.WriteLine("By 100 Millions ");
            while (national_debt > 0)
            {
                Console.WriteLine(j.ToString());
                j = j - 100000000;
            }

但是,它只是无限循环运行,直到我关闭我的程序。我是否需要某种形式的休息,或者我是否需要完全重写我的循环?

对于初学者来说,我实际上会使用一个 for 循环,它可以递增和递减。对于递增 for 循环,C# 语法如下所示:

for (int i = 0; i < N; i++)
{
    // Put your logic here
}

但是,递减循环有点不同。使用您的示例:

for(long d = national_debt; d > 0; d--)
{
    // Put your logic here
}

希望这可以帮助您理解,并可能引导您解决问题。

一般来说,任何类型的循环都不是解决这个问题的有效计算方法,因为它可以用稍后演示的算术来解决。我假设您尝试按照您在问题中建议的 while 循环来解决它,这纯粹是 while 循环中的学习练习。话虽如此,您将需要您的循环条件取决于您正在修改的值。在您的情况下,您可以使其依赖于 j,并将 j 初始化为 national_debt 的起始值。这是一个使用更冗长的变量名称的更完整的示例:

using System;

namespace ConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            long initial_national_debt = 19900000000000;
            long national_debt = initial_national_debt;
            long payment_size = 100000000;

            while (national_debt > 0)
            {
                Console.WriteLine(national_debt);
                national_debt -= payment_size;
            }
        }
    }
}

@maccettura 提出的答案未能正确计算还清债务所需的天数。例如,如果债务为 100 美元,付款增量为 200 美元,则需要一天才能还清债务。然而,截断整数除法表示 100 / 200 等于零。在这种情况下,显然不需要零天就可以还清债务。

正如我之前提示的,这个问题可以直接解决。请参阅以下代码段:

using System;
namespace ConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            long national_debt = 19900000000000;
            long payment_size = 100000000;

            long total_days_to_pay = national_debt / payment_size;

            // if the debt is not evenly divisible by the payment size, then there is one partial day of debt
            if (national_debt % payment_size != 0)
                total_days_to_pay++;

            Console.WriteLine("It takes " + total_days_to_pay + " total days to pay off the national debt.");
            Console.WriteLine("That's " + total_days_to_pay / 365 + " years and " + total_days_to_pay % 365 + " days !");
        }
    }
}

我认为接受的答案不是很好。依赖于 incrementing/decrementing 数字的 while 循环通常意味着您不应使用 while 循环。处理这个问题的更好方法是使用 for 循环(并将其放在一个方法中,以便它可以重新使用)

private static void CalculatePayDownDays(long payPerDay, long nationalDebt)
{
    long days = (long)Math.Ceiling((decimal)nationalDebt / payPerDay);

    for (long i = 1; i < days + 1; i++)
    {
        nationalDebt -= payPerDay;
        Console.WriteLine("Day {0}, New Balance: {1:c}", i, nationalDebt);
    }
}

Fiddle here

编辑

对于我们这些迂腐的人,我稍微修改了方法