关于因式分解的问题


Pohlig-Hellman algorithm 中涉及到因式分解的问题,将一个数n分解成
n=(p1^a1)*(p2^a2)*....(pn^an),其中p是一个素数,比如36=2^2*3^3,而不是写成36=2*2*3*3,在c++里面如何实现,(因式分解目前好像只能用穷举法。)
现看到前人的一个程序,但有两个问题不知道如何解决:1.写成n=(p1^a1)*(p2^a2)*....(pn^an)这种形式如何实现?
2.输入的数字过大,就分解不了。程序附在后面,望高手指导。
急!!
新手第一次发帖,谢谢指教!!
因式分解程序 
*/

//#include "stdafx.h"
#include "stdio.h"
#include "math.h"
#include "iostream.h"

//判断是否为素数.
bool IsSuSu(long value)
{
    int i;
    bool j;
    if (value<=1)
    {
        return 0;
    }
    else
    {
        if (value==2)
        {
            return 1;
        }
        j=0;
        for (i=2;i<=(int)sqrt(value);i++)
        {
            if ((value%i)==0)
            {
                j=1;
                break;
            }
        }
        if (!j)
        {
            return 1;
        }
        else
        {
            return 0;
        }
    }
}

// 主程式
int main(int argc, char* argv[])
{
    int i;
    int n;
    int m;
    int c;

    while (1)
    {
        printf(" 请输入正整数(0退出):");
        scanf("%d",&n);

        if (n<=0)
        {
            break;
        }
        m=n;
        c=0;
        printf(" %d=",n);
        for (i=2;i<=n;i++)
        {
            if (IsSuSu(i))
            {
                while (m%i==0)
                {
                    c++;
                    if (c>1)
                    {
                        printf("*");
                    }
                    printf("%d",i);
                    m=m/i;
                }
                if (m==1)        //提前判断是否已经结束
                {
                    break;
                }
            }
        }
        printf(" 共%d个因子。 ",c);
    }
    return 0;
}

8 个解决方案

#1


考虑过加个数组统计相同的素数因子,但是不容易实现。盼望回复!!

#2


问题1,把结果进行排序,算出每一个因子的个数。如果你会用map,那么已经是现成的了
map<int, int> r,以"因子"为key。r[因子]++
问题2,分解不了是什么意思?大数的因式分解本来就是极慢极慢的。

#3


主函数修改了一下, c 改为统计功能就可以了:

    int i;
    int n;
    int m;
    int c;

    while (1)
    {
        printf(" 请输入正整数(0退出):");
        scanf("%d",&n);

        if (n<=0)
        {
            break;
        }
        m=n;
        c=0;
        printf(" %d = ",n);
        for (i=2;i<=n;i++)
        {
            if (IsSuSu(i))
            {
                while (m%i==0)
                {
                    c++;
                    m=m/i;
                }
                if(c>0)printf(" %d^%d * ", i, c);
                if (m==1)        //提前判断是否已经结束
                {
                    break;
                }
            }
        }
        printf("\b\b  共%d个因子。 \n\n",c);
    }

#4


有个小问题:
for (i=2;i<=n;i++)
        {
            if (IsSuSu(i))
            {
                c=0;         //!!! 每次从0开始累计
while (m%i==0)
                {
                    c++;
                    m=m/i;
                }
                if(c>0)printf(" %d^%d * ", i, c);
                if (m==1)        //提前判断是否已经结束
                {
                    break;
                }
            }
        }

#5


谢谢,现在才开始c++入门,所以不是很懂map(int,int)是什么?
谢谢楼上的各位。

#6


支持虫子^_^

#7


jixingzhong(瞌睡虫·星辰) ,c改为统计功能,但是运行出来的结果不对,有点看不懂。

#8


写个大整数处理,然后用递归.就行了.



注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
© 2014-2018 ITdaan.com 粤ICP备14056181号