我有一个练习,需要一个使用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.这里发生了什么?
答案 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你的老师设计了一个非常好的问题 - 教得很好!