C# 确定是否可以使用预先设定的数字和时间生成数字

C# 确定是否可以使用预先设定的数字和时间生成数字,c#,asp.net,arrays,.net,vb.net,C#,Asp.net,Arrays,.net,Vb.net,我有两个数组,一个是将要使用的数字类型,第二个数组是该数字可以使用的次数。我有一个字母,它决定了将使用哪种方法。我需要计算出我可以使用数组中的某个数字多少次来确定字母+数字。我必须使用所有可用的数字来确定“数字”。如果号码无法生成,我想说的是号码无法生成,或者什么都可以,只允许程序继续。 这是我的 int[] picksToUse = { 100, 50, 20, 10, 5, 1 }; int[] timesToUse = { 10, 10, 10, 10, 10, 10 }; string

我有两个数组,一个是将要使用的数字类型,第二个数组是该数字可以使用的次数。我有一个字母,它决定了将使用哪种方法。我需要计算出我可以使用数组中的某个数字多少次来确定字母+数字。我必须使用所有可用的数字来确定“数字”。如果号码无法生成,我想说的是号码无法生成,或者什么都可以,只允许程序继续。 这是我的

int[] picksToUse = { 100, 50, 20, 10, 5, 1 };
int[] timesToUse = { 10, 10, 10, 10, 10, 10 };
string choice = Console.ReadLine();
string input = "";
if(choice.Length > 2)
{                    
     input = choice.Substring(choice.IndexOf("$") + 1);
}
if(...){
}
else if (choice.Equals("D")) 
{
     int amt = Convert.ToInt32(input);
 // code here to determine if number can be made with above choices
    Dispense(amt, timesToUse);
}

假设picksToUse和TimeTouse与您声明的完全相同,这里有一种方法可以知道您是否有足够的库存来“付清”。这是一个使用递归的布尔函数。你可以用所需的数量作为参数来调用它,它会告诉你,如果你拥有足够的一切

Private Function HasCashInStock(amount As Integer, Optional index As Integer = 0) As Boolean
    Dim billsNeeded As Integer = amount \ picksToUse(index)

    If billsNeeded > timesToUse(index) Then
        Return False
    End If

    amount -= picksToUse(index) * billsNeeded

    If amount = 0 Then
        Return True
    End If

    Return HasCashInStock(amount, index + 1)
End Function
\
是一个整数除法运算符(至少在VB.NET中-我无耻地让你翻译这段代码)。如果您不熟悉整数除法运算符,那么,当您将它与整数一起使用时,它会去掉浮点数

3/2
对整数无效,因为它将产生1.5

3\2
对整数有效,并将产生1

这就是全部,真的。哦,是的,还有递归。我喜欢递归,但其他人会告诉你尽量避免它。我能说什么呢,我认为一个好的递归函数具有优雅性

您还可以在另一次完全复制此函数,修改它并使用它从
timesToUse()
数组中进行减法,只要您确定有足够的东西可以支付

If HasCashInStock(HereIsTheAmountAsInteger) Then
    GivesTheMoney(HereIsTheAmountAsInteger)
End If

拥有两个函数并不是最精简的代码,但它更具可读性。玩得开心

这是我用来完成我的项目的

 public static bool Validate(int amount, int[] total, int[] needed)
    {
        int[] billCount = total;
        int[] cash = { 100, 50, 20, 10, 5, 1 };
        int total = amount;
        bool isValid = true;
        for (int i = 0; i < total.Length; i++)
        {
            if(total >= cash[i])
            {
                billCount[i] = billCount[i] - needed[i];
            }
            if(billCount[i] < 0)
            {
                isValid = false;
                break;
            }
        }
        return isValid;
    }
公共静态bool验证(需要整数金额、整数[]总计、整数[])
{
int[]billCount=总计;
int[]现金={100,50,20,10,5,1};
int总计=金额;
bool isValid=true;
对于(int i=0;i=现金[i])
{
billCount[i]=billCount[i]-需要的[i];
}
如果(billCount[i]<0)
{
isValid=false;
打破
}
}
返回有效;
}

我得到了一些工作代码。我是在上课的时候做的。我记得当我看不到什么是好的课程时。现在我没有课就不能刷牙了。:-)

我强迫自己做这些问题是为了获得一点C#方面的经验。现在我有三件事我喜欢C

类ATM
{
公共整数面额{get;set;}
公共int清单{get;set;}
公共ATM(int denom、int inven)
{
面额=denom;
存货=inven;
}
}
列表账单=新列表();
列表ATM=新列表();
私有void OP2()
{
int[]picksToUse={100,50,20,10,5,1};
foreach(picksToUse中的int d)
{
ATM=新的ATM(d,10);
自动取款机(atm);
}
//字符串sAmtRequested=Console.ReadLine();
字符串sAmtRequested=textBox1.Text;
if(内部三倍体(内部三倍体,外部三倍体))
{
int RunningBalance=AmtRequested;
做
{
ATM BillReturn=GetBill(运行余额);
如果(BillReturn为空)
{
MessageBox.Show(“无法完成交易”);
回来
}
RunningBalance-=BillReturn.面额;
}而(运行平衡>0);
}
其他的
{
Show(“非数字请求”);
回来
}
foreach(票据中的整数票据)
Debug.Print(bill.ToString());
调试。打印(“剩余库存”);
foreach(自动取款机中的自动取款机)
Debug.Print($“对于面额{atm.dential}还有{atm.Inventory}票据”);
}
私人ATM取款单(int请求余额)
{
var FilteredATMs=来自自动取款机中的自动取款机
其中atm.Inventory>0
按atm订购。面额递减
选择atm;
foreach(过滤数据中的ATM账单)
{
if(请求余额>=票据面额)
{
清单.存货-=1;
票据.添加(票据.面额);
退票;
}
}
返回null;
}

这不是JavaScript.C#但有着相同的思维方式来完成它。您是否有机会制作罗马数字?不,我像ATM一样做?收银机跟踪留下的账单,如果我用完了某张账单,因此无法输入我想要显示的数字无法生成。您可以共享一个示例输入吗?我有一个方法,这样我就可以得到我需要的账单数量,并且我还可以记录我剩下的所有账单。我想我需要一种方法,比如:publicstaticboolvalidate(int-amount,int[]total,int[]Needed){publicstaticboolvalidate(int-amount,int[]total,int[]Needed)我想在递归方面做得更好我会看看你的VB,看看我是否能验证我的分发()有了它,我的代码就可以使用数组的索引递归地查看你是否有你需要的每一张账单。它会返回true或false。一旦你完全知道你是否有账单,你就不必再验证它两次,所以你可以重复使用相同的方法,但这次稍微更改代码,而不是计算账单,而是从你的“银行”中减去它们(这个方法可能是无效的,因为你不需要返回任何东西,这只是“现在就做我们知道应该做的工作”部分)。
    class ATM
    {
        public int Denomination { get; set; }
        public int Inventory { get; set; }
        public ATM(int denom, int inven)
        {
            Denomination = denom;
            Inventory = inven;
        }
    }
    List<int> Bills = new List<int>();
    List<ATM> ATMs = new List<ATM>();
    private void OP2()
    {
        int[] picksToUse = { 100, 50, 20, 10, 5, 1 };
        foreach (int d in picksToUse )
        {
            ATM atm = new ATM(d, 10);
            ATMs.Add(atm);
        }
        //string sAmtRequested = Console.ReadLine();
        string sAmtRequested = textBox1.Text;
        if (int.TryParse(sAmtRequested, out int AmtRequested))
        {
            int RunningBalance = AmtRequested;
            do
            {
                ATM BillReturn = GetBill(RunningBalance);
                if (BillReturn is null)
                {
                    MessageBox.Show("Cannot complete transaction");
                    return;
                }
                RunningBalance -= BillReturn.Denomination;
            } while (RunningBalance > 0);
        }
        else
        {
            MessageBox.Show("Non-numeric request.");
            return;
        }
        foreach (int bill in Bills)
            Debug.Print(bill.ToString());
        Debug.Print("Remaining Inventory");
        foreach (ATM atm in ATMs)
            Debug.Print($"For Denomination {atm.Denomination} there are {atm.Inventory} bills remaining");
    }
    private ATM GetBill(int RequestBalance)
    {
        var FilteredATMs = from atm in ATMs
                           where atm.Inventory > 0
                           orderby atm.Denomination descending
                           select atm;

        foreach (ATM bill in FilteredATMs)
        {
            if (RequestBalance >= bill.Denomination )
            {
                bill.Inventory -= 1;
                Bills.Add(bill.Denomination);
                return bill;
            }
        }
        return null;
    }