//使用数组计算M/N的各小数位的值
//若是无限循环小数,计算并输出第一个循环节,同时要求输出循环节的起止位置
//M*10/N是小数,余数M%N再*10/N是下一位小数
//余数不为0且出现余数相等的时候说明存在循环节
#include<stdio.h>
int main() {
int a[50]= {0},b[50]; //a存余数,b存小数
int M,N,x,y,i,j,k,flag;//x为余数 y为小数 flag表示是否出现循环节
scanf("%d%d",&M,&N);//0<M<N≤100
while(M>N||M<=0||N<=0||M>100||N>100) {
printf("输入大于0且不大于100的数,且第一个数小于第二个数:");
scanf("%d%d",&M,&N);
}
x=M;//第一个分子也作为余数存入数组中
i=0;
flag=0;//flag为0表示为有限小数
while(x!=0) {
a[i]=x;
y=x*10/N;
b[i]=y;
x=x*10%N;
for(k=0; k<i; k++) {
if(a[k]==a[i]) {
flag=1;//出现相同余数→出现循环节
x=0;//因为break只结束for循环,所以用x=0结束while循环
break;//break只结束了for循环
}
}
i++;
if(i>=50) break;//无限不循环小数 超出数组长度
}
if(flag==1) {
printf("%d/%d是无限循环小数,循环节的起止位置为%d~%d,循环节小数部分为:",M,N,k,i-2);
for(j=k; j<i-1; j++) {
printf("%d ",b[j]);
}
} else { //flag==0
if(x==0) {
printf("%d/%d是有限小数,小数部分为:",M,N);
for(j=0; j<i; j++) {
printf("%d ",b[j]);
}
}
else{
printf("%d/%d是无限不循环小数,小数部分前100位为:",M,N);
for(j=0; j<i; j++) {
printf("%d ",b[j]);
}
}
}
return 0;
}
编程练习:计算小数
猜你喜欢
转载自blog.csdn.net/qq_37209590/article/details/104012371
今日推荐
周排行