如何用Java实现下面的图形是著名的杨辉三角形: image 如果我们按从上到下、从左到右的顺序把所有数排成一列,可以得到如下数列: 1, 1, 1, 1, 2, 1, 1, 3, 3, 1, 1, 4, 6, 4, 1, \cdots1,1,1,1,2,1,1,3,3,1,1,4,6,4,1,⋯ 给定一个正整数 NN,请你输出数列中第一次出现 NN 是在第几个数? 输入描述 输入一个整数 NN。 输出描述 输出一个整数代表答案。
时间: 2023-02-07 13:13:37 浏览: 331
杨辉三角形是一种数学图形,每一层的数字组成的是由 $1$ 开始的连续自然数。
要在杨辉三角形中找到第一个出现 $N$ 的数,可以使用如下的 Java 代码:
```
int findFirstAppearanceOfN(int N) {
int row = 1;
while (N > row) {
N -= row;
row++;
}
return N;
}
```
这段代码的工作原理是:从第一层开始,逐层扫描杨辉三角形,每扫描一层就将 $N$ 减去当前层的数字个数。当 $N$ 小于等于当前层的数字个数时,就找到了 $N$ 所在的位置。
例如,如果 $N=7$,在第一层时 $N=7$,在第二层时 $N=5$,在第三层时 $N=2$,所以 $N$ 所在的位置就是第三层的第二个数字。
相关问题
如何用Java非暴力实现下面的图形是著名的杨辉三角形: image 如果我们按从上到下、从左到右的顺序把所有数排成一列,可以得到如下数列: 1, 1, 1, 1, 2, 1, 1, 3, 3, 1, 1, 4, 6, 4, 1, \cdots1,1,1,1,2,1,1,3,3,1,1,4,6,4,1,⋯ 给定一个正整数 N,请你输出数列中第一次出现 N 是在第几个数? 输入描述 输入一个整数 N。 输出描述 输出一个整数代表答案。
可以用如下的 Java 代码来实现:
```
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
// 存储杨辉三角的每一行
List<List<Integer>> triangle = new ArrayList<>();
triangle.add(Arrays.asList(1));
int i = 1;
while (true) {
List<Integer> row = new ArrayList<>();
row.add(1);
for (int j = 1; j < i; j++) {
row.add(triangle.get(i - 1).get(j - 1) + triangle.get(i - 1).get(j));
}
row.add(1);
triangle.add(row);
if (row.contains(n)) {
System.out.println(i * (i + 1) / 2 + row.indexOf(n));
break;
}
i++;
}
}
}
```
算法的时间复杂度为 O(N^2),空间复杂度为 O(N^2)。
上述代码使用了 Java 的 ArrayList 和 List 接口。
- ArrayList 是一个动态数组,能够动态地增加或减少元素。
- List 是一个接口,定义了一系列的操作,ArrayList 实现了 List 接口,因此可以使用 List 的所有方法。
在本例中,我们使用 ArrayList 来存储杨辉三角的每一行。
代码的执行流程如下:
1. 读入数据 N。
2. 初始化一个 ArrayList,并将第一行的数据 1 添加到 ArrayList 中。
3. 初始化变量 i 为 1。
4. 执行一个 while 循环,条件为 true,即一直循环到找到第一个出现 N 的数为止。
5. 在 while 循环中,初始化一个 ArrayList row,并将 1
下面的图形是著名的杨辉三角形: 如果我们按从上到下、从左到右的顺序把所有数排成一列,可以得到如下数列:1, 1, 1, 1, 2, 1, 1, 3, 3, 1, 1, 4, 6, 4, 1, … 给定一个正整数 N,请你输出数列中第一次出现 N 是在第几个数?完整C语言
实现如下:
```c
#include <stdio.h>
// 计算杨辉三角的第n行第k个数
int yangHui(int n, int k)
{
if (k == 1 || k == n) {
return 1;
} else {
return yangHui(n - 1, k - 1) + yangHui(n - 1, k);
}
}
int main()
{
int n;
printf("请输入要查找的数N:");
scanf("%d", &n);
int i, j, count = 0;
for (i = 1; ; i++) {
for (j = 1; j <= i; j++) {
count++;
if (yangHui(i, j) == n) {
printf("第一次出现%d是在第%d个数\n", n, count);
return 0;
}
}
}
return 0;
}
```
程序的思路是:先定义一个递归函数 `yangHui(n, k)`,用来计算杨辉三角的第n行第k个数。然后在 `main` 函数中,依次遍历数列中的每一个数,计算出对应的杨辉三角行和列,然后调用 `yangHui(n, k)` 函数计算出该数,判断是否等于目标数N,如果是,则输出结果并退出程序。
阅读全文