0082-莱布尼兹三角形

题目

莱布尼兹三角形
难度级别:B; 运行时间限制:1000ms; 运行空间限制:51200KB; 代码长度限制:2000000B
试题描述

如下图所示的三角形,请编程输出图中排在第 n 行从左边数第 m 个位置上的数。 

输入
一行包括两个正整数,分别为 n 和 m,两数间用一个空格分隔。
输出
一个如样例所示格式的分数。
输入示例
6 2
输出示例
1/30
其他说明
数据范围:1<= m <= n <= 100.

分析

  这道题也是前100道题中为数不多的需要用到算法解决的题了。所用算法为:递推。

  递推大概就类似于找规律,通过对数组下标的利用最终在对应位置找到结果。

  所以,咱们要先找到规律。

  经过观察,我们发现:下一行的第1、2个数相加就等于上一行的第1个数,下一行的第2、3个数相加就等于上一行的第2个数……以此类推,第x行的第a、b个数相加就等于第x-1行的第a个数。同时左右两边则为1/1,1/2,1/3……即分母依次增加1。

  发现规律后,我们就可以根据它写代码了。

  同时有一点特别要注意:位置越靠下的数的分母越大,int会存不下。

代码

#include<bits/stdc++.h>
using namespace std;
long long a[105][105],n,m;//越往下分子越大,避免炸掉。
int main()
{
	a[1][1]=1;
	scanf("%lld%lld",&n,&m);
	for(long long i=1;i<=n;i++)//本题可以只计算分母,避免精度不够。
	{
		for(long long j=1;j<=i;j++)
		{
			if(j==1) a[i][j]=i;//左右两边为1/1,1/2,1/3……
			else a[i][j]=a[i-1][j-1]*a[i][j-1]/(a[i][j-1]-a[i-1][j-1]);//第x行的第a、b个数相加就等于第x-1行的第a个数。
		}
	}
	printf("1/%lld",a[n][m]);//输出第n行m列。
	return 0;
}
原文地址:https://www.cnblogs.com/DARTH-VADER-EMPIRE/p/10000238.html