C# 如何将2个受限十进制变量转换为第三个变量,反之亦然?

C# 如何将2个受限十进制变量转换为第三个变量,反之亦然?,c#,algorithm,decimal,rounding,C#,Algorithm,Decimal,Rounding,我有以下两种转换器方法: private const decimal MaxValidValue = 99.99m; public decimal ConvertABToC(decimal a, decimal b) { return a * b; } public void ConvertCtoAB(decimal c, ref decimal a, ref decimal b) { if (c > MaxValidValue*MaxValidValue) {

我有以下两种转换器方法:

private const decimal MaxValidValue = 99.99m;
public decimal ConvertABToC(decimal a, decimal b)
{
    return a * b;
}

public void ConvertCtoAB(decimal c, ref decimal a, ref decimal b)
{
    if (c > MaxValidValue*MaxValidValue)
    {
        throw new ApplicationException();
    }

    if (c <= MaxValidValue)
    {
        a = 1.00m;
        b = c;
    }
    else 
    {
        // need to introduce some logic or assumptions here
    }
}
private const decimal MaxValidValue=99.99m;
公共十进制转换器ABTOC(十进制a、十进制b)
{
返回a*b;
}
公共无效转换选项卡(十进制c、十进制a、十进制b)
{
如果(c>MaxValidValue*MaxValidValue)
{
抛出新的ApplicationException();
}

如果(cSkeet将间隔视为其本身的想法*100让一切变得更加清晰

这个问题确实没有一个完整的解决方案。它要求您创建一个双射函数f:axb->C,
其中A=B={0…9999}和C={0…9999*9999}

9999*9999=9998001;加上0,基数为9998002

A X B的基数为100000000

当域和余域具有不同的基数时,不能定义有限集上的双射函数。c的(A,b)分解将有多个解,其最大值为19998

回到最初的区间定义:最接近正确函数的是:

public decimal Ab2C(decimal a, decimal b)
{
    if(a != 99.99 and a != 99.98)
        return a*100 + b;
    return (100-a)*100 + b; // for instance;
}
在这种情况下,0.02到99.97之间的a值将给出唯一的结果;a=0.00或99.99将是相同的,同样,a=0.01或99.98。这两个值之间没有可能的区别

public void C2AB(decimal c, out decimal a, out decimal b)
{
    // todo: sanity checks.
    if (c <= 99.99)  // either a = 0.00, or a = 99.99; and b = c.
    {
        b = c;
        a = 0.00;
        return;
    }

    if (c <= 2*99.99)
    {
        b = c - 99.99;
        a = 0.01; // or 9.98.
        return;
    }
    a = c / 100;
    b = c % 100;
}
public void C2AB(十进制c、十进制a、十进制b)
{
//待办事项:健康检查。

如果(c将
c
乘以10000。然后将该数字分解为素数因子。然后将素数因子分成两组,使每组中的数字乘积小于10000。如果可以找到这样一个分区,则返回这两个乘积除以100的结果,如
a
B
。否则,添加请将一个连接到号码,然后重试

例如,如果
C=100.07
,那么因子是
2,2,5,5,10007
。因为其中一个产品必须包含因子
10007
,这是一个素数,第一个条件永远无法满足。因此,我们再次尝试使用
1000701=3*3*13*2851
。这一次,我们可以对该数字进行分区,我们得到了ode>A=3.51
B=28.51
作为可能的解决方案

最多可以执行99次。如果需要100次或更多,则不能从
ConvertABToC
生成输入值

这只能保证
ConvertCtoAB
的结果在反馈到
ConvertABtoC
时会产生相同的
C
,而不是相反。这似乎违反了规则#3,但其他地方的问题是四舍五入


如果根本不允许四舍五入,那么在尝试了原来的10000*C之后,应该停止并报告不可行。

我删除了我以前的答案,因为我认为它不再有用,因为随着时间的推移,问题发生了很大的变化

以下是我对问题的理解:

您将获得一个
decimal
类型的输入(
c
),以便:


  • 0一旦你把它转换成
    c
    ,就没有办法回到相同的
    a
    b
    @Femaref:好吧,当c=99.99*99.99时是这样的,但除此之外……是的。换句话说,如果你有
    a
    b
    的1.5和2或1和3,那么
    c
    就是3。如果
    c
    是3,
    a
    b
    可以是任何东西,除非你没有告诉我们规则。数据类型的精度和小数位数除外,
    c
    是无限多的
    a
    b
    组合的产物。a和b需要返回它们的原始值吗st必须有有效的值?例如,如果你有C=120,60*2和30*4都是有效的解决方案吗?@AnthonyPegram,是的,你是对的;我们应该引入一些规则。不确定确切的是什么。好吧,假设你已经将它乘以100,现在有了整数值。你如何用整数值来解析它?如果我不遵循Wi,这就是我得到的结果ki links…我想说的已经在文章中描述过了。你真是天才!为什么/如何在这个场景中增加一个数字?这并没有解决
    c
    可能违反规则2的问题,正如我在回答中指定的那样。也不清楚可逆性是否重要-这是在问题,但在这里确定要求就像是试图放养猫。我希望在采访中比这更清楚……可逆性并不重要,因为(1,3)和(3,1)如果这就是你的意思,Jon是可以接受的。为什么它可能违反规则2?它建议使用有意义的素数。@William:我的意思不止这些-你对任何因素满意吗?还有(2,2),(0.5,8)etc也是可以接受的?这不仅仅是关于反向配对-这是关于找到所有可能的因素对。至于违反规则2-你不能让
    a
    b
    的值为0.01,例如,因为
    c=a*b
    (规则3)违反规则2(c为0.00001,因此超过2dp).是的,请阅读规则4。我不确定Jeffrey的解决方案是如何将01添加到数字的右侧,如果重复5-10倍,数字就会变得如此巨大。