题目描述:输入整数a和b(0<=a,b<=3000),输出a/b的循环小数表示以及循环节长度。例如a=5,b=43,小数表示为0.(116279069767441860465),循环节长度为21.
解题思路:
计算a/b的小数:
题目要求循环小数,简单的a/b运算必然无法正常得到答案,采用逐次计算小数点后各位的方法。
开始:a=a%b*10;
小数第一位:arr[sub]=a/b;
何种情况表明开始循环了呢?定义一数组记录被除数出现的次数,当该被除数出现第二次,即表示小数开始循环,即跳出while()进行打印。
如此循环往复得到后面各位小数的值。
#include
#include
int main()
{
int a,b;
scanf("%d%d",&a,&b);
int arr[30001]; //存放各位小数
int res[30001]; //记录被除数出现的次数
int loc[30001]; //某个被除数刚出现时对应小数的位置
int sub=1; //实时记录下标位置
a=a%b*10;
memset(res,0,sizeof(res));
while(res[a]==0) //一旦被除数第二次出现,跳出循环。
{
res[a]=1;
loc[a]=sub; //某被除数循环开始的位置记录
arr[sub]=a/b; //记录小数值
sub++;
a=a%b*10;
}
printf("0.");
for(int i=loc[a];i