1.比较三个数中的最大数
int o = 5;
int p = 6;
int q = 7;
System.out.println( o > p && o > q);//false
System.out.println( p > o && p > q);//false
System.out.println( q > p && q > o);//true
System.out.println(q);
System.out.println("----------------------------------------");
int u = (o > p ? o : p);//p
int v = (p > q ? p : q);//q
int w = (p > q ? p : q);//q
System.out.println(u > w ? u : w);
问题:O与P想比较之后的值就是U,无需再进行多余比较。
优化:
int u = (o > p ? o : p);//p
System.out.println(u > q ? u : q);
——————————————————————————————————————————————————————
2.按条件求Y的值
import java.util.Scanner;
class hh {
public static void main(String [] args) {
Scanner a = new Scanner(System.in);
int x = a.nextInt();
int y;
if(x >= 3) {
y = 2*x + 1;
System.out.println("结果是"+y);
}else if (x > -1){
y = 2 * x;
System.out.println("结果是"+y);
}else {
y = 2 * x - 1;
System.out.println("结果是"+y);
}
}
}
问题:运算结果只需要在结尾输出一次,无需多次输出。
优化:
import java.util.Scanner;
class hh {
public static void main(String [] args) {
Scanner a = new Scanner(System.in);
int x = a.nextInt();
int y;
if(x >= 3) {
y = 2*x + 1;
}else if (x > -1){
y = 2 * x;
}else {
y = 2 * x - 1;
}
System.out.println("结果是"+y);
}
}
3.求四叶玫瑰树,并统计个数
public class Day06Test {
public static void main(String [] args) {
for (int i = 1000; i < 10000; i++) {
int j = (i/1000)*(i/1000)*(i/1000)*(i/1000);
int k = ((i/100)%10)*((i/100)%10)*((i/100)%10)*((i/100)%10);
int l = ((i/10)%10)*((i/10)%10)*((i/10)%10)*((i/10)%10);
int m = (i%10)*(i%10)*(i%10)*(i%10);
int n = j+k+l+m;
if( i== n){
System.out.println("这是一个四叶玫瑰树:"+n);
}
}
}
}
问题:求4次平方太过繁琐,且未统计出个数!
优化:可根据FOR循环嵌套求出4次平方值,其中的ABCD是在变化的;在for循环外面定义一个数,辅助计算个数。
class SI {
public static void main(String[] args) {
int count = 0;
for(int a = 1000; a < 10000; a++) {
int ge = a % 10;
int shi = a /10 % 10;
int bai = a /100 % 10;
int qian = a/1000;
int A = 1;
int B = 1;
int C = 1;
int D = 1;
for(int i = 0;i<4;i++){
A = A*ge;
B = B*shi;
C = C*bai;
D = D*qian;
if(A+B+C+D==a){
System.out.println("这是一个四叶玫瑰数:"+ a);
count++;
}
}System.out.println("四叶玫瑰数的个数为:"+ count);
}
}
}
4.给一个不多于5位的正整数,先求它是几位数,再逆序打印出各位数字。
import java.util.Scanner;
public class Test03 {
public static void main(String [] args) {
Scanner a = new Scanner(System.in);
System.out.println("请输入一位不多于5位的正整数");
int b = a.nextInt();
if (b/10000 >= 1) {
System.out.println("这是一个5位数");
int ge = b % 10;
int shi = b % 100 / 10;
int bai = b / 100 % 10;
int qian = b / 1000 % 10;
int wan = b /10000;
System.out.println("各位数字为:"+ge+shi+bai+qian+wan);
}else if (b/1000 >= 1){
System.out.println("这是一个4位数");
int ge = b % 10;
int shi = b % 100 / 10;
int bai = b / 100 % 10;
int qian = b / 1000;
System.out.println("各位数字为:"+ge+shi+bai+qian);
}else if (b/100 >= 1){
System.out.println("这是一个3位数");
int ge = b % 10;
int shi = b % 100 / 10;
int bai = b / 100;
System.out.println("各位数字为:"+ge+shi+bai);
}else if (b/10 >= 1){
System.out.println("这是一个2位数");
int ge = b % 10;
int shi = b / 10;
System.out.println("各位数字为:"+ge+shi);
}else{
System.out.println("这是一个1位数");
System.out.println("各位数字为:"+b);
}
}
}
问题:太过冗杂,LOW!
优化:可以利用for循环设置位数,再根据位数来求各个位上的值
值得注意的是:求各个位上的数字,除个位数外,都可以利用它们都能对10求整再对10取余。
import java.util.Scanner;
public class Test03_2 {
public static void main(String [] args) {
Scanner a = new Scanner(System.in);
System.out.println("请输入一位不多于5位的正整数");
int b = a.nextInt();
int c = b;
int d = b;
for(int e = 1; e <= 5; e++) {
b = b /10;
if(b == 0){
System.out.println("这是一个:"+e+"位数");
for(int f = e; f > 0; f--) {
c = d % 10;
d = d / 10;
System.out.print(" "+c);
}
break;
}
}
}
}
5.求1000以内的完数
要想到,只要是因子,那么取余就为0,要想到对一个数求它的因子就是让0—这个数的所有数都要除一次,利用循环。
public class Test02 {
public static void main(String [] args) {
for(int a = 1; a <= 1000; a++) {
int d = 0;
for(int b = 1; b < a; b++) {
if(a%b==0) {
d+=b;
}
}if(a==d){
System.out.println(a);
}
}
}
}
6.一天加2.5元,每5天减6元,何时能有100元。
public class Test01 {
public static void main(String [] args ){
int a = 0;
double b = 0.0;
for(; ; ) {
a++;
b += 2.5;
if(a % 5 == 0){
b-=6;
}
if (b >=100){
System.out.println(a);
break;
}
}
}
}
优化:利用while更简便
public class Test01 {
public static void main(String [] args ){
int a = 0;
double b = 0.0;
while(b <100) {
a++;
b += 2.5;
if(a % 5 == 0){
b-=6;
}
}System.out.println(a);
}
}
7.给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。
public class Test20_24 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个不多于5位的数字");
int a = sc.nextInt();
int no = 0;
int u = 1;
for(int i = 1; i <=5; i++) {
if(a/u==0) {
break;
}
u *= 10;
no++;
}System.out.println("这是一个"+no+"位数");
int v = 10;
for(int x = 1; x <= no; x++) {
if(a / v != 0) {
System.out.println(a%v+" ");
a = a/v;
}else {
System.out.println(a);
}
}
}
}
求几位数时,可以根据它可以除以几次10来判断,逆序打印时可以利用求余来做,要注意每次求余的数字都要变化。
8、有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。
public class Test27_30 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个数字");
int i = sc.nextInt();
int[] array = {12,20,35,49,55,69};
int[] array1 = new int[array.length+1];
boolean x = true;
for(int a = 0; a <= array.length-1; a++) {
int z = a;
if(i > array[a]&& i <9999) {
array1[a] = array[a];
z++;
if(z == 6) {
array1[z] = i;}
}else if(i < array[a]) {
array1[a] = i;
i =9999;
x = false;
}else if(x == false) {
array1[a] = array[a-1];
z++;
if(z == 6) {
array1[z] = array[a];
}
}
}
for(int c = 0; c <= array1.length-1; c++) {
System.out.println(array1[c]);
}
}
}
问题:在两个数组共用一个变量的时候就会显得复杂;
优化:定义两个变量分别代表两个数组的索引;
import java.util.Scanner;
public class Test28_30 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个数字");
int i = sc.nextInt();
int[] array = {12,20,35,49,55,69};
int[] array1 = new int[array.length+1];
int b = 0;
for(int a = 0; a <= array.length-1; a++) {
if(i > array[a]) {
array1[b] = array[a];
b++;
if(b == array.length) {//如果数字为最大的时候
array1[b] = i;
}
}else {
array1[b] = i;
i = 9999;
b++;
a--; //当数字为最小的时候, a的下一轮需要减1
}
}
for(int x = 0; x <= array1.length-1; x++) {
System.out.println(array1[x]);
}
}
}
9、输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组
import java.util.Scanner;
public class Test32_34 {
public static void main(String[] args) {
Scanner sc =new Scanner(System.in);
System.out.println("请输入数组元素个数");
int n = sc.nextInt();
int[] arr = new int[n];
for(int a = 0; a <= n-1; a++) {
System.out.println("请输入"+n+"个数字,现在输入第"+(a+1)+"个。");
arr[a] = sc.nextInt();
}System.out.print("输入的数组arr={");
for(int i = 0; i <= arr.length-1; i++) {
System.out.print(arr[i]+" ");
}System.out.println("}");
//------------------交换大元素-----------------------
int temp=0;
for(int i = 1; i <= arr.length-1; i++) {
if(arr[temp] < arr[i]) {
temp = i;
}
}
int temp1 = arr[0];
arr[0] = arr[temp];
arr[temp] = temp1;
System.out.print("交换大元素后为:");
for(int i = 0; i <= arr.length-1; i++) {
System.out.print(arr[i]+" ");
}System.out.println();
//---------------------交换小元素---------------------
int temp2 = arr.length-2;
for(int i = 0; i <= arr.length-1; i++) {
if(arr[temp2] >= arr[i]) {
temp2 = i;
}
}
int temp3 = arr[arr.length-1];
arr[arr.length-1] = arr[temp2];
arr[temp2] = temp3;
System.out.print("交换小元素后为:");
for(int i = 0; i <= arr.length-1; i++) {
System.out.print(arr[i]+" ");
}
}
}
问题:某些代码重复书写
优化:定义一个方法来解决
import java.util.Scanner;
public class Test32_34 {
public static void main(String[] args) {
Scanner sc =new Scanner(System.in);
System.out.println("请输入数组元素个数");
int n = sc.nextInt();
int[] arr = new int[n];
for(int a = 0; a <= n-1; a++) {
System.out.println("请输入"+n+"个数字,现在输入第"+(a+1)+"个。");
arr[a] = sc.nextInt();
}System.out.print("输入的数组arr={");
bianLi(arr);
System.out.println("}");
//------------------交换大元素-----------------------
int temp=0;
for(int i = 1; i <= arr.length-1; i++) {
if(arr[temp] < arr[i]) {
temp = i;
}
}
int temp1 = arr[0];
arr[0] = arr[temp];
arr[temp] = temp1;
System.out.print("交换大元素后为:");
bianLi(arr);System.out.println();
//---------------------交换小元素---------------------
int temp2 = arr.length-2;
for(int i = 0; i <= arr.length-1; i++) {
if(arr[temp2] >= arr[i]) {
temp2 = i;
}
}
int temp3 = arr[arr.length-1];
arr[arr.length-1] = arr[temp2];
arr[temp2] = temp3;
System.out.print("交换小元素后为:");
bianLi(arr);
}
public static void bianLi(int[] arr) {
for(int i = 0; i <= arr.length-1; i++) {
System.out.print(arr[i]+" ");
}
}
}
10、"aaaabbccddd!@#@#$%cc66ff"判断各个字符出现的次数
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
public class Demo_4 {
public static void main(String[] args) {
String s = "aaaabbccddd!@#@#$%cc66ff";
char[] ca = s.toCharArray();
Map<Integer, Character> map = new HashMap<Integer, Character>();
Integer a = 1;
for (char c : ca) {
map.put(a++, c);
}
Set<Entry<Integer, Character>> es = map.entrySet();
for (Entry<Integer, Character> entry : es) {
int i = 0;
for (Entry<Integer, Character> entry2 : es) {
if(entry.getValue().equals(entry2.getValue())) {
i++;
}
}
String ss = entry.getValue()+""+i+"个";
Set<String> sss = new HashSet<String>();
sss.add(ss);
System.out.println(sss);
}
}
}
问题:繁琐,且结果不是正常的,而且逻辑有问题,应该是把字符作为键,出现次数作为值,这样才好在又出现的时候进行统计工作。
优化:map集合中有特定的判断包含与否的方法containsKey()和containsValue();
import java.util.HashMap;
import java.util.Map;
public class Demo_5 {
public static void main(String[] args) {
String s = "aaaabbccddd!@#@#$%cc66ff";
char[] ch = s.toCharArray();
Map<Character, Integer> map = new HashMap<Character, Integer>();
for (char c : ch) {
if(!map.containsKey(c)) {
map.put(c,1);
}else {
map.put(c, map.get(c)+1);
}
}System.out.println(map);
}
}