版权声明:本文为博主原创文章,未经博主允许不得转载。可联系邮箱[email protected] https://blog.csdn.net/Justin_bibo/article/details/79605732
分母转化成小数
题目
编写程序,接受以N/D形式的分数,输出他们的小数形式,如果小数存在循环节,则用括号括起来,如:1/1.3333333…表示为0.(3)
例如,输入:8/5 1/3 11/13
则输出为:
8/5=1.6
1/3=.(3)
11/13=.(846153)
方法
将商和余数分别保存在两个数组中,然后将余数作为新的被除数,迭代除,直到余数为0或者出现循环为止。
出现循环的条件是:某一次除时,商和余数和第一次的商和余数相同。
代码
#include<stdio.h>
int xunhuan(int *a,int *b)
{
int i;
for(i=2;i<200;i++)
{
if(a[i]==-1)
return -1;
if(a[1]==a[i])
if(b[1]==b[i])/*商和余数相同,表示循环*/
{
return i;
}
}
}
int main()
{
int n,i,xunhuanjie;/*循环节*/
xunhuanjie=-1;
int d;
int a[200];/*存放每一位的商*/
int b[200];/*存放每一位的余数*/
for(i=0;i<200;i++)
{
a[i]=-1;
b[i]=-1;
}
scanf("%d/%d",&n,&d);
i=0;
while(1)/*迭代算商和余数*/
{
a[i]=n/d;
b[i]=n%d;
if(b[i]==0)
break;
xunhuanjie=xunhuan(a,b);
if(xunhuanjie!=-1)
break;
n=b[i]*10;
i++;
}
if(b[0]==0)
printf("%d\n",a[0]);/*是个整数,输出整数部分*/
else{
if(a[0]==0)
i=1;
else
i=0;
for(;i<200;i++)
{
if(a[i]==-1)
break;
if(i==1)/*如果有小数部分输出小数点*/
{
printf(".");
if(xunhuanjie!=-1)/*如果有循环输出(*/
printf("(");
}
printf("%d",a[i]);
}
if(xunhuanjie!=-1)
printf(")");
printf("\n");
}
}
作者简介:
鉏飞祥,就读于安徽大学。邮箱:[email protected]