练习题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 }