hdu 1099 Lottery

来源:互联网 发布:pc软件界面设计工具 编辑:程序博客网 时间:2024/05/01 18:46
//求 n(1+1/2+1/3+....1/n)------m+a/b

犯了好几个错误  检查了 两个小时 ,咕~~(╯﹏╰)  很水的题 ,老犯逻辑错误  哎  要命

//原题链接http://acm.hdu.edu.cn/showproblem.php?pid=1099

#include<iostream>

#include<cstdio>
using namespace std;
typedef  __int64 int64;
int64 gcd(int64 a ,int64 b)
{
return b==0?a:gcd(b,a%b);
}
int main()
{
int64 n,i,j,m;
int64  a,b,temp;
while(scanf("%I64d",&n)!=EOF)
{
m=1,a=1,b=2;
if(1==n)
printf("1\n");
else if(2==n)
printf("3\n");
   else if(n==3)
printf("  1\n5 -\n  2\n");
else if(n==4)
printf("  1\n8 -\n  3\n");
        else 
{
for(i=3;i<=n;i++)
{
temp=b/gcd(b,i)*i;//b,i 的最小公倍数temp
a=temp/b*a+temp/i;
b=temp;
/*if(gcd(a,b)!=1)////
{
a=a/gcd(a,b);
b=b/gcd(a,b);害死我了
}*/
if(a>b)
{
m+=a/b;
a=a%b;
}
}
m=n*m+n*a/b;//不是n*(ab/)
a=n*a%b;
/* if(gcd(a,b)!=1)
{
a=a/gcd(a,b);
          b=b/gcd(a,b);//a的值变了
}*/
temp=gcd(a,b);
if(temp!=1)
{
    a=a/temp;
b=b/temp;
}
    //printf("a=%d**   b=%d\n",a,b);
   for(temp=b,j=0;temp!=0;)
{
    temp=temp/10;
   j++;
}
    printf("   %I64d\n%I64d ",a,m);
    for(i=0;i<j;i++)
  printf("-");
   printf("\n   %I64d\n",b);
}
}
return 0;
}
原创粉丝点击