算法第一弹

目录

一、丁姐姐最近迷上了斐波那契数列!众所周知,斐波那契数列的递归定义是:

二、素数分布函数π(n)表示小于或等于n的素数的数目。例如π(10)=4(2,3,5,7是素数)。这个函数涉及到许多高等数论的内容,甚至和黎曼猜想挂钩,目前还有很多数学家正在不断探索其中的奥秘。千里之行始于足下,现在你开始关心一个问题:在正整数域中素数的分布是怎么样的。为了探索这个问题,你需要计算出一些π(n)的值。

 三、KiKi想知道一个n阶方矩是否为上三角矩阵,请帮他编程判定。上三角矩阵即主对角线以下的元素都为0的矩阵,主对角线为从矩阵的左上角至右下角的连线。

四、小sun非常懒,所以他非常喜欢坐电梯,但是他发现了一个问题:当他在k楼想要坐电梯去1楼时,如果比他高的楼层有人想坐电梯去1楼,他就必须等待,直到电梯把他楼上的人接完了,才能到他的楼层来接他,于是他非常的苦恼。现在他想问问你,如果他知道某个时刻所有想坐电梯的人所在的楼层,他要等多久电梯才能到他的楼层

五、输入两个升序排列的序列,将两个序列合并为一个有序序列并输出。


一、丁姐姐最近迷上了斐波那契数列!众所周知,斐波那契数列的递归定义是:

(F1=1,F2=1,Fn=Fn−1+Fn−2(n≥3))(F_1=1,F_2=1,F_n=F_{n-1}+F_{n-2}(n\ge3))(F1​=1,F2​=1,Fn​=Fn−1​+Fn−2​(n≥3)),现在她想知道数列的第nnn项是奇数还是偶数,请你编程实现。

输入描述

输入数据包含多组测试数据,每个测试实例占一行,每行为一个数,表示斐波那契数列的第n项(1<=n<10^15)

 输出描述:

输出斐波那契数列的第n项是奇数还是偶数,奇数输出“even”,偶数输出“odd”,(包含引号),对于每个测试实例,输出一行。

解答:

斐波那契数列:1 1 2 3 5 8 13 21 34

通过观察斐波那契数列不难发现每三个一个循环,前两个为奇数最后一个为偶数。那么,可以将其转化为n是不是3的倍数问题。代码如下:

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		long n;
		while (scan.hasNextLong()) {
			n = scan.nextLong();
			if (n < 1 || n >= 1e15) {
				break;
			} else {
				long temp;
				temp = n % 3;
				if (temp == 0) {
					System.out.println("\"odd\"");
				} else {
					System.out.println("\"even\"");
				}
			}
		}
	}
}

二、素数分布函数π(n)表示小于或等于n的素数的数目。例如π(10)=4(2,3,5,7是素数)。这个函数涉及到许多高等数论的内容,甚至和黎曼猜想挂钩,目前还有很多数学家正在不断探索其中的奥秘。千里之行始于足下,现在你开始关心一个问题:在正整数域中素数的分布是怎么样的。为了探索这个问题,你需要计算出一些π(n)的值。

输入描述:

第一行一个整数T(T≤1000),表示数据的组数。
接下来一共T行,第i+1(1≤i≤T)行表示第i组数据。每行一个正整数n(n≤1000)

 本题为了判断小于等于n的素数的数目,其根本在于判断比n小的素数个数,本质就是判断素数问题

核心代码如下:

for (int i = 2; i <= n; i++) {
				int temp = 1;// temp作为标志变量,若为质数则temp=1否则为0
				for (int j = 2; j <= Math.sqrt(i); j++) {
					if (i % j == 0) {
						temp = 0;
						break;
					}
				}
				if (temp == 1)
					p++;// p为质数的个数
			}

核心代码为判断小于等于n的质数的个数,根据题目要求只需在其外加上一个循环结构使其可以多次输入n。代码如下:

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		int t = scan.nextInt();
		for (int k = 1; k <= t; k++) {// 判断输入数字的次数
			int n = scan.nextInt();
			int p = 0;
			for (int i = 2; i <= n; i++) {
				int temp = 1;// temp作为标志变量,若为质数则temp=1否则为0
				for (int j = 2; j <= Math.sqrt(i); j++) {
					if (i % j == 0) {
						temp = 0;
						break;
					}
				}
				if (temp == 1)
					p++;// p为质数的个数
			}
			System.out.println(p);
		}
	}
}

 三、KiKi想知道一个n阶方矩是否为上三角矩阵,请帮他编程判定。上三角矩阵即主对角线以下的元素都为0的矩阵,主对角线为从矩阵的左上角至右下角的连线。

输入描述:

第一行包含一个整数n,表示一个方阵包含n行n列,用空格分隔。 (1≤n≤10)

从2到n+1行,每行输入n个整数(范围-2^31~2^31-1),用空格分隔,共输入n*n个数。

输出描述:

一行,如果输入方阵是上三角矩阵输出"YES"并换行,否则输出"NO"并换行。 

本题判断n阶方矩 是否为上三角矩阵,即为判断对角线下方之和是否为0,故计算出对角线下方数据之和是否为0即可判断。

本题难点即为找到对角线下方,通过观察矩阵不难发现对角线下方的数组行是从第二行开始的,我们不妨设行标为i列标为j,则i是从1开始到n-1结束,j是从0开始,但j一直小于i,核心代码如下

int sum = 0;
for (int i = 1; i < n; i++) {
	for (int j = 0; j < i; j++)
		sum = sum + arr[i][j];
}

完成本题只需在此基础上加一个赋值功能和一个判断功能即可,完整代码如下:

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		int n = scan.nextInt();
		// 赋值
		int[][] arr = new int[n][n];
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < n; j++) {
				arr[i][j] = scan.nextInt();
			}
		}
		//判断
		int sum = 0;
		for (int i = 1; i < n; i++) {
			for (int j = 0; j < i; j++)
				sum = sum + arr[i][j];
		}
		if (sum == 0)
			System.out.println("YES");
		else
			System.out.println("NO");
	}
}

四、小sun非常懒,所以他非常喜欢坐电梯,但是他发现了一个问题:当他在k楼想要坐电梯去1楼时,如果比他高的楼层有人想坐电梯去1楼,他就必须等待,直到电梯把他楼上的人接完了,才能到他的楼层来接他,于是他非常的苦恼。现在他想问问你,如果他知道某个时刻所有想坐电梯的人所在的楼层,他要等多久电梯才能到他的楼层

输入描述:

第一行,两个整数:n,k,代表在当前时刻总共有n个去1楼的请求,小sun在第k楼,数据保证k不为1

第二行,共n个整数ai,每个整数代表一个请求所在的层数。

本题较为简单,只需找出最高的楼层,以及到小明楼层需要经历几个楼就行

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		int n, k;
		n = scan.nextInt();// n个人
		k = scan.nextInt();// 小明在k楼
		if (n > 1 && n <= 1e6 && k >= 2 && k <= 1e8) {
			int[] a = new int[n];
			for (int i = 0; i < n; i++) {
				a[i] = scan.nextInt();
			}
			int max = a[0];
			for (int i = 0; i < n; i++) {
				if (max < a[i]) {
					max = a[i];
				}
			}
			int time;
			time = (max - 1) + (max - k);
			System.out.println(time);
		}

	}
}

本题简单不再过多说明,还有一个本题的进阶版还未搞懂,下次再行解释题目如下

小sun非常懒,所以他非常喜欢坐电梯,但是他发现了一个问题:当他在k楼想要坐电梯去1楼时,如果比他高的楼层有人想坐电梯去1楼,他就必须等待,直到电梯把他楼上的人接完了,才能到他的楼层来接他,于是他非常的苦恼。现在他想问问你,如果他知道某个时刻所有想坐电梯的人所在的楼层,他要等多久电梯才能到他的楼层,不停靠则一秒钟可经过一层楼,若有人需要上电梯,则需要五秒才能到下一楼层。

五、输入两个升序排列的序列,将两个序列合并为一个有序序列并输出。

输入描述:
输入包含三行,
第一行包含两个正整数n, m,用空格分隔。n表示第二行第一个升序序列中数字的个数,m表示第三行第二个升序序列中数字的个数。
第二行包含n个整数,用空格分隔。
第三行包含m个整数,用空格分隔。

两个有序序列在合并时我们可以拿两个数列第一个数开始比较,小的那个数放到一个新的数列中,同时那个小的数列的下表加一,新数列的下标也加一。直到有一个数列遍历完后,将剩下的那个未完全赋值到新数列的数列剩下的数加到新数列的后面即可完成

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		int n1, n2;
		n1 = scan.nextInt();
		n2 = scan.nextInt();
		int[] arr1 = new int[n1];
		int[] arr2 = new int[n2];
		for (int i = 0; i < n1; i++) {
			arr1[i] = scan.nextInt();
		}
		for (int i = 0; i < n2; i++) {
			arr2[i] = scan.nextInt();
		}
		int[] arr = new int[n1 + n2];
		int i = 0;// arr1
		int j = 0;// arr2
		int k = 0;// arr
		// 比较并赋值
		for (; i < n1 && j < n2;) {
			if (arr1[i] > arr2[j]) {
				arr[k] = arr2[j];
				k++;
				j++;
			} else {
				arr[k] = arr1[i];
				i++;
				k++;
			}
		}
		// 将未赋值的复制到新数列中
		if (i != n1) {
			for (; i < n1; i++, k++) {
				arr[k] = arr1[i];
			}
		} else {
			for (; j < n2; j++, k++) {
				arr[k] = arr2[j];
			}
		}
		for (int num = 0; num < n1 + n2; num++) {
			System.out.print(arr[num] + " ");
		}
	}
}

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值