hdoj1099 Lottery(简单的数学问题变相考察最小公倍数)

来源:互联网 发布:大数据量化平台 编辑:程序博客网 时间:2024/06/15 11:49

来源:http://acm.hdu.edu.cn/showproblem.php?pid=1099

题目很难看懂,大意是求数学期望

n*(1/1+1/2+1/3+...+1/n)
要求按照特定的格式输出
位数过大,所以采用long long型输入输出。
按照正常的分数相加的思想,想找出所有分
母的最小公倍数,再把变化后的分子相加。
代码如下:
#include<stdio.h>#define ll long longll gcd(ll a,ll b)//最大公约数 {ll c;while(b){c=a%b;a=b;b=c;}return a;}ll lcm(ll a,ll b)//最小公倍数 {return a*b/gcd(a,b);}ll getlens(ll a)//获取数的位数 {ll i=0;while(a){a=a/10;i++;}return i;}int main(){ll i,son,mother,j,n,k;ll l1,l2,l3;while(~scanf("%lld",&n)){mother=1;son=0;for(i=1;i<=n;i++)mother=lcm(mother,i);//分母值 for(i=1;i<=n;i++)son+=mother/i;son=son*n;//分子值 if(son%mother==0)printf("%d\n",son/mother);else{j=son/mother;k=son-j*mother;i=gcd(k,mother);k=k/i;mother=mother/i;l1=getlens(j);l2=getlens(k);l3=getlens(mother);for(i=0;i<l1+1;i++)printf(" ");printf("%lld\n",k);printf("%d ",j);l2=(l2>l3)?l2:l3;for(i=0;i<l2;i++)printf("-");printf("\n");for(i=0;i<l1+1;i++)printf(" ");printf("%lld\n",mother);}}return 0;}



原创粉丝点击