練習題1:(完數問題)java
求100之內的全部完數。(完數:它全部因子之和等於其自己)git
方法一:數組
1 /* 2 解體思路:1.先找出每一個數的全部因子 3 2.比較因子之和是否與其數自己相等 4 */ 5 6 public class wanshu { 7 public static void main(String[] args) { 8 int sum=0; 9 for(int i=1;i<=1000;i++) //外層for循環用於遍歷1-1000的全部數 10 { 11 for(int j=1;j<i;j++) //內層for循環用於遍歷查找每一個數的全部因子 12 { //注意:j 從1開始,由於分母不能爲0!!! 13 if(i%j==0) //若是A能夠將B整除,餘數爲0,則B 爲A 的因子 14 { 15 sum+=j; //計算出全部因子之和 16 } 17 } // 比較因子之和是否與其自己相等 18 if(sum==i) //注意:「比較」要放到內層for循環外,以避免出現尚未計算完全部因子,僅當前因子數 19 { //之和就與其數自己相等,而誤被看成完數!!!! 20 System.out.println(i+": "); 21 for(int j=1;j<i;j++) //打印完數的全部因子 22 { 23 if(i%j==0) 24 { 25 System.out.println(j+" "); 26 } 27 } 28 } 29 } 30 } 31 32 }
方法二:函數
1 2 3 1 /* 4 2 解題思路:先找出每一個數的全部因子 5 3 而後將其全部因子存儲在一個數組裏 6 4 若是該數符合完數要求,則打印出數組裏的數 7 5 若是該數不符合要求,則將數組清空,用於存放下一個數的全部因子 8 6 */ 9 7 public class wanshu { 10 8 public static void main(String[] args) { 11 9 int[] arr=new int[1000]; 12 10 int index=0; 13 11 int sum=0; 14 12 for(int i=1;i<1000;i++) 15 13 { 16 14 for(int j=1;j<i;j++) 17 15 { 18 16 if(i%j==0) 19 17 { 20 18 21 19 arr[index]=j; 22 20 sum+=arr[index]; 23 21 index++; 24 22 } 25 23 } 26 24 if(sum==i) 27 25 { 28 26 System.out.print(i+":"); 29 27 for(int j=0;j<index;j++) 30 28 { 31 29 System.out.print(arr[j] + " "); 32 30 } 33 31 System.out.println(); 34 32 } 35 33 36 34 index=0; 37 35 sum=0; 38 36 39 37 } 40 38 } 41 39 42 40 }
練習題二:spa
1. 統計字符串中,字母,數字及其餘字符的數量。3d
/*
* 解題思路:先輸入一串字符串
* 挨個遍歷,判段類型
* 定義三個變量來存儲各個類型的數量
*
*
* */
import java.util.*;
public class zifushu {
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
String text=in.nextLine(); //用來接收字符串
int number=0; //定義三個變量來存儲數字,字母,和其餘字符的數量
int string=0;
int other=0;
for(int i=0;i<text.length();i++) //用來遍歷整個字符串
{
char ch=text.charAt(i); //引用charAt()方法用來輸出指定位置的字符內容
if(Character.isDigit(ch)) //判斷是否爲數字
{
number++;
}else if(Character.isLetter(ch)) //判斷是否爲字母
{
string++;
}else{ //不然就爲其餘類型的字符
other++;
}
}
System.out.println("number"+number);
System.out.println("string"+string);
System.out.println("other"+other);
}
}
練習題三:code
1.用戶輸入一段字符串,格式如:gdsd 2e3d 23434 v/f#$ dffbdblog
請輸出這段字符串中的單詞數量。字符串
2.並將單詞打印出來。string
1 /** 2 * 解題思路:輸入數段個字符串,而後對每段字符串進行遍歷,當遇到的不是字母時,則略過此字符串,進行遍歷下一個 3 * 字符串 ,直到遇到空格前,遍歷的都是字母,則該段字符串爲單詞。 4 * 注意:最後一個由於後面沒有空格,要另行判斷 5 */ 6 import java.util.*; 7 public class zifushu { 8 public static void main(String[] args) { 9 Scanner in=new Scanner(System.in); 10 String text=in.nextLine(); 11 boolean flag=true; 12 int number=0; 13 for(int i=0;i<text.length();i++) { 14 char ch = text.charAt(i); 15 if (flag && Character.isLetter(ch)) { 16 flag = true; 17 } else { 18 if (ch == ' ' && flag) { 19 number++; 20 flag = true; 21 } else if (ch == ' ' && (flag == false)) { 22 flag = true; 23 } else { 24 flag = false; 25 } 26 27 } 28 if(flag) 29 { 30 number++; 31 } 32 33 System.out.println(number); 34 } 35 36 } 37 38 }
1 import java.util.*; 2 public class zifushu{ 3 public static void main(String[] args) { 4 Scanner in = new Scanner(System.in); 5 String text = in.nextLine(); 6 boolean flag = true; 7 int number = 0; 8 int count = 0; 9 for (int i = 0; i < text.length(); i++) { 10 char ch = text.charAt(i); 11 if (flag && Character.isLetter(ch)) { 12 flag = true; 13 count++; 14 15 } else { 16 if (ch == ' ' && flag) 17 { 18 number++; 19 System.out.println(text.substring(i - count, i)); 20 count = 0; 21 22 // System.out.println(); 23 flag = true; 24 } else if (ch == ' ' && (flag == false)) { 25 flag = true; 26 } else { 27 flag = false; 28 // count=0; 29 } 30 31 } 32 33 } 34 if (flag) { 35 number++; 36 System.out.println(text.substring(text.length() - count, text.length())); 37 } 38 39 System.out.println(number); 40 } 41 }
text.substring(i - count, i)可用來打印字符串中某一截的單詞,
i-count表明所要打印的單詞的開始位置,
i表明所要打印單詞的末尾位置
練習題四: (最長路徑問題)
* 12
8 9
11 7 16
13 9 8 7
能夠從每一個結點 往下,往左斜下,往右斜下分別遍歷,以至找到一條從上到下的最長路徑。
1 /** 2 * 解體思路:要使從上往下挑選的路徑數值最大,那就考慮從下往遍歷,只要保證每次挑選的值最大。 3 * 由於最底層沒法繼續往下遍歷,因此首先從倒數第二層開始。 4 * 定義三個變量,存放三條路徑的值,比較後選出最大值。 5 * 因此還要定義一個與arr相同大小的數組brr,來存放各個結點能夠選擇的三天路徑中的最大值 6 * 7 * 8 */ 9 10 public class lujing { 11 public static void main(String[] args) { 12 int[][] arr=new int[4][]; 13 arr[0]=new int[]{12}; 14 arr[1]=new int[]{8,9}; 15 arr[2]=new int[]{11,7,16}; 16 arr[3]=new int[]{13,9,8,7}; 17 int r1=0; 18 int r2=0; 19 int r3=0; 20 int[][]brr=new int[4][]; //開闢一個大小和arr相等的數組brr來存放每次條選出的最大值 21 for(int i=0;i<arr.length;i++) 22 { 23 brr[i]=new int[i+1]; 24 } 25 for(int i=0;i<arr.length;i++) 26 { 27 brr[3][i]=arr[3][i]; //由於最後一行不用計算出底下三條路徑的值,因此直接將最後一層brr賦值給arr 28 } 29 30 for(int i=arr.length-2;i>=0;i--) //從底下倒數第二層開始往上遍歷 31 { 32 for(int j=0;j<arr[i].length;j++) //注意此處是i-- 和j++ 33 { 34 if(j>0) 35 { 36 r1=arr[i][j]+brr[i+1][j-1]; //計算的是此節點和相同位置中brr數組中的值,以保證計算到最後的那個值 37 } //就是所要求的路徑中的最大值 38 r2=arr[i][j]+brr[i+1][j]; 39 r3=arr[i][j]+brr[i+1][j+1]; 40 brr[i][j]=Math.max(r1,Math.max(r2,r3)); //調用Math.max()函數比較大小, 41 } //注意一次只能比較兩個數 42 } 43 System.out.println(brr[0][0]); 44 } 45 }