鱼C论坛

 找回密码
 立即注册
查看: 2378|回复: 15

[已解决]纠错。问题:求 1^2 + 2^3 + 3^4 + 4^5 + 5^6 的值?为啥我写的比正确答案少1?谢谢

[复制链接]
发表于 2022-8-26 12:02:36 | 显示全部楼层 |阅读模式

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

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

x
实际答案是16739.一下是我的中间代码,答案得到的是16738.哪里出错了呀?
…………………………………………完美分割线…………………………………………
        int i,temp;
        int sum=0;
        for(i=1;i<=5;i++)
        {
                temp=pow(i,i+1);
                sum+=temp;
        }
        printf("1^2+2^3+3^4+4^5+5^6=%d\n",sum);

…………………………………………完美分割线…………………………………………

感谢啄木鸟纠错,谢谢谢谢。


最佳答案
2022-8-26 12:39:09
本帖最后由 jackz007 于 2022-8-26 12:54 编辑

        问题出在 pow(5 , 6) = 15624,显然是错误的,正确值是 5 ^ 6 = 15625,整型数运算,最好避免用 pow()。
#include <stdio.h>

int main(void)
{
        int d , i , j , n                                ;
        for(n = 0 , i = 1 ; i < 6 ; i ++) {
                for(d = i , j = 0 ; j < i ; j ++) d *= i ;
                n += d                                   ;
        }
        printf("%d\n" , n)                               ;
}
        显然,正确答案是16739
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-8-26 12:12:09 | 显示全部楼层
我这边的执行结果就是16739
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-26 12:16:20 | 显示全部楼层
你这个没问题, 答案是对的
#include <bits/stdc++.h>
using namespace std;

int main(){
        int sum = 0;

        for(int i = 1; i <= 5; i++){
                sum += pow(i, i + 1);
        }

        printf("%d", sum);
        
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-26 12:39:09 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2022-8-26 12:54 编辑

        问题出在 pow(5 , 6) = 15624,显然是错误的,正确值是 5 ^ 6 = 15625,整型数运算,最好避免用 pow()。
#include <stdio.h>

int main(void)
{
        int d , i , j , n                                ;
        for(n = 0 , i = 1 ; i < 6 ; i ++) {
                for(d = i , j = 0 ; j < i ; j ++) d *= i ;
                n += d                                   ;
        }
        printf("%d\n" , n)                               ;
}
        显然,正确答案是16739
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-26 12:39:35 From FishC Mobile | 显示全部楼层
代码是对的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-26 13:45:19 | 显示全部楼层
int i,temp;
int sum=0;
for(i=1;i<=5;i++)
{
       temp=int(pow(i,i+1));
       sum+=temp;
}printf("1^2+2^3+3^4+4^5+5^6=%d\n",sum);
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-26 13:50:12 | 显示全部楼层
jackz007 发表于 2022-8-26 12:39
问题出在 pow(5 , 6) = 15624,显然是错误的,正确值是 5 ^ 6 = 15625,整型数运算,最好避免用 po ...

pow(5 , 6) = 15624 是在哪个编译器上出现的?这是编译器的bug吗?
新版本的gcc,pow(5 , 6) = 15625
$ cat main.c
#include <stdio.h>
#include <math.h>

int main(void) {
    int x = pow(5, 6);
    printf("%d\n", x);
    printf("%f\n", pow(5, 6));
    return 0;
}
$ gcc -g -Wall -o main main.c
$ ./main
15625
15625.000000
$ gcc --version
gcc (GCC) 12.1.1 20220730
Copyright (C) 2022 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

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

使用道具 举报

发表于 2022-8-26 13:52:36 | 显示全部楼层
亲~如果问题已解决别忘了设置最佳答案!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-26 13:57:59 | 显示全部楼层
本帖最后由 jackz007 于 2022-8-26 14:04 编辑
人造人 发表于 2022-8-26 13:50
pow(5 , 6) = 15624 是在哪个编译器上出现的?这是编译器的bug吗?
新版本的gcc,pow(5 , 6) = 15625


        编译器是 tdm-gcc
D:\[00.Exerciese.2022]\C>gcc --version
gcc (tdm-1) 5.1.0
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


D:\[00.Exerciese.2022]\C>
        楼主的代码用 VC 6.0 编译后的运行结果也是正确的,可能是 tdm-gcc 本身存在隐患,估计楼主的问题也同样是出在编译器上。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-26 14:06:30 | 显示全部楼层
jackz007 发表于 2022-8-26 13:57
编译器是 tdm-gcc

        楼主的代码用 VC 6.0 编译后的运行结果也是正确的,可能是 tdm-g ...

嗯,我感觉也是编译器的问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-26 14:12:13 | 显示全部楼层
jackz007 发表于 2022-8-26 13:57
编译器是 tdm-gcc

        楼主的代码用 VC 6.0 编译后的运行结果也是正确的,可能是 tdm-g ...

确实,我用tdm-gcc也出现了同样的问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-8-26 17:30:59 | 显示全部楼层
非常感谢各位啄木鸟的回答,谢谢谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-8-26 17:37:28 | 显示全部楼层
jackz007 发表于 2022-8-26 13:57
编译器是 tdm-gcc

        楼主的代码用 VC 6.0 编译后的运行结果也是正确的,可能是 tdm-g ...

感谢您的回答,我初学还有点不懂,我在同一个文件编写以下参考代码,编译运行的结果又是16739呢?
……………………………完美分割线……………………………………………
        int result;

        result=pow(1,2)+pow(2,3)+pow(3,4)+pow(4,5)+pow(5,6);

        printf("结果是:%d",result);

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

使用道具 举报

发表于 2022-8-26 19:35:32 | 显示全部楼层
本帖最后由 jackz007 于 2022-8-26 20:36 编辑
开心多巴胺 发表于 2022-8-26 17:37
感谢您的回答,我初学还有点不懂,我在同一个文件编写以下参考代码,编译运行的结果又是16739呢?
…… ...


       看来,问题就出在当 pow() 的两个参数是常数和变量时的计算结果存在着差异:
#include <stdio.h>
#include <math.h>

int main(void)
{
        int i = 5 , j = 6                              ;
        printf("pow(5 , 6) = %d\n" , (int) pow(5 , 6)) ;
        printf("pow(i , j) = %d\n" , (int) pow(i , j)) ;
}
        编译、运行实况:
D:\[00.Exerciese.2022]\C>g++ -o x x.c

D:\[00.Exerciese.2022]\C>x
pow(5 , 6) = 15625
pow(i , j) = 15624

D:\[00.Exerciese.2022]\C>
        下面,通过反汇编研究一下原因:
00401350  /$  55                         push    ebp
00401351  |.  89E5                       mov     ebp, esp
00401353  |.  83E4 F0                    and     esp, FFFFFFF0
00401356  |.  83EC 30                    sub     esp, 30
00401359  |.  E8 22060000                call    00401980
0040135E  |.  C74424 2C 05000000         mov     dword ptr [esp+2C], 5                     <--- i = 5
00401366  |.  C74424 28 06000000         mov     dword ptr [esp+28], 6                     <--- j = 6
0040136E  |.  C74424 04 093D0000         mov     dword ptr [esp+4], 3D09                   <--- pow(5 , 6) 的计算结果 0x3D09 = 15625
00401376  |.  C70424 24304000            mov     dword ptr [esp], 00403024                ;  ASCII "pow(5 , 6) = %d
"
0040137D  |?  E8 6E080000                call    <jmp.&msvcrt.printf>                      <--- printf()
00401382  |?  DB4424 28                  fild    dword ptr [esp+28]
00401386  |?  DB4424 2C                  fild    dword ptr [esp+2C]
0040138A  |?  D9C9                       fxch    st(1)
0040138C  |.  DD5C24 08                  fstp    qword ptr [esp+8]                        ; |
00401390  |.  DD1C24                     fstp    qword ptr [esp]                          ; |
00401393  |?  E8 60080000                call    <jmp.&msvcrt.pow>
00401398  |?  D97C24 1E                  fstcw   word ptr [esp+1E]
0040139C  |.  0FB74424 1E                movzx   eax, word ptr [esp+1E]                   ; |
004013A1  |?  B4 0C                      mov     ah, 0C
004013A3  |?  66:894424 1C               mov     word ptr [esp+1C], ax
004013A8  |.  D96C24 1C                  fldcw   word ptr [esp+1C]                        ; |
004013AC  |.  DB5C24 18                  fistp   dword ptr [esp+18]                       ; |
004013B0  |.  D96C24 1E                  fldcw   word ptr [esp+1E]                        ; |
004013B4  |.  8B4424 18                  mov     eax, dword ptr [esp+18]                  ; |
004013B8  |.  894424 04                  mov     dword ptr [esp+4], eax                   ; <--- 要显示的 pow(i , j) = 0x3D08 = 15624
004013BC  |?  C70424 35304000            mov     dword ptr [esp], 00403035                ;  ASCII "pow(i , j) = %d
"
004013C3  |?  E8 28080000                call    <jmp.&msvcrt.printf>                     <--- printf()
004013C8  |?  B8 00000000                mov     eax, 0
004013CD   ?  C9                         leave
004013CE   .  C3                         retn
004013CF   ?  90                         nop
       通过反汇编发现,pow(5 , 6) 的计算结果 15625 并非实际调用 pow() 计算而来,而是以一个常数的形式存在于可执行代码中,显然,这是编译器在编译代码的时候计算出了这个结果;而 pow(i , j) 的计算结果 15624 则是通过调用 pow() 函数而来,这就是两个结果存在差异的根本原因。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-8-26 21:10:24 | 显示全部楼层
jackz007 发表于 2022-8-26 19:35
看来,问题就出在当 pow() 的两个参数是常数和变量时的计算结果存在着差异:

        编译、 ...

哇瑟,太感谢你啦,虽然有些还看不懂,但大概明白啦,请接受小白的摩拜
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-27 15:47:12 | 显示全部楼层
偶数幂级数得结果必然是偶数
奇数幂级数得结果必然是奇数
3奇数 + 2偶数 = 奇数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-16 23:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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