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倍,数字就会变得如此巨大。