| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 11459 人关注过本帖, 2 人收藏
标题:如何实现将任意一个整数分解为素数之积
只看楼主 加入收藏
wang155423
Rank: 6Rank: 6
等 级:侠之大者
帖 子:216
专家分:408
注 册:2011-9-4
结帖率:100%
收藏(2)
已结贴  问题点数:20 回复次数:12 
如何实现将任意一个整数分解为素数之积
最近学算术基本定理,想用C程序实现它,即输入任意正整数(>1),将该整数分解为素数之积,例如10=2*5,12=2*2*3,18=2*3*3,按类似格式输出结果。。想了很久没能做到完全分解,希望高手能给予指导,一起讨论,不甚感激。。。。
搜索更多相关主题的帖子: 正整数 如何 
2011-12-09 21:55
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:10 
因数分解好像到现在也没有很好的算法,也许我才疏学浅,有知道的还请不吝赐教。
写一段代码抛砖引玉吧。没有使用筛法求素数是不想消耗太多的内存
程序代码:
#include<stdio.h>
#define SIZE    10000
int prime[SIZE];
void init()
{
    int i, a, n;
    prime[0] = 2;
    for(n = 1, a = 3; n < SIZE; a += 2)
    {
        for(i = 0; i < n; i++)
            if(a % prime[i] == 0) break;
        if(i == n) prime[n++] = a;
    }
}
void print(int a)
{
    int i;
    printf("%d = ", a);
    for(i = 0; i < SIZE && a % prime[i]; i++);
    if(i == SIZE)
    {
        printf("over flow.\n");
        return;
    }
    printf("%d", prime[i]);
    for(a /= prime[i]; a > 1 && i < SIZE; i++)
        for(; a % prime[i] == 0; a /= prime[i])
            printf(" * %d", prime[i]);
    printf("\n");
    if(a > 1) printf("over flow.\n");
}
int main()
{
    int a;
    init();
    printf("input number : ");
    scanf("%d", &a);
    print(a);
    return 0;
}

重剑无锋,大巧不工
2011-12-09 22:46
于祥
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:5
帖 子:1047
专家分:4132
注 册:2011-4-24
收藏
得分:0 
顶2L

最基础的往往是你最容易忽略的!
2011-12-09 22:53
laznrbfe
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:482
专家分:1599
注 册:2011-5-22
收藏
得分:7 
程序代码:
#include<stdio.h>
int main()
{
    int n=0,i,t=1,s=1,temp;
    int sushu(int m);
    printf("Input a number(>1):");
    scanf("%d",&n);
    printf("%d=",n);
    temp=n;
    if(sushu(n)==1)
    {
        printf("%d",n);
    }
    else
    {
        do
        {
            for(i=2;i<=temp/2;i++)
            {
                if(sushu(i)==1&&temp%i==0)
                {
                    if(t==1)
                    {
                        printf("%d",i);
                        t=0;
                    }
                    else
                    {
                        printf("*%d",i);
                    }
                    s*=i;
                    temp=temp/i;
                    if(sushu(temp)==1)
                    {
                        printf("*%d",temp);
                        s*=temp;
                    }
                    break;
                }
            }
        }while(n>s);
    }
    printf("\n");
    return 0;
}
int sushu(int m)//验证是否为素数
{
    int i=2,flag=1;
    for(;i<=m/2;i++)//查找到二分之一时就可以结束了
        if(m%i==0)
        {
            flag=0;//不是素数,标示量设置为1
            break;
        }
    return flag;//返回标示量,1表示是素数,0相反
}
2011-12-09 23:31
laznrbfe
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:482
专家分:1599
注 册:2011-5-22
收藏
得分:0 
回复 2楼 beyondyf
请问兄台你学习算法都看些什么书?
2011-12-09 23:35
zy_space
Rank: 5Rank: 5
等 级:职业侠客
帖 子:163
专家分:364
注 册:2011-11-14
收藏
得分:2 
手机码字不太方便,写下大致思路:
1.首先用一个变量t存储输入的值
2.接着从i = 2开始进行循环,先用函数isPrime()判断i是否是素数,是则继续下一步,不是则continue,i++;
3.接着判断i能否整除t,能则把i存到一个数组中去,同时t /= i, 然后把i的值重置为2;
4.t > 1时循环以上步骤
。。。。
主要步骤就这些,中学信息竞赛的题里面好像有这道,当时我弟上课的时候我也去了,回去在电脑里面翻一翻没准可以翻出来==

何必等待?梦在今朝
2011-12-09 23:44
tianqiao
Rank: 2
等 级:论坛游民
帖 子:80
专家分:55
注 册:2011-9-21
收藏
得分:1 
程序代码:
#include<stdio.h>
int main()
{
    int i=2,sum,d;
    scanf("%d",&sum);
    printf("%d=",sum);
    while(i<sum){
        if(sum%i!=0)
            i=i+1;
        if(sum%i==0){
            sum=sum/i;
            if(sum==1)break;
        printf("%d*",i);
        }
        if(sum==i){
            i-=1;
        }
    }
    if(sum==1)
        d=sum*i;
    printf("%d",d);
    return 0;
}我也想了一个,但是有限制,望指教
2011-12-10 07:44
tianqiao
Rank: 2
等 级:论坛游民
帖 子:80
专家分:55
注 册:2011-9-21
收藏
得分:0 
如果上面的int 改为long long 更好一点
2011-12-10 07:55
wang155423
Rank: 6Rank: 6
等 级:侠之大者
帖 子:216
专家分:408
注 册:2011-9-4
收藏
得分:0 
回复 2楼 beyondyf
恕我愚钝,你的算法思路我确实没看明白,能否再加点解释。。。。不甚感激。。。
2011-12-10 19:35
laznrbfe
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:482
专家分:1599
注 册:2011-5-22
收藏
得分:0 
回复 7楼 tianqiao
膜拜。。。兄弟平时看些什么书?有关算法的。
2011-12-11 20:18
快速回复:如何实现将任意一个整数分解为素数之积
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.027945 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved