数据处理是程序设计的重要内容,而 数据转换则是数据处理的基础;
本章探讨几个有趣的数据转换问题,包括 分数化小数 、 数制转换 、 序号与代码转换 、 金额大写 、 以及简单的 加密解密处理 ;
接受一个N/D形式的分数,其中正整数N分子,正整数D为分母(约定N,D<200),输出它的小数形式,如果它的小数形式存在循环节,要将其用括号括起来,并计算输出循环节的位数;
例如: 1/3=.(3) ; 3/8=.375 ; 45/56=.803(571428) ;
1.说明:
模拟整数除法,反复地进行 求商 和 求余数 的运算,直到余数为0或出现循环节为止;
为比较方便,设置两个一维数组:
b数组存储试商过程中的商;
c数组存储试商过程中的余数;
设a为被除数,d为除数,试商过程中每一个商存放在b数组中,每一个余数存放在c数组中;
试商过程: a=c[k]*10 ; b[k]=a/d ; c[k+1]=a%d ;
我们应用余数相同来判断循环节,经k+1次试商的余数分别为c[1],c[2],……,c[k+1];若c[k+1]=c[j](j=1,2,……,k),则b[1],……,b[j-1]为循环节前的小数,循环节为b[j],……,b[k];
注意:
程序之所以把除数d的值作为试商次数k的上限,是因为循环节长度与循环节前小数长度之和总是小于d。其实,也可以不设上限,直到得出循环节才终止程序。
2.程序设计:
#include<stdio.h>
int main()
{
int a,d,n,r,i,j,k,t,u,c[200],b[200];
printf("input n,d:");
scanf("%d,%d",&n,&d);
a=n/d;
c[1]=n%d;
printf(" %d/%d=",n,d);
if(a!=0)
printf("%d",a); /*输出整数部分*/
printf(".");
for(k=1;k<=d;k++)
{
a=c[k]*10;
b[k]=a/d;
c[k+1]=a%d;
u=0; /*实施试商*/
if(c[k+1]==0) /*余数为0,打印小数*/
{
for(i=1;i<=k;i++)
printf("%d",b[i]);
break;
}
for(j=1;j<=k;j++)
{
if(c[k+1]==c[j]) /*余数相同,有循环节*/
{
for(t=1;t<j;t++)
printf("%d",b[t]); /*打印循环节前的小数*/
printf("(");
r=k-j+1;
for(t=j;t<=k;t++)
printf("%d",b[t]); /*打印循环节*/
printf("\n循环节共%d位",r);
u=1;
break;
}
}
if(u==1)
break;
}
}
3.程序运行示例及其注意事项:
input n,d:83,92
83/92=.90(2173913043478260869565
循环节共22位
input n,d:11,59
11/59=.(1864406779661016949152542372881355932203389830508474576271
循环节共58位