94 分数化小数
作者: xxx时间限制: 1S章节: 字符串
问题描述 :
写一个程序,输入一个形如N/D的分数(N是分子,D是分母),输出它的小数形式。
如果小数有循环节的话,把循环节放在一对圆括号中。
例如, 1/3 = .33333333 写成0.(3)
41/333 = 0.123123123… 写成0.(123)
用xxx.0 表示整数
典型的转化例子: 1/3 = 0.(3)
22/5 = 4.4
1/7 = 0.(142857)
2/2 = 1.0
3/8 = 0.375
45/56 = 0.803(571428)
输入说明 :
单独的一行包括被空格分开的 N和D, 1 <= N,D <= 100000。
输出说明 :
小数的表示方法上面说的很明白了,如果输出的长度超过76个字符,每行输出76个字符(包括小数点、括号等)。
输入范例 :
45 56
输出范例 :
0.803(571428)
/*
统计两遍循环节,这样就可以将非循环节部分和循环节部分区分开来
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char number[100];
int main(){
int N, D;
scanf("%d%d", &N, &D);//分子 分母
int result = N / D;
N = N%D;
if (N == 0)
printf("%d.0\n", result);//整除功能已实现
else{//求小数
int r,len=0;
int i = 0;
int *remain = (int *)malloc(sizeof(int)*100);
int *time = (int *)malloc(sizeof(int)*100);
memset(remain, -1, sizeof(remain));//余数
memset(time, 0, sizeof(time));//出现的次数
while (N != 0 && i < 1000){
N = N * 10;
r = N / D;
N = N%D;
if (remain[N] == r){//不是第一次出现
if (time[N] != 2)//不是第三次出现
time[N]++;
else{//第三次遇到
for (int j = 0; j < D;j++)
if (remain[j] != -1&&time[j]>1)
len++;
break;
}
}
else{
remain[N] = r;
time[N]=1;
}
number[i++] = r + '0';
}
char temp = number[i - len * 2];
number[i - len * 2] = '\0';
printf("%d.%s",result,number);//取出非循环节
if (N != 0 && len>0)
printf("(");
char *p = number + (i - len * 2);
number[i - len] = '\0';
*p = temp;
printf("%s", p);//输出循环节
if (N != 0 && len>0)
printf(")");
printf("\n");
}
return 0;
}
小结:当循环节位数过多时,不知道怎么处理,记录下