高精度除法器
2010年8月02日 02:41 | Comments(3) | Category:C语言 | Tags:c 数学 高精度 除法
/*高精度除法器 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; }
对于给定的N,求N!结果的位数
2010年8月01日 05:02 | Comments(606) | Category:C语言 | Tags:阶乘 位运算 数学 分治 斯特林
根据斯特林公式:~
/*calculate the number of digits in the factorial of the integer N.date:2010-07-31*/ #include <stdio.h> #include <math.h> #include <assert.h> int main(void) { const double PI = acos(-1.0); int T; while(1) { scanf("%d", &T); assert(T > 0 && T < (1<<30)); printf("%d\n", (int)((T*log(T) - T + 0.5 * log(2*T*PI) ) / log(10)) + 1); } return 0; }