我想找到任何数字的总因数。 在数论中,因式分解是将复合数分解为较小的非平凡除数,当它们相乘时等于原始整数。您的工作是计算一个数字的唯一分解数(包含至少两个大于一的正整数)。
例如:12有3个独特的因子分解:2 * 2 * 3,2 * 6,3 * 4。注意: 不认为3 * 4和4 * 3不同。
我试图找到这个,但并没有让所有人都准确。 这是我的代码:
#include<iostream>
using namespace std;
int count=0;
void factor(int n,int c,int n1)
{
for(int i=n1; i<n ; i++)
{
if(c*i==n)
{count++;
return;}
else
if(c*i>n)
return;
else
factor(n,c*i,i+1);
}
return;
}
int main()
{
int num,n;
cin>>num;
for(int i=0 ; i<num ; i++)
{
cin>>n;
count=0;
factor(n,1,1);
cout<<count<<endl;
}
return 0;
}
输入是测试用例的数量,后跟测试用例(数字)。
示例:输入:3 12 36 3150
输出:3 8 91
答案 0 :(得分:2)
我认为你正在寻找一些独特的数字因子分解。 为此,我认为你需要找到该数字的素数因子的数量。说
12 = 2, 2, 3
总数= 3; 对于2,2,3,我们需要
(2*2)*3 ~ 4*3
2*(2*3) ~ 2*6
2*2*3 ~ 2*2*3
为了解决这个问题,我们在Grimaldi,离散和组合数学中找到了想法。 要找到添加到数字(n)的方式的数量是2 ^(n-1)-1。对于3我们有......
3 =
1+1+1
2+1
1+2
总计数= 2 ^(3-1)-1 = 4-1 = 3
我们可以用类比来看
1+1+1 is equivalent to 2*2*3
1+2 is equivalent to 2*(2*3)
2+1 is equivalent to (2*2)*3
Say number of prime factors = n
So we have number of factorizations = 2^(n-1)-1
代码:
#include <stdio.h>
int power(int x, int y)
{
int prod =1, i ;
for(i=1; i<=y;i++) prod *= x;
return prod;
}
int main()
{
int number,div;
int count = 0, ti, t;
printf("Input: ");
scanf("%d",&t);
for(ti=1; ti<=t;ti++)
{
scanf("%d", &number);
div = 2;count = 0;
while(number != 0)
{
if(number%div!=0) div = div + 1;
else
{
number = number / div;
//printf("%d ",div);
count++;
if(number==1) break;
}
}
printf("%d ", power(2,count-1)-1);
}
return 0;
}
答案 1 :(得分:1)
使用mod
在尝试考虑因素时非常有用:
for(int i = 1; i <= fnum; ++i){ //where fnum is the number you wish to factor
if(!(fnum % i)) ++count;
}
return count;
交叉这是因素的数量,而不是唯一因素,如果你想要独特因素的数量,你必须做一些额外的工作。
答案 2 :(得分:0)
解决方案是要意识到所有排列中的一个排序。 2 * 4 * 7 * 3
与2 * 3 * 4 * 7
的结果相同。这意味着当您找到一个因素时,不应检查较低因子的余数。但是,您应该检查是否再次出现相同的因素:12 = 2 * 2 * 3
。序列2 2 3
也已排序。