输出杨辉三角形的前n行【Java,C++】【递推+快速幂详解】

😊😊 😊😊
不求点赞,只求耐心看完,指出您的疑惑和写的不好的地方,谢谢您。本人会及时更正感谢。希望看完后能帮助您理解算法的本质
😊😊 😊😊

题目描述:

小白到进阶各种解法:

题目:

(编程题目) 用二维数组实现杨辉三角。输出杨辉三角的前10行。

方法一:递推式:

思路:后续更新。代码已贴

代码:

Java:
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[][] f = new int[n+1][]; //下标从1开始!

        for (int i=0; i <= n; i ++)
            f[i] = new int[i+1];  // i 行 i 列!
        for (int i=1; i <= n; i ++)
            for (int j=1; j <= i; j ++) {
                if (i == j) f[i][j] = 1;
                else f[i][j] = f[i - 1][j] + f[i - 1][j - 1];
            }
        for (int i=1; i <= n; i ++){
            for (int j=1; j <= i; j ++)
                System.out.printf("%-5d ", f[i][j]);
            System.out.println();
        }
    }

方法二:快速幂求逆元:

思路:暂未更新,后续更新!

代码:

C++
#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 1e5 + 10, mod = 1e9 + 7;
typedef long long LL;
int f[N], g[N];

int quick_power(int a, int b, int p)
{
    int res=1;
    while (b)
    {
        if (b&1) res = (LL)res * a % p;
        a = (LL)a*a % p;
        b >>= 1;
    }
    return res%p;
}

void init()
{
    f[0] = g[0] = 1;
    for (int i=1; i < N; i ++)  //打表记录!
    {
        f[i] = (LL)f[i-1] * i % mod;    //记录i的阶乘
        g[i] = (LL)g[i-1] * quick_power(i, mod-2, mod) % mod;   //记录i-j和j的阶乘
    }
}

int main()
{
    int n;
    cin >> n;
    
    init();
    for (int i=0; i < n; i ++)
    {
        for (int j=0; j <= i; j ++){
            cout << (LL)f[i]*g[j]%mod * g[i-j]%mod << " ";
        }
        puts("");
    }   
    
    return 0;
}
Java
package org.ljx;

import java.util.Scanner;

class Main{
    private static long[] f = new long[100010];  //存放 n!
    private static long[] g = new long[1000010];  //存放 逆元!
    static int mod = 1000000007;
    private static int quick_power(long a, long b){
        long res = 1;
        while (b > 0){
            if (b%2 != 0) res = (long)res * a % mod;
            a =  (long)a*a % mod;
            b >>= 1;
        }
        return (int) (res%mod);
    }

    private static void init(){
        f[0] = g[0] = 1;
        for (int i=1; i < 100000; i ++){
            f[i] = (long)i*f[i-1] % mod;    //阶乘
            g[i] = (long) g[i-1]*quick_power(i,mod-2) % mod;
        }
    }

    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        init();
        for (int i=0; i < n; i ++){
            for (int j=0; j <= i; j ++){
                System.out.printf("%-5d ",(long)f[i]*g[j]%mod * g[i-j]%mod  );
            }
            System.out.println();
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值