首页 > 代码库 > 【HDOJ】1099 Lottery
【HDOJ】1099 Lottery
题意超难懂,实则一道概率论的题目。求P(n)。
P(n) = n*(1+1/2+1/3+1/4+...+1/n)。
结果如果可以除尽则表示为整数,否则表示为假分数。
1 #include <cstdio> 2 #include <cstring> 3 4 #define MAXN 25 5 6 __int64 buf[MAXN]; 7 8 __int64 gcd(__int64 a, __int64 b) { 9 if (b == 0) return a;10 else return gcd(b, a%b);11 }12 13 int main() {14 int i, j, k, n;15 __int64 fz, fm, tmp, intr;16 17 buf[1] = 1;18 for (i=2; i<=22; ++i)19 buf[i] = i*buf[i-1]/gcd(i, buf[i-1]);20 21 while (scanf("%d", &n) != EOF) {22 fz = 0;23 fm = buf[n];24 for (i=1; i<=n; ++i)25 fz += fm/i;26 fz *= n;27 tmp = gcd(fz, fm);28 fz /= tmp;29 fm /= tmp;30 tmp = fz/fm;31 fz -= tmp*fm;32 if (fz == 0) {33 printf("%I64d\n", tmp);34 continue;35 }36 n = 0;37 intr = tmp;38 while (tmp) {39 ++n;40 tmp /= 10;41 }42 for (i=0; i<=n; ++i)43 printf(" ");44 printf("%I64d\n", fz);45 printf("%I64d ", intr);46 j = k = 0;47 while (fz) {48 ++j;49 fz /= 10;50 }51 tmp = fm;52 while (tmp) {53 ++k;54 tmp /= 10;55 }56 j = (j>k) ? j:k;57 for (i=0; i<j; ++i)58 printf("-");59 printf("\n");60 for (i=0; i<=n; ++i)61 printf(" ");62 printf("%I64d\n", fm);63 }64 65 return 0;66 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。