这道题对我来说有点难,好好学习其中的思想,很重要滴!!
题目
描述
输入整数a和b(0<=a<=3000,1<=b<=3000),输出a/b的循环小数表示以及循环节长度。
样例输入
76 25
5 43
样例输出
76/25 = 3.04(0)
循环节长度为1
5/43 = 0.(116279069767441860465)
循环节长度为21
要点:
1.对于小数的处理,之前也做过,要用到小学的基本方法来处理,乘10取余
2.这里要出现循环小数,即出现了余数相同(除断了就特殊处理)
3.对于余数是否与前面出现的相同的处理很巧妙,用一个数组来处理!
4.最后只需要将出现重复的余数从头开始寻找,找到相同的知道循环节长度了
5.一点数学知识,对于a/b,余数只有b种情况(0,1,2…b-1),所以不用怕循环很多次
代码如下:(๑•̀ㅂ•́)و✧
#include <stdio.h>
#include <iostream>
#include <string.h>
using namespace std;
const int mx = 3010;
int re[mx], de[mx], ce[mx]; //re指余数,de指商,ce用来检查余数是否出现;
int main()
{
int a, b;
while (~scanf("%d%d", &a, &b))
{
memset(de, 0, sizeof(de));
memset(ce, 0, sizeof(ce)); //首先清0处理方便记录余数
int counts = 0, t = a;
de[counts++] = a / b;
a = a % b;
while (!ce[a] && a) //余数出现相同或者余数为0的情况就跳出
{
ce[a] = counts; //记录每一个余数在的位置并标记状态(已经出现)
re[counts] = a;
de[counts++] = a * 10 / b;
a = a * 10 % b;
}
printf("%d/%d=%d.", t, b, de[0]); //输出小数点前面的数字
for (int i = 1; i < counts; i++) //这里要注意从第一个余数开始判断
{
if (re[i] == a) //如果遇到了就打个左括号
printf("(");
printf("%d", de[i]); //这里就一直输出
}
if (a == 0) //遇到了余数为0的情况(除断了)
{
printf("(0");
printf(")\n循环节长度为0\n");
}
else
printf(")\n循环节长度为%d\n", counts - ce[a]); //最后的长度输出
}
return 0;
}