题目:只使用处理I/O的printDigit函数,编写一个过程以输出任意实数。
思路:取得数的整数部分()和小数部分()。整数部分直接用类型强制转换,然后用数减去整数部分得到小数部分。
1.打印整数部分;
void printOut(int n) { if (abs(n) >= 10) { printOut(n / 10); printDigit(abs(n % 10)); } else printDigit(n); }
至于printDigit(),感觉有点鸡肋。为了迎合题目,加上了。
void printDigit(int n) { printf("%d", n % 10); }
2.如果小数部分不为0,则将小数点后六位转换成整数部分,将之打印。结束。
for (int i = 0; i < 6; i++) //小数点后六位转化为整数 decPart *= 10; intPart = abs((int)decPart); printOut(intPart); //打印转化后的小数部分
完整代码如下:
1 #define _CRT_SECURE_NO_WARNINGS 2 #include <stdio.h> 3 #include <stdlib.h> 4 #include <math.h> 5 6 void printDigit(int n); 7 void printOut(int n); 8 9 int main(void) 10 { 11 double n, decPart; //数和小数部分 12 int intPart; //整数部分 13 14 n = -214748.3647; 15 intPart = (int)n; 16 decPart = n - (double)intPart; 17 18 printOut(intPart); 19 if (decPart) 20 { 21 printf("."); 22 23 for (int i = 0; i < 6; i++) //小数点后六位转化为整数 24 decPart *= 10; 25 26 intPart = abs((int)decPart); 27 printOut(intPart); //打印转化后的小数部分 28 } 29 30 system("pause"); 31 return 0; 32 } 33 34 /*打印整数*/ 35 void printOut(int n) 36 { 37 if (abs(n) >= 10) 38 { 39 printOut(n / 10); 40 printDigit(abs(n % 10)); 41 } 42 else 43 printDigit(n); 44 } 45 46 /*打印1位*/ 47 void printDigit(int n) 48 { 49 printf("%d", n % 10); 50 }
为什么只打印小数点后6位,而不是全部——万一输入的数有8位小数呢?我们知道,大部分浮点数保存在计算机中都只是一个近似值,对小数部分有截位或进位。比如输入123.123123,内部可能存为123.12312300000001。所以只取前6位的。如果使用精确数值类型,就可以有效地避免这种精度丢失的问题。
如果您有更好的算法,欢迎交流。与前辈和爱好者学习是我的荣幸。谢谢!
最后,附上我参考的一位前辈的文章链接:
http://blog.csdn.net/fuzhengchao/article/details/7634589
时间: 2024-11-06 06:46:27