分数化小数

数据处理是程序设计的重要内容,而 数据转换则是数据处理的基础

本章探讨几个有趣的数据转换问题,包括 分数化小数数制转换序号与代码转换金额大写 、 以及简单的 加密解密处理


接受一个N/D形式的分数,其中正整数N分子,正整数D为分母(约定N,D<200),输出它的小数形式,如果它的小数形式存在循环节,要将其用括号括起来,并计算输出循环节的位数;

例如: 1/3=.(3)3/8=.37545/56=.803(571428)

1.说明:

模拟整数除法,反复地进行 求商求余数 的运算,直到余数为0或出现循环节为止;

为比较方便,设置两个一维数组:

  • b数组存储试商过程中的商

  • c数组存储试商过程中的余数

设a为被除数,d为除数,试商过程中每一个商存放在b数组中,每一个余数存放在c数组中;

试商过程: a=c[k]*10b[k]=a/dc[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位
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值