基础题。
求n*(1+1/2+1/3+…+1/n),注意输出格式。
#include <iostream>
using namespace std;
__int64 gcd(__int64 a, __int64 b) //求a和b的最大公约数
{
while (b)
{
int t = a % b;
a = b;
b = t;
}
return a;
}
int main()
{
__int64 lcm[25]; //前i个数的最小公倍数
lcm[1] = 1;
for (__int64 i = 2; i < 23; i++)
{ //两个数的乘积除以其最大公约数等于其最小公倍数
lcm[i] = i * lcm[i - 1] / gcd(i, lcm[i - 1]);
}
__int64 n;
while (cin >> n)
{
__int64 s = 0, f = lcm[n]; //分子,分母
for (__int64 i = 1; i <= n; i++) //通分后的分子
s += f / i;
s *= n;
__int64 b = gcd(s, f); //分子分母通分
s /= b;
f /= b;
if (s % f == 0) //分子是分母的整数倍
cout << s / f << endl;
else
{
if (s / f > 9)
cout << " ";
cout << " " << s % f << endl; //输出分子
cout << s / f << " "; //输出整数部分
__int64 t = f;
while (t) //输出分隔线
{
cout << "-";
t /= 10;
}
cout << endl;
if (s / f > 9)
cout << " ";
cout << " " << f << endl; //输出分母
}
}
return 0;
}
继续加油。