首页 > 代码库 > 数据结构与算法分析(C语言描述)习题1.3
数据结构与算法分析(C语言描述)习题1.3
题目:只使用处理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 else43 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
数据结构与算法分析(C语言描述)习题1.3
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。