鱼C论坛

 找回密码
 立即注册
查看: 2116|回复: 8

[已解决]请大神们帮忙看看这个程序一直不停运行并且不输出结果是哪里出了问题

[复制链接]
发表于 2019-5-2 22:29:15 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include <stdio.h>
int main()
{
    long long a = 600851475143,b,c,num = 0;
    for(b = 2;b < a/2;b++)
    {
        if(!(a%b))
        {
            for(c = 2;c <= b/2;c++)
            {
                if(!(b%c))
                {
                    break;
                }
                else if(c == b/2 && b > num)
                {
                    num = b;
                }
            }
        }
    }
    printf("600851475143的最大质数因子是:%lld\n",num);
    return 0;
}
最佳答案
2019-5-3 10:46:00
楼主的方法时间复杂度太高了,
试试这个吧,应该是秒算的
#include <stdio.h>
#include <math.h>
#define MAX_PRIME_COUNT 100000

int prime(int);
int isprime(int);

int prime(int n){
        if (n>MAX_PRIME_COUNT) return -1;
        static int nums[MAX_PRIME_COUNT]={2};
        static int size=1;
        while (n>=size){
                nums[size]=nums[size-1];
                while (!isprime(++nums[size]));
                ++size;
        }
        return nums[n];
}

int isprime(int num){
        int i;
        int s=sqrt(num);
        for (i=0;prime(i)<=s;++i){
                if (num % prime(i)==0) return 0;
        }
        return 1;
}

int maxprimefactor(long long a){
        int ret=1;
        int isprime=0;
        while (!isprime){
                int i;
                int s=sqrt(a);
                isprime=1;
                for (i=0;prime(i)<=s;++i){
                        if (a % prime(i)==0){
                                if (ret<prime(i)) ret=prime(i);
                                a/=prime(i);
                                isprime=0;
                                //printf("%d ",prime(i));
                                break;
                        }
                }
        }
        if (ret<a) ret=a;
        return ret;
}

int main(){
        long long a=600851475143;
        int b=maxprimefactor(a);
        printf("%lld的最大质因数是%d",a,b);
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-5-2 22:58:38 | 显示全部楼层
不可否认你的电脑是超级计算机。
搞个小点的数先试吧。要不然就想办法优化代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-5-2 23:01:42 | 显示全部楼层
是因为数字太大了? 小一点的数完全没问题的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-5-2 23:33:57 | 显示全部楼层

楼主的代码我的电脑最多只能算到10亿,再多一个零都不行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-5-3 05:26:41 | 显示全部楼层
不知道~坐等别人来解答~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-5-3 10:46:00 | 显示全部楼层    本楼为最佳答案   
楼主的方法时间复杂度太高了,
试试这个吧,应该是秒算的
#include <stdio.h>
#include <math.h>
#define MAX_PRIME_COUNT 100000

int prime(int);
int isprime(int);

int prime(int n){
        if (n>MAX_PRIME_COUNT) return -1;
        static int nums[MAX_PRIME_COUNT]={2};
        static int size=1;
        while (n>=size){
                nums[size]=nums[size-1];
                while (!isprime(++nums[size]));
                ++size;
        }
        return nums[n];
}

int isprime(int num){
        int i;
        int s=sqrt(num);
        for (i=0;prime(i)<=s;++i){
                if (num % prime(i)==0) return 0;
        }
        return 1;
}

int maxprimefactor(long long a){
        int ret=1;
        int isprime=0;
        while (!isprime){
                int i;
                int s=sqrt(a);
                isprime=1;
                for (i=0;prime(i)<=s;++i){
                        if (a % prime(i)==0){
                                if (ret<prime(i)) ret=prime(i);
                                a/=prime(i);
                                isprime=0;
                                //printf("%d ",prime(i));
                                break;
                        }
                }
        }
        if (ret<a) ret=a;
        return ret;
}

int main(){
        long long a=600851475143;
        int b=maxprimefactor(a);
        printf("%lld的最大质因数是%d",a,b);
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-5-3 19:04:37 | 显示全部楼层
/*
你这个题目的原型是质因数分解
输入90,打印出90=2*3*3*5。
代码如下
*/
#include <stdio.h>
int main()
{
    int n,k;
    printf("请输入一个正整数:");
    scanf("%d",&n);
    
    printf("%d=",n);
    
    for(k=2;k<=n;k++)
    {
        while(n%k==0)
        {
            printf("%d",k);
            n=n/k;
            if(n!=1)
            {
                printf("*");
            }
        }
        
    }
    printf("\n");
    return 0;
}

/*
输出结果:
请输入一个正整数:90
90=2*3*3*5
*/

/*
对上面的程序加以改进,只输出最后一个质因数即可
*/

#include <stdio.h>
int main()
{
    long long int n,t,k;
    printf("请输入一个正整数:");
    scanf("%lld",&n);
    t=n;
    
    //printf("%d=",n);
    
    for(k=2;k<=n;k++)
    {
        while(n%k==0)
        {
            //printf("%d",k);
            n=n/k;
            if(n==1)
            {
                printf("%lld的最大质因数是%lld\n",t,k);
            }
        }
        
    }
    return 0;
}

/*
请输入一个正整数:90
90的最大质因数是5
*/
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-5-3 19:12:37 | 显示全部楼层
我提供的方法应该复杂度应该能接受吧!
每一次分解出来的质因数,都不会比前一个大!
比如输入90
第一次判断范围是在2-90之间,质因数是2
第二次判断范围在2-90/2(2-45)之间,质因数是3
第三次判断范围在2-45/3(2-15)之间,质因数是3
第四次判断范围在2-15/3(2-5)之间,质因数是5
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2019-5-3 22:25:11 | 显示全部楼层
Croper 发表于 2019-5-3 10:46
楼主的方法时间复杂度太高了,
试试这个吧,应该是秒算的

这个程序能计算出结果,但是代码有点看不懂。。。。。。这是第一段考核的题目。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-17 03:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表