C# 得到X个整数,这些整数可以相乘,接近Y
这很难用标题来解释,但基本上我已经创建了一个系统,输入一些数字N,输出两个数字(不包括1和N),它们可以相乘,尽可能接近N(在上面而不是下面) 这里有几个例子:C# 得到X个整数,这些整数可以相乘,接近Y,c#,math,multiplication,factoring,C#,Math,Multiplication,Factoring,这很难用标题来解释,但基本上我已经创建了一个系统,输入一些数字N,输出两个数字(不包括1和N),它们可以相乘,尽可能接近N(在上面而不是下面) 这里有几个例子: 二十五→ 5 & 5. 四十→ 5 & 8. 五十三→ 6 & 9. 十三,→ 2号和7号 我有一个方法Factor,它返回一个包含X和X的所有因子的列表。这个代码也不需要处理大的数字,所以我通过检查它是否在素数列表中来测试素数 执行此操作的代码如下所示: if (primes.Contains(N))
- 二十五→ 5 & 5. 李>
- 四十→ 5 & 8. 李>
- 五十三→ 6 & 9. 李>
- 十三,→ 2号和7号
Factor
,它返回一个包含X和X的所有因子的列表。这个代码也不需要处理大的数字,所以我通过检查它是否在素数列表中来测试素数
执行此操作的代码如下所示:
if (primes.Contains(N))
N++;
List<int> facts = Factor(N);
double root = Math.Sqrt(N);
int cl1;
int cl2;
if (root == (int)root)
{
cl1 = (int)root;
cl2 = (int)root;
}
else if (N == 2)
{
cl1 = 1;
cl2 = 2;
}
else
{
cl1 = facts.Aggregate((x, y) => Math.Abs(x - root) < Math.Abs(y - root) ? x : y);
facts.Remove(cl1);
cl2 = facts.Aggregate((x, y) => Math.Abs(x - root) < Math.Abs(y - root) ? x : y);
}
if(素数包含(N))
N++;
列出事实=系数(N);
双根=数学Sqrt(N);
int cl1;
int-cl2;
如果(根==(int)根)
{
cl1=(int)根;
cl2=(int)根;
}
else如果(N==2)
{
cl1=1;
cl2=2;
}
其他的
{
cl1=事实.聚合((x,y)=>Math.Abs(x-root)Math.Abs(x-root)
有什么好的方法可以概括这一点,这样它可以给出三个输出,或者四个、五个或九个输出?(显然,我会用数组替换
cl1
和cl2
,但我的意思是代码方面的)获取N的所有因子是一个非常昂贵的操作。这样做实际上会更快(伪代码):
维护记录列表的最佳方法取决于您需要多少记录。打那个号码M
如果只是几个,那么你可以把它们放在一个列表中,每当列表大小达到2M时,按错误排序并截断为M
如果数量很大,则首先将它们放入具有最大错误的优先级队列中,并且每当大小>M时,移除错误最大的队列。最后,你可以按相反的顺序取出它们,并向后填充输出数组,因为你不需要处理大量的数字,简单地从目标开始获取所有非素数的因子,并检查因子的数目是否大于或等于目标可能是一种更简单的方法…@AlexeiLevenkov:使用记忆,为了改进搜索,你可以使用这种方法。如果你把两个作为特例,那么一种能有效解决这个问题的算法(对于任何比特长度)也能分解大的半素数。因此,您不应该期望能够找到一个有效的算法来实现这一点。
For p = floor(sqrt(N)); p>1; --p:
q = ceil(N/p);
error = p*q-N; //always positive
record=make_tuple(p,q,error);
//... remember the records with the smallest error