HDU 1099 数学计算

20 篇文章 0 订阅

 这是一到简单题,但是题意比较难以理解!说白了就是求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]表示输入为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[n]/i;            
		fenzi *= n;
		number = gcd(fenzi,a[n]); //分子分母的最大公约数
		fenzi = fenzi/number; //约分后的分子
		fenmu = a[n]/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;
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值