star

搜索

RSS

RSS Link

计数器

140176

高精度除法器

2010年8月02日 02:41 | Comments(3) | Category:C语言 | Tags:

/*高精度除法器 v0.1 Author:star date:2010
*可以计算无限循环小数,循环部分用括号表示

*因为整数除法最终肯定会循环,所以输出是有穷的
*一些例子:
*1/3 = 0.(3)
*22/5 = 4.4
*1/7 = 0.(142857)
*2/2 = 1.0
*3/8 = 0.375
*输入格式:数字1+/字符+数字2+回车 
*输入例子:45/56
*输出结果:0.803(571428)
*/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <assert.h>
#include <memory.h>
#define  BIT 100000 //除数与被除数范围都为100000 

int main(void)
{
	int N, D, Mods[BIT+100];
	char Ans[BIT+100];
	int i, j, st, ed, mod, cnt, Flag, tp , bt;
	char PreChar[100];
NEXT:
	memset(Mods, 0, sizeof(Mods)); //初始化内存 
	memset(Ans,  0, sizeof(Ans));
	memset(PreChar, 0, sizeof(PreChar)); 

	scanf("%d/%d", &N, &D); //输入
  
	assert(N >= 1 && N <= BIT);  //输入限制的数字和范围 
	assert(D >= 1 && D <= BIT);
	Mods[N] = cnt = Flag = 1; //初始化 
	if(!(N % D)) //整除了直接输出
	{
		printf("%d.0\n", N/D);
		goto NEXT;
	}
	if(N < D) //计算小数点前
	{
		PreChar[0] = '0';
		PreChar[1] = '.';
	}
 	else
 	{
 		tp = N / D;
  		bt = log10(tp);
		PreChar[bt+1] = '.';
  		for(i = bt; i >= 0; --i)
  		{
   			PreChar[i] = tp % 10 + '0';
   			tp /= 10;
  		}
  		N %= D;
  		PreChar[i] = '.';
	}
 	i   = 0;
 	mod = 100009; //Magic Number
 	while (!Mods[mod]) {  //计算小数点后的除法
  		Mods[mod] = cnt;
  		++cnt;
  		N        *= 10;
  		Ans[i++]  = N / D + '0';
  		N =  mod  = N % D;
 	} 
 	//寻找开始循环与结束循环
 	ed = cnt - 1;
 	st = Mods[mod];
 	//整除清0
 	if(Ans[ed-1] == '0' && Mods[0])
 	{
  		Flag      = 0;
  		Ans[ed-1] = '\n';
 	}
 	//输出
 	printf("%s", PreChar);
 
 	for(j = 0,i = 1; i < st; ++i)
  		if(Ans[i-1])
  			printf("%c", Ans[i-1]);
 	if(Flag) 
  		printf("(");
 	for(j = i; Ans[j-1]; ++j)
  		printf("%c", Ans[j-1]);
 	if(Flag) 
  		printf(")\n");
 	goto NEXT;
}