C趣味程序百例(14)计算分数的精确值

文章作者 100test 发表时间 2007:03:10 17:32:03
来源 100Test.Com百考试题网


47.计算分数的精确值
使用数组精确计算M/N(0*问题分析与算法设计
由于计算机字长的限制,常规的浮点运算都有精度限制,为了得到高精度的计算结果,就必须自行设计实现方法。
为了实现高精度的计算,可将商存放在一维数组中,数组的每个元素存放一位十进制数,即商的第一位存放在第一个元素中,商的第二位存放在第二个元素中....,依次类推。这样就可以使用数组不表示一个高精度的计算结果。
进行除法运算时可以模拟人的手工操作,即每次求出商的第一位后,将余数乘以10,再计算商的下一位,重复以上过程,当某次计算后的余数为0 时,表示M/N为有限不循环小数某次计算后的余数与前面的某个余数相同时,则M/N为无限循环小数,从该余数第一次出现之后所求得的各位数就是小数的循环节。
程序具体实现时,采用了数组和其它一些技巧来保存除法运算所得到的余数和商的各位数。
*程序与程序注释
#include
int remainder[101],quotient[101]. /*remainder:存放除法的余数; quotient:依次存放商的每一位*/
void main()
{
int m,n,i,j.
printf("Please input a fraction(m/n)(<0 scanf("%d/%d",&.m,&.n). /*输入被除数和除数*/
printf("%d/%d its accuracy value is:0.",m,n).
for(i=1.i<=100.i ) /*i: 商的位数*/
{
remainder[m]=i. /*m:除的余数 remainder[m]:该余数对应的商的位数*/
m*=10. /*余数扩大10位*/
quotient[i]=m/n. /*商*/
m=m%n. /*求余数*/
if(m==0) /*余数为0 则表示是有限小数*/
{
for(j=1.j<=1.j ) printf("%d",quotient[j]). /*输出商*/
break. /*退出循环*/
}
if(remainder[m]!=0) /*若该余数对应的位在前面已经出现过*/
{
for(j=1.j<=i.j ) printf("%d",quotient[j]). /*则输出循环小数*/
printf("\n\tand it is a infinite cyclic fraction from %d\n",remainder[m]).
printf("\tdigit to %d digit after decimal point.\n",i).
/*输出循环节的位置*/
break. /*退出*/
}
}
}
*运行结果



*思考题
使用数组实现计算MXN的精确值


相关文章


2006年9月全国计算机等级考试二级笔试试卷
国家计算机等级考试-常见问题
C趣味程序百例(14)计算分数的精确值
国家计算机等级考试-合格证书
C趣味程序百例(14)将真分数分解为埃及分数
报考指南江西省考点介绍
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛