nswz678 2024-10-04 21:34 采纳率: 0%
浏览 24

阶乘倍数输出结果时的问题

一道已知K是一个大于或等于2的整数,求最小正整数N,使得N!是K的倍数。


#include <stdio.h>
int gcd(int a,int b){
    while(b != 0){
        int temp = a % b;
        a = b;
        b = temp;
    }
    return a;
}

int isPrime(int n){
    if(n <= 1)return 0;
    for(int i = 2;i * i <= n;i++) {
        if(n % i == 0)return 0;
    }
    return 1;
}

int main(void){
     long long int p;
    scanf("%lld",&p);
    if(p == 1 || isPrime(p) == 1)printf("%lld",p);
    else{
        for(int i = 2;;i++) {
            int divisor = gcd(i, p);
            if(divisor != 1){
                p /= divisor;
                if(p == 1) {
                    printf("%lld",i);
                    break;
                }
                if(i < p && isPrime(p)){
                    printf("%lld",p);
                    break;
                }
            }
        }
    }
    return 0;
}

代码没有问题,但是在输入比较大的数(十位数),运行结果就是错误的,(用c++就没有问题)

#include<iostream>
using namespace std;
long long int p;
bool isPrime(int p){
    if(p == 1) return false;
    for (int i = 2; i*i <= p; i++) {
        if(p % i == 0) return false;
    }
    return true;
}
int gcd(int a,int b){
    if(b == 0) return a;
    return gcd(b,a%b);
}
int main(){
    cin>>p;
    if (p == 1 || isPrime(p)) {
    cout<<p;
    }
    else{
    for (int i = 2; ; i++) {
        if (gcd(i,p) != 1) {
            p /= gcd(i,p);
            if (p == 1) {
            cout<<i;
            break;
            }
            if (i < p && isPrime(p)) {
            cout<<p;
            break;
            }
 
        }
 
    }
    }
return 0;
}


```麻烦哪位大佬帮忙解决一下
  • 写回答

1条回答 默认 最新

  • 一轮明月照丘壑 2024-10-04 21:35
    关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    首先,关于你提到的代码问题,主要是涉及到处理大整数时的问题。对于大整数(超过基本数据类型int或long long int的容量),需要使用特殊的数据结构或库来处理。在这种情况下,即使你的算法是正确的,但由于数据类型的问题,它可能无法正确地处理大整数输入。在C++中,你可能使用了某种方式来处理大整数,这就是为什么在输入较大的数时,C++代码可以正常工作的原因。至于你使用的C语言代码版本,可能没有处理大整数的方式,因此在处理较大的输入时会遇到问题。在这种情况下,有两种解决方案。一种解决方案是找到适合C语言的大整数库来处理这个问题。另一种解决方案是将问题简化为更小的规模,例如使用更小的数据类型来存储数值。关于你的代码逻辑部分,我认为可能存在一些问题。首先让我们回顾一下问题:求最小的正整数N使得N的阶乘是给定数K的倍数。你的代码试图通过寻找N和K的最大公约数来解决问题。然后不断除以这个公约数直到得到最大的N值使得N的阶乘是K的倍数。但是,这种逻辑并不总是正确的。对于某些输入值,你的代码可能无法正确找到答案。正确的做法是计算给定数的阶乘并将其除以给定数,以查看它是否为该数的倍数。然后逐渐增大阶乘值直到找到最小的正整数使得它的阶乘是给定数的倍数。基于上述讨论,以下是修正后的C语言代码示例:

    #include <stdio.h>
    
    long long int factorial(int n){
        long long int fact = 1;
        for(int i = 2; i <= n; i++){
            fact *= i;
        }
        return fact;
    }
    
    int main(){
        long long int k, n = 1; //初始化n为1,因为题目要求的是最小正整数N
        scanf("%lld", &k); //读取输入的K值
        while (factorial(n) % k != 0){ //当n的阶乘不是k的倍数时增加n的值
            n++;
        }
        printf("%lld", n); //输出找到的最小正整数N值使得其阶乘是K的倍数
        return 0;
    }
    ``` 这是一个基本的实现方式,并未进行输入值大小的判断以避免超出长整型数据的表示范围问题,所以对于极大的输入可能需要更加复杂的方法来解决例如引入高精度计算的库或者按照指定的大数输入输出格式进行计算和处理数据溢出等问题同时代码中没有对特殊值比如阶乘因子很大但是并未足够将待求的阶乘变得远大于需要计算的输入数字导致的未整除等情形做足够的处理所以在实际使用中需要根据具体需求进行改进和优化
    
    评论

报告相同问题?

问题事件

  • 创建了问题 10月4日

悬赏问题

  • ¥500 把面具戴到人脸上,请大家贡献智慧
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。
  • ¥15 各位 帮我看看如何写代码,打出来的图形要和如下图呈现的一样,急
  • ¥30 c#打开word开启修订并实时显示批注
  • ¥15 如何解决ldsc的这条报错/index error
  • ¥15 VS2022+WDK驱动开发环境
  • ¥30 关于#java#的问题,请各位专家解答!
  • ¥30 vue+element根据数据循环生成多个table,如何实现最后一列 平均分合并
  • ¥20 pcf8563时钟芯片不启振
  • ¥20 pip2.40更新pip2.43时报错