查找唯一分解的总数

时间:2013-11-13 03:53:39

标签: c++

我想找到任何数字的总因数。 在数论中,因式分解是将复合数分解为较小的非平凡除数,当它们相乘时等于原始整数。您的工作是计算一个数字的唯一分解数(包含至少两个大于一的正整数)。

  

例如: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

3 个答案:

答案 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 * 32 * 3 * 4 * 7的结果相同。这意味着当您找到一个因素时,不应检查较低因子的余数。但是,您应该检查是否再次出现相同的因素:12 = 2 * 2 * 3。序列2 2 3也已排序。

顺便说一句,你应该给你的变量更清晰的名字,或者至少添加一些描述它们的评论。

相关问题