原題目地址
http://acm.hdu.edu.cn/showproblem.php?pid=1099
簡單地描述一下提議
輸入 2
輸出 2/1 + 2/2 = 6/2 = 3
輸入 3
輸出 3/1 + 3/2 +3/3 = 5 1/3
輸入 5
輸出 5/1 + 5/2 +5/3 +5/4 +5/5 = 11 5/12
其他的自己照着推一下就出來了
直接上代碼了
GCC編譯器
#include <stdio.h>
/**
* 求最大公約數
*/
long long gcd(long long a,long long b)
{
if(b==0) return a;
else return gcd(b,a%b);
}
int main()
{
int i,n,size1,size2;
long long number,n1,n2;
long long integer;//整數部分
long long fenzi;//分子
long long fenmu;//分母
long long 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(scanf("%d",&n)!=EOF)
{
fenzi=0;
/**
* fenzi = (最小公倍數 * n)/i
*/
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("%lld\n",integer);
continue;
}
size1=size2=0;
n1=integer;
n2=fenmu;
//整數的位數
while(n1!=0)
{
size1++;
n1/=10;
}
//分母的位數
while(n2!=0)
{
size2++;
n2/=10;
}
//按題目要求的格式打印結果
for(i=0;i<=size1;i++)
printf(" ");
printf("%lld\n",fenzi);
printf("%lld ",integer);
for(i=0;i<size2;i++)
printf("-");
printf("\n");
for(i=0;i<=size1;i++)
printf(" ");
printf("%lld\n",fenmu);
}
return 1;
}