实验二
(1)把 2019 分解成 3 个各不相同的正整数之和,并且要求每个正整数都不包 含数字 2 和 4,一共有多少种不同的分解方法? 注意交换 3 个整数的顺序被视为同一种方法,例如 1000+1001+18 和 1001+1000+18 被视为同一种。
(2)请实现从键盘输入10个数字,然后使用选择排序、冒泡排序、插入排序实现数字排序,并输出。
(3)一个字符串的非空子串是指字符串中长度至少为 1 的连续的一段字符组成 的串。例如,字符串aaab 有非空子串a, b, aa, ab, aaa, aab, aaab,一共 7 个。 注意在计算时,只算本质不同的串的个数。 请问,字符串0100110001010001 有多少个不同的非空子串?
package java实验2;
public class First {
public static void main(String args[]) {
//计算三数之和为2019
int ans = 0;
for(int i = 1;i <= 2019/2;i++) {
if(juge(i)==0) continue;
for(int j = i+1;j<=2019;j++) {
if(juge(j)==0) continue;
for(int k = j+1;k<=2019;k++) {
if(juge(k)==0) continue;
if(i+j+k == 2019) {
ans++;
}
}
}
}
System.out.println(ans);
}
public static int juge(int x) {
//1表示此数不包含2或者4,0表示包含
int flag = 1;
while(x>0) {
if (x % 10 == 2 || x % 10 == 4) {
flag = 0;
break;
}
else {
x /= 10;
}
}
return flag;
}
}
package java实验2;
import java.util.Scanner;
public class Second {
public static void main(String args[]) {
Scanner reader = new Scanner(System.in);
int [] numbers = new int[10];
for (int i = 0;i<numbers.length;i++) {
numbers[i] = reader.nextInt();
}
int [] numbers2 = numbers; //复制两个数组
int [] numbers3 = numbers;
//冒泡
for(int i = 0;i < numbers.length ;i++ ) {
for (int j=0;j<numbers.length - 1;j++) {
if(numbers[j]>numbers[j+1]) {
int temp;
temp = numbers[j+1];
numbers[j+1] = numbers[j];
numbers[j] = temp;
}
}
}
//插入
for (int i = 1; i < numbers2.length; i++) {
int key = numbers[i];
int j = i - 1;
// 将大于key的元素向后移动一位
while (j >= 0 && numbers[j] > key) {
numbers[j + 1] = numbers[j];
j = j - 1;
}
numbers[j + 1] = key; // 将key插入到正确的位置
}
// 选择
for (int i = 0; i < numbers3.length - 1; i++) {
// 寻找[i, end]区间内的最小值
int minIndex = i;
for (int j = i + 1; j < numbers.length; j++) {
if (numbers[j] < numbers[minIndex]) {
minIndex = j; // 更新最小值的索引
}
}
// 将找到的最小值和第i位置所在的值交换
if (minIndex != i) {
int temp = numbers[i];
numbers[i] = numbers[minIndex];
numbers[minIndex] = temp;
}
}
System.out.println("冒泡排序结果为:");
for (int number : numbers) {
System.out.print(number+" ");
}
&nbs