使用C中的POW函数反转五位数字

时间:2014-09-06 00:27:56

标签: c reverse pow

我有一个练习,需要一个使用pow恢复五位数的程序,这是我的尝试:

#include <math.h>
#include <stdio.h>
void main( void )
{
    int number, counter = 0, last_digit, reversed = 0;

    printf( "Please type a five digit number and I will reverse it\n" );
    scanf( "%d", &number );

    for( counter = 4; counter >= 0; counter-- )
    {
        last_digit = number % 10;
        number = number / 10;

        //printf( "%d %d %.0f %.0f\n\n", reversed, last_digit, pow ( 10, counter ), reversed + last_digit * pow( 10, counter ));

        reversed = reversed + last_digit * pow( 10, counter );
    }//end for

    printf( "The number reversed is %d", reversed );
}//end main

但是如果我输入12345它返回54320,那么最后一个数字是错误的!为了检查发生了什么,我在这里启用了printf注释,它是一个执行样本:

Please type a five digit number and I will reverse it
12345 

0 5 10000 50000 
49999 4 1000 53999 
53999 3 100 54299 
54299 2 10 54319 
54319 1 1 54320 

The number reversed is 54320

由于某种原因,第一个50000转换为49999,还有一个!奇怪的是它只是第一次发生,然后例如53999被正确转换为53999.这里发生了什么?

2 个答案:

答案 0 :(得分:1)

你可以使用round(pow(10,counter))

答案 1 :(得分:1)

正如其他评论者所说,问题在于四舍五入。 pow()返回一个double,pow(10,4)必须返回一个接近10000的双精度,但有一两次。然后在你的打印语句中,当你打印reversed + last_digit * pow( 10, counter )时,这个值是一个双倍,接近50000,但有点偏。打印时,printf会以打印到的精度进行舍入,因此打印为50000.但是当您指定整数reversed时,该值将被截断,如果它甚至低于50000,则会变为49999你的老师设计了一个非常好的问题 - 教得很好!