这是一到简单题,但是题意比较难以理解!说白了就是求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;
}