import java.time.LocalDate;
import java.util.*;
public class Suanfa {
public static void main(String[] args) {
// test1(10);
// test2();
// test3();
// test4(" abcUUU 12225 i*&@ ()J");
// test5();
// test6(new ArrayList<Integer>(Arrays.asList(5, 8, 0, 1, 7, 4, 3, 9, 1, 10)));
// test7();
// test8(13); //只要不是双数都能work
// test9(9);
// test10();
// test11();
// test12();
// test13(12400);
// test14(12321);
// test15();
// test16();
// test17();
// test18();
// test19();
test20();
}
/**
* 题目1:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,
* 假如兔子都不死,问每个月的兔子总数为多少?
*/
public static void test1(int n) {
if (n<=0) {
System.out.println("your parameter must more than 0");
}
for (int i=1; i<=n; i++) {
System.out.println(i+": "+ fun1(i));
}
}
public static int fun1(int n) {
if (n > 2) {
return fun1(n-1) + fun1(n-2);
} else {
return 1;
}
}
/**
* 判断101-200之间有多少个素数,并输出所有素数。
* 1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。
*/
public static void test2() {
for (int i=101; i<=200; i++) {
boolean sushu = true;
for (int j=2; j<i; j++) {
if (i%j == 0) {
sushu = false;
break;
}
}
if (sushu) {
System.out.println(i);
}
}
}
/**
* 题目3:打印出所有的 水仙花数 ,所谓 水仙花数 是指一个三位数,其各位数字立方和等于该数本身。
* 例如:153是一个 水仙花数 ,因为153=1的三次方+5的三次方+3的三次方。
* 1.程序分析:利用for循环控制100-999个数,每个数分解出个位,十位,百位。
*/
public static void test3() {
for (int i = 100; i <= 999; i++) {
int ge = i % 10;
int shi = (i / 10) % 10;
int bai = i / 100;
if (ge * ge * ge + shi * shi * shi + bai * bai * bai == i) {
System.out.println(i);
}
}
}
/**
* 题目4:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
*/
public static void test4(String str) {
char[] chars = str.toCharArray();
int english = 0;
int space = 0;
int num = 0;
int others = 0;
for (char c: chars) {
if (c == ' ') {
space++;
} else if (c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z'){
english++;
} else if (c >= '0' && c<='9') {
num++;
} else {
others++;
}
}
System.out.println("字母:"+english);
System.out.println("数字:"+num);
System.out.println("空格:"+space);
System.out.println("其他:"+others);
}
/**
* 题目5:输入某年某月某日,判断这一天是这一年的第几天?
*/
public static void test5() {
LocalDate parse = LocalDate.parse("2021-02-03");
int dayOfYear = parse.getDayOfYear();
System.out.println(dayOfYear);
}
/**
* 题目6:输入三个整数x,y,z,请把这三个数由小到大输出。
*/
public static void test6(ArrayList<Integer> integers) {
for (int i=0; i<integers.size(); i++) {
for (int j=i; j<integers.size(); j++) {
if (integers.get(i) > integers.get(j)) {
int tmp = integers.get(i);
integers.set(i, integers.get(j));
integers.set(j, tmp);
}
}
}
System.out.println(integers);
}
/**
* 题目7:输出9*9口诀乘法表。
*/
public static void test7() {
for (int i=1; i<=9; i++) {
for (int j=1; j<=i; j++) {
System.out.print( j + "x" + i + "=" + j*i + " ");
}
System.out.println();
}
}
/**
* 题目8:打印出如下图案(三角形)
* *
* ***
* *****
* *******
* *****
* ***
* *
*/
public static void test8(int line) {
int middle = (line+1)/2;
for (int i=1 ; i<middle ; i++) {
for (int j=1; j<=2*i -1; j++) {
System.out.print("*");
}
System.out.println();
}
for (int i=middle; i<=line; i++) {
for (int j=1; j<=line-(i-middle)*2; j++) {
System.out.print("*");
}
System.out.println();
}
}
/**
* 题目9:打印出如下图案(菱形)
*/
public static void test9(int line) {
int middle = (line+1)/2;
for (int i=1; i<middle; i++) {
for (int j=1; j<=line; j++) {
if (j> middle - i && j< middle + i) {
System.out.print("*");
} else {
System.out.print(" ");
}
}
System.out.println();
}
for (int i=middle; i<=line; i++) {
for (int j=1; j<=line; j++) {
if (j>=i+1-middle && j<=line-i+middle) {
System.out.print("*");
} else {
System.out.print(" ");
}
}
System.out.println();
}
}
/**
* 题目10:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。
*/
public static void test10() {
float fm = 1f;
float fz = 1f;
float sum = 0f;
for (int i=0; i<20; i++) {
float tmp = fm;
fm = fz;
fz = tmp + fz;
sum += fz/fm;
System.out.println((int)fz+"/"+(int)fm);
}
System.out.println(sum);
}
/**
* 题目11:求1+2!+3!+...+20!的和。
*/
public static void test11() {
long sum = 0;
long fac = 1;
for (int i = 1; i <= 20; i++) {
fac = fac * i;
sum += fac;
}
System.out.println(sum);
}
/**
* 题目12:利用递归方法求5!。
*/
public static void test12() {
System.out.println(fun12(5));
}
public static long fun12(long i) {
if (i==1) {
return 1;
} else {
return i * fun12(i - 1);
}
}
/**
* 题目13:给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。
*/
public static void test13(long num) {
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append(num);
int length = stringBuffer.length();
StringBuffer reverse = stringBuffer.reverse();
System.out.println(length);
System.out.println("origin: " + num);
System.out.println("reverse: " + reverse);
}
/**
* 题目14:一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。
*/
public static void test14(long num) {
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append(num);
StringBuffer reverse = stringBuffer.reverse();
String str = "" + num;
System.out.println(str);
System.out.println(num);
if (str.equals(reverse.toString())) {
System.out.println("是回文");
} else {
System.out.println("不是回文");
}
}
/**
* 题目15:对10个数进行排序。
*/
public static void test15() {
Random random = new Random();
int[] array = new int[10];
for (int i=0; i<array.length; i++) {
array[i] = random.nextInt(10);
}
System.out.println(Arrays.toString(array));
//排序
// for (int i=0; i<array.length; i++) {
// for (int j=i; j<array.length; j++) {
// if (array[i] > array[j]) {
// int tmp = array[i];
// array[i] = array [j];
// array [j] = tmp;
// }
// }
// }
// System.out.println(Arrays.toString(array));
Arrays.sort(array);
System.out.println(Arrays.toString(array));
}
/**
* 题目16:有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。
*/
public static void test16() {
//准备已经排好序的数组
Random random = new Random();
Integer[] array = new Integer[10];
for (int i=0; i<array.length; i++) {
array[i] = random.nextInt(10);
}
Arrays.sort(array);
System.out.println(Arrays.toString(array));
Arrays.sort(array, Collections.reverseOrder());
System.out.println(Arrays.toString(array));
//准备完毕
//先判断是什么顺序
boolean isAscendingOrder = true;
if (array[0] > array[array.length-1]) {
isAscendingOrder = false;
}
int yourNum = 5;
int[] newArray = new int[11];
if (isAscendingOrder) {
for (int i = 0; i <= array.length; i++) {
if (yourNum > array[i]) {
newArray[i] = array[i];
} else {
newArray[i] = yourNum;
for (int j= i; j<array.length; j++) {
newArray[j+1] = array[j];
}
break;
}
}
} else {
for (int i = 0; i <= array.length; i++) {
if (yourNum < array[i]) {
newArray[i] = array[i];
} else {
newArray[i] = yourNum;
for (int j= i; j<array.length; j++) {
newArray[j+1] = array[j];
}
break;
}
}
}
System.out.println(Arrays.toString(newArray));
}
/**
* 题目17:打印出杨辉三角形(要求打印出10行如下图)
* 1
* 1 1
* 1 2 1
* 1 3 3 1
* 1 4 6 4 1
* 1 5 10 10 5 1
*/
public static void test17() {
int i, j;
int a[][];
int n = 10;
a = new int[n][n];
for (i = 0; i < n; i++) {
a[i][i] = 1;
a[i][0] = 1;
}
for (i = 2; i < n; i++) {
for (j = 1; j <= i - 1; j++) {
a[i][j] = a[i - 1][j - 1] + a[i - 1][j];
}
}
for (i = 0; i < n; i++) {
for (j = 0; j <= i; j++) {
System.out.printf(a[i][j] + "\t");
}
System.out.println();
}
}
/**
* 题目18:写一个函数,求一个字符串的长度,在main函数中输入字符串,并输出其长度。
*/
public static void test18() {
Scanner in = new Scanner(System.in);
System.out.println("请输入一个字符串:");
String mys = in.next();
System.out.println("字符长度: "+mys.length());
}
/**
* 题目19:编写一个函数,输入n为偶数时,调用函数求1/2+1/4+...+1/n,当输入n为奇数时,调用函数1/1+1/3+...+1/n
*/
public static void test19() {
Scanner in = new Scanner(System.in);
System.out.println("请输入一个数字: ");
String input = in.next();
int num = Integer.parseInt(input);
float sum = fun19(num, num%2 != 0);
System.out.println(sum);
}
public static float fun19(int num, boolean isOddNum) {
int initial = 2;
if (isOddNum) {
initial = 1;
}
float sum = 0;
for (int i=initial; i<=num ; i+=2) {
sum += 1/(float)i;
}
return sum;
}
/**
* 题目20:计算字符串中子串出现的次数。并且打印下标的位置。
*/
public static void test20() {
String target = "abc";
String origin = "abc9a9abc000jjjbcabc_8ab^abc";
String[] array = origin.split(target);
System.out.println("原字符串: "+origin);
System.out.println(target + "出现的个数:" + array.length);
int index = 0;
for (int i=0; i<array.length; i++) {
index+=array[i].length();
System.out.println(target +"出现的下标位置: "+index);
index += target.length();
}
}
}
20道Java基础算法题
最新推荐文章于 2023-12-25 06:49:45 发布