您的位置:首页 > 其它

HDU 1099 数学计算

2012-09-13 11:01 295 查看
这是一到简单题,但是题意比较难以理解!说白了就是求n/1+n/2+n/3+----+n/n!这道题就是直接求解,先利用同分的思想,即最小公倍数求出所有的的分母的最小公倍数!然后进行分数的求和!注意分子和分母的没有相除之前需要注意范围超过了整形

#include <iostream>
using namespace std;

_int64 gcd(_int64 a,_int64 b)
{
if(b==0) return a;
else return gcd(b,a%b);
}

int main()
{

int i,n,size1,size2;
_int64 number,n1,n2;
_int64 integer;//整数部分
_int64 fenzi;//分子
_int64 fenmu;//分母
_int64 a[23];//a
表示输入为n时,从1到n这些数的最小公倍数

a[1]=1;
for(i=2;i<=22;i++) a[i]=i*a[i-1]/gcd(i,a[i-1]);//两个数的最小公倍数等于这两个数的乘机除以他们的最大公约数

while(cin>>n)
{
fenzi=0;
for(i=1;i<=n;i++) fenzi += a
/i;
fenzi *= n;
number = gcd(fenzi,a
); //分子分母的最大公约数
fenzi = fenzi/number; //约分后的分子
fenmu = a
/number; //约分后的分母
integer = fenzi/fenmu; //结果的整数部分
fenzi = fenzi-integer*fenmu; //最终结果的分子

if(fenzi==0) { printf("%I64d\n",integer); continue; }

size1=size2=0; //size1,size2分别为整数部分的位数和分子的位数
n1=integer; n2=fenmu;
while(n1!=0) { size1++; n1/=10; }
while(n2!=0) { size2++; n2/=10; }

//按题目要求的格式打印结果
for(i=0;i<=size1;i++) printf(" ");
printf("%I64d\n",fenzi);
printf("%I64d ",integer);
for(i=0;i<size2;i++) printf("-");
printf("\n");
for(i=0;i<=size1;i++) printf(" ");
printf("%I64d\n",fenmu);
}
return 1;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: