鱼C论坛

 找回密码
 立即注册
查看: 1708|回复: 7

[已解决]600851475143这么大的数在C语言中如何表示,设置成doule或者long long int取模运算...

[复制链接]
发表于 2019-12-31 14:40:14 | 显示全部楼层 |阅读模式

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

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

x
#include <stdio.h>
#include <stdbool.h>
//判断一个数是否为合数
bool isCompositeNum(long long int n){
    if(n<4){
        return false;
    }
    for(long long int  i = 2; i<n/2;i++){
        if(n%i == 0){
            return true;
        }
    }
    return false;
}
//判断一个数是否是质数
bool isPrimeNum(long long int  n){
    if(n == 1){
        return false;
    }
    for(long long int i = 2; i<n/2; i++){
        if(n%i == 0){
            return false;
        }
    }
    return true;
}
int main(int argc,char **argv)
{   
    long long int  num;
    printf("请输入一个合数\n:");
    scanf("%lf",&num);
    if(!isCompositeNum(num)){
        printf("输入有误!\n");
        return -1;
    }
    double tempPrimeNum = 0;
    for(long long int  i = 2; i < num/2; i++){
        if(num %i ==0){
            if(isPrimeNum(i)){
                tempPrimeNum = i;
            }
        }
    }
    printf("合数 %f 最大的质数因子是 :%lf\n",num,tempPrimeNum);
    return 0;
}
最佳答案
2019-12-31 21:28:11
本帖最后由 Croper 于 2019-12-31 22:07 编辑

600851475143在long long int的范围内啊,直接用long long不就行了么。。?

你的问题在于:
第一:
long long int  num;
    printf("请输入一个合数\n:");
    scanf("%lf",&num);
long long的格式化字符串是%lld,不是%lf。

第二:
 for(long long int  i = 2; i < num/2; i++){
        if(num %i ==0){
            if(isPrimeNum(i)){
                tempPrimeNum = i;
            }
        }
    }
这一段的时间复杂度已经到了O[n^2]的水平,
换句化说,你可以自己估计一下大概要循环多少次,你的电脑要花多少时间来算这一段

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-12-31 15:07:15 | 显示全部楼层
本帖最后由 wp231957 于 2019-12-31 15:12 编辑

我帮你分解因子了(但不是用c做的)

600851475143=71*839*1471*6857
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-31 17:46:58 | 显示全部楼层
wp231957 发表于 2019-12-31 15:07
我帮你分解因子了(但不是用c做的)

600851475143=71*839*1471*6857

非常感谢您的解答!请教您一下这个分解因子的思路是怎样的了?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-31 17:48:59 From FishC Mobile | 显示全部楼层
guoquanli 发表于 2019-12-31 17:46
非常感谢您的解答!请教您一下这个分解因子的思路是怎样的了?

呵呵,没啥思路,python比这再大的数也是支持的,所以简单枚举就可以
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-31 17:56:01 From FishC Mobile | 显示全部楼层
guoquanli 发表于 2019-12-31 17:46
非常感谢您的解答!请教您一下这个分解因子的思路是怎样的了?

c里想玩这个费点劲,c++里面貌似有个大数库
但是c里面貌似没有
除非自己写一个字符串加减乘除法???
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-31 21:28:11 | 显示全部楼层    本楼为最佳答案   
本帖最后由 Croper 于 2019-12-31 22:07 编辑

600851475143在long long int的范围内啊,直接用long long不就行了么。。?

你的问题在于:
第一:
long long int  num;
    printf("请输入一个合数\n:");
    scanf("%lf",&num);
long long的格式化字符串是%lld,不是%lf。

第二:
 for(long long int  i = 2; i < num/2; i++){
        if(num %i ==0){
            if(isPrimeNum(i)){
                tempPrimeNum = i;
            }
        }
    }
这一段的时间复杂度已经到了O[n^2]的水平,
换句化说,你可以自己估计一下大概要循环多少次,你的电脑要花多少时间来算这一段

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-31 22:34:34 From FishC Mobile | 显示全部楼层
Croper 发表于 2019-12-31 21:28
600851475143在long long int的范围内啊,直接用long long不就行了么。。?

你的问题在于:

还可以优化的,用不了那么多次循环
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-31 22:55:04 | 显示全部楼层
wp231957 发表于 2019-12-31 22:34
还可以优化的,用不了那么多次循环

当然可以优化。。我是引用的楼主的代码。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-5 05:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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