求调和级数并以最简分数形式输出

103 阅读1分钟

求调和级数SUM = 1/1 + 1/2 + 1/3 + ... 1/n 前n项和,输出形式为最简分数 

例n=5时 SUM=137/60

推理知:

分子的可以写成 [[(1*2)+1]*3......]*n + (n-1)

分母则是n的阶乘n!

由此解题思路是:

1. 按照以上公式分别推出分子分母

2. 辗转相除法求最大公约数进行化简

代码如下(C):

//调和级数
//辗转相除法求最大公约数
int gcd(int n,int m){
    if(m>n) swap(n,m);
    int temp = 0;
    while((temp = n%m)){
        n = m;
        m = temp;
    }
    return m;
}

//递归法改进辗转相除
int gcd(int n,int m){
    if(m == 0)
        return n;
    gcd(m,n%m);
}

//通项求分子分母
int col(int n){
    int fz = 1,fm=1,lc = 1;
    if( n > 1){
        for(int i = 2;i<=n;i++){
        fz = fz * i + lc;
        fm *= i;
        lc*=i;
        }
        int g = gcd(fz,fm);
        fz /= g;fm /= g;
        printf("%d/%d",fz,fm);
    }
    else{
        printf("1");
    }
}


int main(){
    int n=0;
    while(scanf("%d",&n)!=EOF){
        col(n);
    }
}

测试结果: