java基础练习,持续添加
1、
// 循环结构(上)
// 随机生成一个1-10之间的数字num,循环让用户输入猜这个数,
// 如果用户输入的数字大于num提示输入的数字比较大,
// 如果用户输入的数字小于num提示输入的数字比较小,
// 直到用户输入的数字和num相等为止,然后输出用户猜数的总次数
Scanner scan= new Scanner(System.in);
Random ran= new Random();
//生成游戏答案1~100
int num = ran.nextInt(10)+1;
//System.out.println(num);
int n = 0;//定义n的初值
int i = 0;//定义猜数次数
while(n != num) {
System.out.println("请猜数字");
n=scan.nextInt();
if(n > num) {//判断猜数结果
System.out.println("输入的数字较大");
}else if(n < num) {
System.out.println("输入的数字较小");
}else {
System.out.println("恭喜您猜对了");
}
i++;//猜数次数加1
}
System.out.println("总共猜了"+i+"次");
2、
//4.2打印出1-100之间所有不是7的倍数和不包含7的数字,并求和
int sum = 0;
for (int i = 1; i <= 100; i++) {
if(i % 7 == 0 || i / 10 == 7 || i % 10 == 7){
continue;
}else{
sum += i;
System.out.println(i);
}
}
System.out.println(sum); //3281
3、
//循环结构(下)
//5.1有一个有钱的神经病,他往银行里存钱,
//第一天存1元,以后每天比前一天多存50%,完成下列计算任务
//1)他存到第几天,当天存的钱会超过10元
int day = 1;
Double j;
for (j = 1.0; j <= 10; j++) {
j*=1.5;
day ++;
System.out.println(j);
}
System.out.println(day);
4、
//一个月(30天)后,他总共存了多少钱
double sum = 0;
double money = 1;
for (int i = 1; i <= 30; i++) {
sum += money;
System.out.println("第" + i + "天" + ",当天存款为:" + money);
money *= 1.5;
}
System.out.println("总计:" + Math.round(sum) );
5、
//有一个400米一圈的操场,一个人要跑10000米,
//第一圈50秒,其后每一圈都比前一圈慢1秒,
//按照这个规则计算跑完10000米需要多少秒
int minutes = 50;
int round = 10000 / 400;
int sum = 0;
for (int i = 1; i <= round; i ++ ) {
sum += minutes;
System.out.println("第" + i + "圈,所花时间:"+minutes+"秒");
minutes ++;
}
System.out.println("花的时间:"+sum);
//第25圈,所花时间:74秒
//花的时间:1550
6、
//用户输入任意一个整数,求各位数字之和
Scanner scan=new Scanner(System.in);
System.out.println("请输入一个数字");
int i = scan.nextInt();
int sum = 0;
while (i > 0){
sum += (i%10);
i /= 10;
System.out.println(i);
}
System.out.println(sum);
//567
//56
//5
//0
//18
7、这道题看起来简单,但却有点意思
//井里有一只蜗牛,他白天往上爬5米,晚上掉3.5米,井深56.7米
//计算蜗牛需要多少天才能从井底到爬出来
int day = 0;
double sum = 0.0;
while (true){
sum += 5;
day ++;
if(sum > 56.7){
break;
}
sum -= 3.5;
}
System.out.println(day); //36
8、
//循环嵌套,求1~1000以内质数列表
//PS:质数是只能被1和自身整除的整数
int i,j;
boolean isFlag = true;
for (i = 2; i <= 100; i++) {
for (j = 2; j <= Math.sqrt(i); j++) { //很严肃的问题!这里j能设置为1吗?为什么?
if(i % j == 0){
isFlag = false;
break;
}
}
if(isFlag) {
System.out.println(i);
}
isFlag = true;
} //回答上面的问题!!任何数取余1等于多少?
}
//方式二 不建议!因为运行时间太长
@Test
public void test(){
for (int i = 2; i <= 100; i++) {
int j = 2;
for (; j <= i; j++) {
if(i % j == 0){
break;
}
}
if(i == j){ //避免漏掉2,也隔离掉break后的打印
System.out.println(i);
}
}
}
9、
//求数组中的最大值和最大值所在的下标
//int型数组转Integer数组
int[] nums={6,8,1,9,5,2,7};
//方式一:
int max = 0;
int index = 0;
for (int i = 0; i < nums.length; i++) {
if(max < nums[i]){
max = nums[i];
index = i;
}
}
//最大值
System.out.println(max); //9
System.out.println(index); //3
//输出int型数组中最大值的下标
//首先int型数组转Integer数组。boxed()装箱再转Integer数组
Integer[] integers = Arrays.stream(nums).boxed().toArray(Integer[]::new);
int maxValIndex = Arrays.asList(integers).indexOf(max);
System.out.println(maxValIndex); //3
//求最大值方式二:
int maxVal = Arrays.stream(nums).max().getAsInt();
System.out.println(maxVal); //9
10、
//(选做)向一个长度为10的整型数组中随机生成10个0~9的随机整数,完成下列任务
//1)统计每个数字出现了多少次
//2)输出出现次数最多的数字
//3)输出只出现一次的数字中最小的数字
Random r = new Random();
// 1. 声明源数组,包含10个0-9之间的随机数
int[] src = new int[10];
// 2. 声明一个标记数组,存放的是0-9,10个数字
int[] flag = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
// 3. 声明一个用来统计标记数组中数字在源
// 数组中的个数
int[] count = new int[flag.length];
// 4. 给源数组赋值0-9之间的随机数
for (int i = 0; i < src.length; i++) {
src[i] = r.nextInt(10);
}
// 5. 统计标记数组中的每个元素在源数组中
// 有多少个即给count数组赋值
for (int i = 0; i < flag.length; i++) {
for (int j = 0; j < src.length; j++) {
// 如果标记数组中的数字在源数组中有,则count+1
if (flag[i] == src[j]) {
count[i]++;
}
}
}
// 6. 输出src和count的数据
System.out.println("随机产生的数据如下:");
System.out.println(Arrays.toString(src));
// System.out.println(Arrays.toString(count));
// a.统计每个数字出现的次数
// 如果count中的元素的值大于0,则输出其下标和值
for (int i = 0; i < count.length; i++) {
if (count[i] > 0) {
System.out.println("数字" + i + "出现" + count[i] + "次");
}
}
// b.输出出现最多次数的数字
// 假设第一个统计的数字就是最多那个
int max = count[0];
int index = 0;
for (int i = 0; i < count.length; i++) {
if (count[i] > max) {
max = count[i];
index = i;
}
}
System.out.println("出现次数最多的数字是" + index);
System.out.println("出现次数最多的数字是" + flag[index]);
// c. 输出只出现一次的数字中最小的数字
for (int i = 0; i < count.length; i++) {
if (count[i] == 1) {
System.out.println("出现1次的数字中最小的是" + i);
break;
}
}
11、
//题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,
//小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,键盘输入月份,问兔子对数为多少?
//程序分析:这是一个菲波拉契数列问题,兔子的规律为数列1,1,2,3,5,8,13,21
Scanner scanner = new Scanner(System.in);
System.out.println("输入整数");
int month = scanner.nextInt();
int tot = 0;
int a = 0;
int b = 1;
for(int j = 1; j <= month; j++){
tot = a+b;
a = b;
b = tot;
System.out.println("第"+j+"个月兔子数量为:" + a);
}
//输入10
//第8个月兔子数量为:21
//第9个月兔子数量为:34
//第10个月兔子数量为:55
//方式二:
System.out.println(fun(month)); //55
}
private static int fun(int n) {
if(n == 1 || n == 2){
return 1;
}else{
return fun(n-1) + fun(n-2);
}
}
//理解:n=1或n=2时为1,而n-1(前一位)和n-2(前两位)相加等于n, 1 1 2 3 5 8... 3+5=8
12、
//将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。
Scanner scanner = new Scanner(System.in);
int i = scanner.nextInt();
int x = i / 2;
for (int j = 2; j <= x; j++) {
if(i % j == 0){
i /= j;
System.out.println(j);
j=1; //注意这里j=1,上去j++后到i % j 的时候j就等于2了,这里也可以写成j--;
}
}
13、
//题目:利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。
Scanner scanner = new Scanner(System.in);
int i = scanner.nextInt();
String score = i >= 90 ? "A" : (i >= 60 && i <= 89 ? "B" : "C");
System.out.println(score);
14、
//输入两个正整数m和n,求其最大公约数和最小公倍数
//最大公约数:能同时被x、y整除的最大数
Scanner scanner = new Scanner(System.in);
int x = scanner.nextInt();
int y = scanner.nextInt();
int xx = 0;
System.out.println("min:" + Math.min(x,y));
System.out.println("x > y?:" + (x > y?x:y));
for (int i = 2; i < Math.min(x,y); i++) {
if(x % i == 0 && y % i == 0){
xx = i;
}
}
System.out.println("最大公约数" + xx);
//最小公倍数:能同时整除x、y最小的数
for (int i = 2; i < x * y; i++) {
if(i % x == 0 && i % y == 0){
System.out.println("最小公倍数" + i);
break;
}
}
//min:12
//x > y?:18
//最大公约数6
//最小公倍数36
}
@Test
public void test1(){
//另外还可以得出最大公约数xx后,直接用x*y / xx
System.out.println(12*18 / 6); //36
15、
//输入一行字符,分别统计出其英文字母、空格、数字和其它字符的个数
Scanner scanner = new Scanner(System.in); //Hello World 123456789 @#$% *
scanner.useDelimiter("\n"); //没有使用定界符打印 Hello
String str = scanner.next();
System.out.println(str);
char[] chars = str.toCharArray();
int word = 0;
String wordStr = "";
int digit = 0;
String digitStr = "";
int space = 0;
String spaceStr = "";
int other = 0;
String otherStr = "";
for (int i = 0; i < chars.length; i++) {
int ascii = (int)chars[i];
if(ascii >= 65 && ascii <= 90 || ascii >= 97 && ascii <= 122){
word++;
wordStr += chars[i];
}else if(ascii >= 48 && ascii <= 57){
digit++;
digitStr += chars[i];
}else if(ascii == 32){
space++;
}else{
other++;
otherStr += (char)ascii;
}
}
System.out.println("存在字母个数:" + word);
System.out.println("存在字母如下:" + wordStr);
System.out.println("存在数字个数:" + digit);
System.out.println("存在数字如下:" + digitStr);
System.out.println("存在空格个数:" + space);
System.out.println("存在其他个数:" + other);
System.out.println("存在其他如下:" + otherStr);
}
//Hello World 123456789 @#$% *
//存在字母个数:10
//存在字母如下:HelloWorld
//存在数字个数:9
//存在数字如下:123456789
//存在空格个数:4
//存在其他个数:5
//存在其他如下:@#$%*
16、
//求s=a+aa+aaa+aaaa+aa…a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),
//几个数相加有键盘控制。输出结果的形式如:2+22+222=246;
Scanner scanner = new Scanner(System.in);
System.out.println("输入数字");
int a = scanner.nextInt();
System.out.println("输入相加次数");
int b = scanner.nextInt();
String numStr = "";
String result = "";
BigDecimal bigDecimal = new BigDecimal("0");
for (int i = 0; i < b; i++) {
numStr += a;
if(i == 0){
result += numStr; //第一次没有+
}else{
result += "+" + numStr;
}
bigDecimal = bigDecimal.add(new BigDecimal(numStr));
}
result = result + "=";
System.out.println("结果为:" + result + bigDecimal);
}
//输入数字
//1
//输入相加次数
//6
//结果为:1+11+111+1111+11111+111111=123456
//方式二:
int n=0,a=0;
Scanner scanner=new Scanner(System.in);
System.out.println("请输入a的值:");
a=scanner.nextInt();
System.out.println("请输入n的值:");
n=scanner.nextInt();
int[] arr=new int[n];//创建数组长度为输入的项数
int i=1;//while循环初始化的值
arr[0]=a;//数组的第一个值为3
//把每一项的值赋值给数组里面的数
while (i<n) {
a*=10; //第二项和前一项相差a*10
arr[i]=a+arr[i-1]; //a=3 3 30+3 300+33 3000+333
i++;
}
//求和
int sum=0;
for(int s:arr){
sum+=s;//累加求和
if (s==arr[n-1]) {
System.out.print(s);
break;//最后一次只输出结果
}
System.out.print(s+"+");//前面的值输出结果,后面还要加一个加号
}
System.out.println("="+sum);//完美结束
17、
//一个数如果恰好等于它的因子之和,这个数就称为”完数”。例如6=1+2+3.编程找出1000以内的所有完数。
// BigDecimal bigDecimal = new BigDecimal(""); 报错Index 0 out of bounds for length 0
//方式一
// BigDecimal bigDecimal = new BigDecimal("0"); //这样写打印为0
// for (int i = 2; i < 1000; i++) {
// for (int j = 1; j <= i/2; j++) {
// if(i % j == 0){
// bigDecimal = bigDecimal.add(new BigDecimal(j));
// }
// }
// if(i == Integer.parseInt(bigDecimal.toString())){
// System.out.println(i);
// bigDecimal = new BigDecimal("0");
// }else {
// bigDecimal = new BigDecimal("0");
// }
// }
//方式二
for (int i = 2; i < 1000; i++) {
int sum = 0;
for (int j = 1; j <= i/2; j++) {
if(i % j == 0){
sum += j;
}
}
if(i == sum){
System.out.println(i);
}
}
//6
//28
//496
18、
//一球从100米高度自由落下,每次落地后反跳回原高度的一半;n次落地经过路线总长度和下次反弹的高度
//思路:落下100米,下次弹起50;第二次落下50,(弹起==落下)输入2,总长度200,下次弹起25
//方式一:
Scanner scanner = new Scanner(System.in);
System.out.println("输入落地的次数");
int i = scanner.nextInt();
double height = 0;
int count = 0;
for (double j = 100; j >= 0 ; j/=2) {
if(count == i){
System.out.println(i + "次落地经过路线总长度:" + height);
System.out.println("下次反弹的高度为:" + j);
break;
}
count++;
if(count == 1){
height += j; //第一次下落100米
}else{
height += j*2; //后面弹起落下都相等
}
}
//方式二:
Scanner scanner = new Scanner(System.in);
System.out.println("请选择第几次落地:");
int n = scanner.nextInt();
double height = 100;
double sumLength = 0;
for(int i=1; i<=n; i++){
if(i==1){
sumLength = sumLength + height; //第一次落下
}else{
sumLength = sumLength + height*2; //后面每次弹起落下
}
height = height/2; //高度每次减半
}
System.out.println("总运动距离为:"+sumLength);
System.out.println("反弹高度为:"+height);
}
//3
//总运动距离为:250.0
//反弹高度为:12.5
19、
//题目:输入某年某月某日,判断这一天是这一年的第几天?
System.out.println("请输入年月日(用空格隔开):");
Scanner scanner=new Scanner(System.in);
int year=scanner.nextInt();//获取年份
int month=scanner.nextInt();//获取月份
int day=scanner.nextInt();//获取天数
int sum=0;//天数总和
//创建一个包含月份天数的数组,先按小年计算,如果是闰年,并且在三月以后再加1
int[] arr={day,31,28,31,30,31,30,31,31,30,31,30};
for (int i = 0; i < month; i++) { //加上包含的月份天数
sum+=arr[i];
}
//最后判断是否是闰年,如果是的话再加1,否则sum就是结果了,条件比较长,我就抽出来写了
boolean isRight=(((year%4==0)&&(year%100!=0))||(year%400==0))&&(month>2);
if (isRight) {
sum+=1;
}
System.out.println(year+"年"+month+"月"+day+"日,是这年的第"+sum+"天");
}
//请输入年月日(用空格隔开):
//2020 3 5
//2020年3月5日,是这年的第65天
20、
//题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个。
//以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。
//程序分析:采取逆向思维的方法,从后往前推断。
//10 9 8 7 6 5 4 3 2 1
//1((n+1)*2) 4 10 22 46 也可以n*2+2
int last = 1;
for (int i = 1; i <= 10; i++) {
if(i == 1){
System.out.println("第" + (11-i) + "天的桃子数量:" + last );
}else{
// last = (last+1)*2;
last = last*2+2; //也可以
System.out.println("第" + (11-i) + "天的桃子数量:" + last );
}
}
//第10天的桃子数量:1 ...4 10 22 46 94 190
//第2天的桃子数量:766
//第1天的桃子数量:1534
21、
//题目:两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。
//已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,
//请编程序找出三队赛手的名单。
char a,b,c;
for(a = 'x'; a <= 'z'; a++){
for (b = 'x'; b <= 'z'; b++){
for (c = 'x'; c <= 'z'; c++){
if(a != b && a != c && b != c){ //对手避免重复
if(a != 'x' && c != 'x' && c != 'z'){ //不和x,z比
System.out.println("a=" + a + ",b=" + b + ",c=" + c);
}
}
}
}
}//a=z,b=x,c=y
//方式二:
String a,b,c = null;//甲队成员
String[] racer = {"x","y","z"};//乙队成员
for(int i = 0; i < 3; i++){
for (int j = 0; j <3;j++) {
for (int k = 0; k < 3;k++) {
if (i != j && i != k && j != k) {
a = racer[i];
b = racer[j];
c = racer[k];
if (!a.equals("x") && !c.equals("z") && !c.equals("x")) {
System.out.println("a="+racer[i]+",b="+racer[j] +",c="+racer[k] );
}
}
}
}
}
22、
// *
// * *
//* * *
// * *
// *
//依照此图,输入数字3,行中"*"最大为3,输入4则最大为4行
int a = 3;
for (int i = a; i > 0; i--) { //注意这里,第一次循环直接空一行
for (int j = 0; j < i; j++) {
System.out.print(" ");
}
for (int j = 0; j < a-i; j++) { //这里第一次循环并没有进入
System.out.print("* ");
}
System.out.println("");
}
for (int i = 0; i < a ; i++) {
for (int j = 0; j < i; j++) { //这里第一次循环并没有进入
System.out.print(" ");
}
for (int j = 0; j < a-i; j++) { //第一次循环直接进入这里打印a个*
System.out.print("* ");
}
System.out.println("");
}
23、
//题目:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13…求出这个数列的前20项之和。
//方式一:
//找规律2/1(a/b) 3/2(a+b/b)
double a = 2.0, b = 1.0, c = 0;
double sum = a / b; //第一次
for (int i = 1; i < 20; i++) { //循环19次
c = a + b;
b = a;
a = c;
System.out.println("a=" + a + ", b=" + b);
sum += a / b;
}
System.out.println(sum);
//a=17711.0, b=10946.0
//32.66026079864164
//方式二:
//找规律:2/1,3/2,5/3,8/5,(8/5 8=3+5, 5=2+3)
//a = m-1 + m-2, b = m-2 + m-3
double sum = fun(20);
System.out.println(sum); //32.66026079864164
}
private static double fun(int i) {
if(i==1){
return 2.0/1.0;
}else {
double a = molecule(i);
double b = molecule(i-1);
return fun(i-1) + a/b;
}
}
private static double molecule(int i) {
if(i==1){
return 2.0;
}else if(i==2){
return 3.0;
}
return molecule(i-1) + molecule(i-2);
}
24、
//题目:求0!+1!+2!+3!+…+20!的和。
//阶乘 0!=1, 1!=1, 2!=1*2=2, 3!=1*2*3=6,4!=1*2*3*4=24
long sum = 1; //初始0!=1,这里使用int无法满足268040730
for (int i = 1; i <= 20; i++) {
sum += factorial(i);
}
System.out.println(sum); //2561327494111820314
}
private static long factorial(int i) {
long multiply = 1;
for (int j = 1; j <= i; j++) {
multiply *= j;
}
return multiply;
}
//递归
if(i==1){
return 1;
}else {
return factorial(i-1) * i; //递归:i如果=5, (i-1)=4 * 5...; 终止条件当i==1则返回1 *2*3*4*5
}
}
25、
//题目:有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。
// 问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。
// 问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?
System.out.println(fun(5)); //18
}
private static int fun(int i) {
if(i == 1){ //设置终止条件为第1个人10岁
return 10;
}else{
return fun(i-1) + 2; //每个人加2
}
}
26、
//题目:给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。
Scanner scanner = new Scanner(System.in);
System.out.println("输入正整数");
int i = scanner.nextInt();
//方式一:
String s = String.valueOf(i);
int length = s.length();
System.out.println(length); //长度
char[] chars = s.toCharArray();
for (int j = length-1; j >= 0; j--) {
System.out.print(chars[j]);
}
//方式二:
int[] arr = new int[5];
int n = 0;
do {
arr[n] = i%10; //直接从后取值
i /= 10;
n++;
}while (i != 0);
System.out.println("位数:" + n);
Arrays.stream(arr).forEach(System.out::print);
}
//45678
//位数:5
//87654
27、
//对10个数进行排序
Scanner scanner = new Scanner(System.in);
System.out.println("输入10个数,空格隔开");
int[] arr = new int[10];
for (int j = 0; j < arr.length; j++) {
arr[j] = scanner.nextInt();
}
int max = 0;
for (int i = 0; i < arr.length-1; i++) {
for (int j = i+1; j < arr.length; j++) {
if(arr[i] > arr[j]){
max = arr[i];
arr[i] = arr[j];
arr[j] = max;
}
}
}
System.out.println(Arrays.toString(arr));
//9 6 3 8 4 1 2 5 7 0
//[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
28、
//题目:随机输入9个数,按照3*3矩阵排列,求正向及反向对角线元素之和
Random random = new Random();
int a = 0;
int b = 0;
int[][] arr = new int[3][3];
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
arr[i][j] = random.nextInt(20)+1;
System.out.print(arr[i][j] + " ");
if(i == j){
a += arr[i][j];
}if(i+j == arr.length-1){ //经典之处 i+j = 2
b += arr[i][j];
}
}
System.out.println();
}
System.out.println("正向对角线:" + a);
System.out.println("反向对角线:" + b);
}
//12 1 9
//8 10 20
//15 20 2
//正向对角线:24
//反向对角线:34