代碼:
/* 問題: 兩整數相除,求循環節 */
/* 分析:
* 模擬整數相除的步驟,記錄每次的商、余,當余重復時即發現循環節
* 余的范圍為[0, 被除數),因此記錄數組的大小可根據被除數確定
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void
get_circle_digits(unsigned int a, unsigned int b)
{
int i, mod, tmp, index = 0;
int *div = (int *)malloc(sizeof(int) * b);
int *mod_pos = (int *)malloc(sizeof(int) * b);
memset(mod_pos, -1, sizeof(int)*b);
mod = a = a%b;
while(1) {
if(mod==0 || mod_pos[mod]!=-1)
break;
mod_pos[mod] = index;
tmp = mod*10;
div[index] = tmp / b;
mod = tmp % b;
++index;
}
if(mod == 0)
printf("No Circle\n");
else {
printf("0.");
for(i=0; i<mod_pos[mod]; i++)
printf("%d", div[i]);
printf("(");
for(i=mod_pos[mod]; i<index; i++)
printf("%d", div[i]);
printf(")");
printf("\n");
}
}
int
main(int argc, char **argv)
{
unsigned int a, b;
while(scanf("%u %u", &a, &b) != EOF) {
get_circle_digits(a, b);
}
return 0;
}