还有种情况,
其它语言带小数的除法有误差,不知道C有没有,这种情况也好判断,S.length-2的数全部==9
其它语言带小数的除法有误差,不知道C有没有,这种情况也好判断,S.length-2的数全部==9
白娘故意下雨骗许仙的伞。祝英台十八里相送时装疯卖傻调戏梁山伯。七仙女挡住了董永的去路。牛郎趁织女洗澡时拿走了她的衣服。。。这些故事告诉我们;伟大爱情的开始,总归的有一个要先耍流氓!
/* 读入自然数m和n(0<=m<n<=1000),判断分数m/n是 有限小数还是无限小数。如果m/n是有限小数,则 输出分数的值;如果m/n为循环小数,则把循环部 分括在括号中打印出来~ */ main() { int i,j; //循环控制变量 int m,n; //两个输入变量 int a[1001]; //存放小数部分的数组,每个元素存放小数部分的一个数位 int t; //临时存放每次除法的余数 int at[1001]={0}; //依次存放每一次除法运算后的余数,备用 int startloop; //循环小数的循环起点下标 printf("请输入m,n满足0<=m<=n<=1000:"); scanf("%d%d",&m,&n); for(t=m,i=0;i<1000;i++) //题目中的结果最多有1000位小数 就能精确表示了,你赞同否? { a[i]=t*10/n; //上次的余数加后缀0(乘10) 再除以n 取整,即为 当前数位的数值 t=(t*10)%n; //当次除法的余数 at[i]=t; //余数放到数组中 for(startloop=0;startloop<i;startloop++) //检查之前有没出现过与当前余数相同的余数 if(t==at[startloop]) //出现同余情况,则意味着开始小数部分的循环 { t=-1; //-1 是区别于普通的余数以及余数为0的情况 break; } if(t==-1 || t==0 || t==m )break; //t=-1为形如 1/15=0.1(3)的情况 //t=0 为除尽了 不是循环小数 //t=m 说明该小数从第一位小数位即开始循环 } printf("\n%d/%d=0.",m,n); if(t==0) //t=0 为除尽了 不是循环小数 for(j=0;j<=i;j++)printf("%d",a[j]); if(t==-1) //t=-1为形如 1/15=0.1(3)的情况 for(j=0;j<=startloop;j++)printf("%d",a[j]); if(t==m) startloop=-1; //t=m 说明该小数从第一位小数位即开始循环 if(t==m || t==-1) //t=-1与t=m 两种情况共同输出循环部分的小数 { printf("("); for(j=startloop+1;j<=i;j++)printf("%d",a[j]); printf(")"); } printf("\n"); }