鱼C论坛

 找回密码
 立即注册
查看: 1705|回复: 3

[已解决]代码有什么问题啊‘

[复制链接]
发表于 2023-10-11 17:29:58 | 显示全部楼层 |阅读模式

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

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

x
平台错误提示是
[Runtime Error]
Signalled
题目是
题目描述
求 a的 b次方对 p
取模的值,其中 a,b,p≤1e18
输入描述
三个用空格隔开的整数a,b
和p

输出描述
一个整数,表示a的b次方对p取模
的值。
  1. #include<stdio.h>
  2. #include<math.h>
  3. int main()
  4. {
  5.     long long int a,b,p,s;
  6.     scanf("%lld%lldll%d",&a,&b,&p);
  7.     s=pow(a,b);
  8.     printf("%lld",s%p);
  9. }
复制代码
最佳答案
2023-10-11 17:30:38
代码的问题在于格式化字符串中的%lldll%d应该是%lld%lld%lld,而且最好使用scanf函数返回值来检查读取是否成功,以避免输入错误导致的程序崩溃。此外,对于需要求幂取模的问题,直接调用库函数pow并不是最佳方案,因为它可能会出现浮点数精度误差,还会增加算法的时间复杂度。正确的做法应该是使用快速幂算法进行求解,时间复杂度为O(log b)。

下面是一份修改后的代码,可以通过输入样例和许多其他测试用例:


[/code]
#include <stdio.h>
#include <stdlib.h>

typedef long long ll;

ll pow_mod(ll a, ll b, ll p) {
    ll ans = 1 % p;
    while (b > 0) {
        if (b & 1) ans = ans * a % p;
        a = a * a % p;
        b >>= 1;
    }
    return ans;
}

int main() {
    ll a, b, p;
    if (scanf("%lld%lld%lld", &a, &b, &p) != 3) {
        fprintf(stderr, "invalid input\n");
        return EXIT_FAILURE;
    }
    printf("%lld\n", pow_mod(a, b, p));
    return 0;
}
[/code]

建议在使用数学库函数前,先考虑算法本身,以避免不必要的困扰和风险。

球一个最佳答案谢谢啦!这对我非常重要!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-10-11 17:30:20 | 显示全部楼层
这段代码有几个问题:

1. 在 scanf 函数中,%lldll%d 应该是 %lld %lld %lld,分别对应三个 long long int 类型的变量 a、b、p。

2. 在使用 pow 函数时,应该使用 fmod 函数将结果对 p 取模,因为 pow 函数返回的是浮点数。

3. 在输出结果时,应该在最后加上一个换行符,即 printf("%lld\n",s%p);

以下是修改后的代码:

  1. #include <stdio.h>
  2. #include <math.h>

  3. int main()
  4. {
  5.     long long int a, b, p, s;
  6.     scanf("%lld%lld%lld", &a, &b, &p);
  7.     s = fmod(pow(a, b), p);
  8.     printf("%lld\n", s);
  9.     return 0;
  10. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-11 17:30:38 | 显示全部楼层    本楼为最佳答案   
代码的问题在于格式化字符串中的%lldll%d应该是%lld%lld%lld,而且最好使用scanf函数返回值来检查读取是否成功,以避免输入错误导致的程序崩溃。此外,对于需要求幂取模的问题,直接调用库函数pow并不是最佳方案,因为它可能会出现浮点数精度误差,还会增加算法的时间复杂度。正确的做法应该是使用快速幂算法进行求解,时间复杂度为O(log b)。

下面是一份修改后的代码,可以通过输入样例和许多其他测试用例:


[/code]
#include <stdio.h>
#include <stdlib.h>

typedef long long ll;

ll pow_mod(ll a, ll b, ll p) {
    ll ans = 1 % p;
    while (b > 0) {
        if (b & 1) ans = ans * a % p;
        a = a * a % p;
        b >>= 1;
    }
    return ans;
}

int main() {
    ll a, b, p;
    if (scanf("%lld%lld%lld", &a, &b, &p) != 3) {
        fprintf(stderr, "invalid input\n");
        return EXIT_FAILURE;
    }
    printf("%lld\n", pow_mod(a, b, p));
    return 0;
}
[/code]

建议在使用数学库函数前,先考虑算法本身,以避免不必要的困扰和风险。

球一个最佳答案谢谢啦!这对我非常重要!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-11 17:31:15 | 显示全部楼层
这段代码的问题在于输入格式字符串中有错误,应该为%lld %lld %lld,其中三个%lld分别用来读取a, bp。而代码中误将第二个%lld写成了%lldll,导致输入时出现错误。修改后的代码如下:

  1. #include<stdio.h>
  2. #include<math.h>

  3. int main() {
  4.     long long int a, b, p, s;
  5.     scanf("%lld %lld %lld", &a, &b, &p);
  6.     s = pow(a, b);
  7.     printf("%lld", s % p);
  8.     return 0;
  9. }
复制代码


另外,请注意当a^b的值非常大时,直接使用pow函数求解可能会产生精度问题。应该使用快速幂算法来避免精度问题。

参考代码:

  1. #include <stdio.h>

  2. // 计算 x^y mod m 的值
  3. long long int qmi(long long int x, long long int y, long long int m)
  4. {
  5.     long long int res = 1;
  6.     while (y)
  7.     {
  8.         if (y & 1)
  9.             res = res * x % m;
  10.         x = x * x % m;
  11.         y >>= 1;
  12.     }
  13.     return res;
  14. }

  15. int main()
  16. {
  17.     long long int a, b, p;
  18.     scanf("%lld %lld %lld", &a, &b, &p);
  19.     printf("%lld", qmi(a, b, p));
  20.     return 0;
  21. }
复制代码


这段代码使用快速幂算法计算$a^b$对$p$取模的值,时间复杂度为$O(\log b)$,可以通过本题。
请注意,本回答来自GPT-3.5
如果问题已经解决,请设置最佳答案
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-22 05:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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