Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 得到X个整数,这些整数可以相乘,接近Y_C#_Math_Multiplication_Factoring - Fatal编程技术网

C# 得到X个整数,这些整数可以相乘,接近Y

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))

这很难用标题来解释,但基本上我已经创建了一个系统,输入一些数字N,输出两个数字(不包括1和N),它们可以相乘,尽可能接近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