標籤:java編程原始碼 完數 各類字元統計 數字遞迴相加 map
一、描述
1、輸入一行字元,分別統計出其中英文字母、空格、數字和其它字元的總個數和每個字元出現的頻率。
程式分析:使用String類的matchs()分別統計符合Regex的每類字元的總個數,然後分別使用List和Map集合類統計每個字元出現的頻率。
2、求s=a+aa+aaa+aaaa+aa...a的值,其中a是一個數字。例如2+22+222+2222+22222(此時共有5個數相加),幾個數相加由鍵盤控制。
3、題目:一個數如果恰好等於它的因子之和,這個數就稱為"完數",即除了本身以外的不重複因數和等於其本身。編程找出m以內的所有完數。
例如6=1+2+3.第二個完全數是28,它有約數1、2、4、7、14、28,除去它本身28外,其餘5個數相加,1+2+4+7+14=28。
首先求出所有質因數,然後判斷相加和是否等於原數。
二、原始碼
1、程式1
package tong.yue.hong;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;
/**
* 輸入一行字元,分別統計出其中英文字母、空格、數字和其它字元的總個數和每個字元出現的頻率。
程式分析:使用String類的matchs()分別統計符合Regex的每類字元的總個數,然後分別使用List和Map集合類統計每個字元出現的頻率
* @author tong
*
*/
public class Statistics {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("請輸入一行字串:");
String string = scanner.nextLine();
scanner.close();
count(string);
System.out.println("-------------");
countEveryOneByList(string);
System.out.println("-------------");
countEveryOneByMap(string);
}
/**
* 定義幾種類型字元的Regex,並且使用String類的matchs()方法匹配每類字元的個數
* @param str
*/
private static void count(String str){
//定義四個Regex分別表示各類字元
String E1 = "[\u4e00-\u9fa5]"; //漢字
String E2 = "[a-zA-Z]"; //中英文字母
String E3 = "[0-9]"; //數字
String E4 = "\\s";//空格
//分別定義五個統計變數,分別統計各類字元的總個數
int countChinese = 0;
int countLetter = 0;
int countNumber = 0;
int countSpace = 0;
int countOther = 0;
//將字串轉化為字元數組
char[] array_Char = str.toCharArray();
//因為漢字只能作為字串處理,所以定義字串數組來存放所有字元
String[] array_String = new String[array_Char.length];
//將字元數群組轉換為字串數組
for(int i=0;i<array_Char.length;i++){
array_String[i] = String.valueOf(array_Char[i]);
}
//遍曆字串數組中的元素,統計各類字元總個數
for(String s:array_String){
if(s.matches(E1))
countChinese++;
else if(s.matches(E2))
countLetter++;
else if(s.matches(E3))
countNumber++;
else if(s.matches(E4))
countSpace++;
else
countOther++;
}
System.out.println("輸入的漢字個數:"+countChinese);
System.out.println("輸入的字母個數:"+countLetter);
System.out.println("輸入的數字個數:"+countNumber);
System.out.println("輸入的空格個數:"+countSpace);
System.out.println("輸入的其它字元個數:"+countSpace);
}
/**
* 使用List集合統計單個字元的個數
* @param str
*/
private static void countEveryOneByList(String str){
List<String> list = new ArrayList<String>();
char[] array_Char = str.toCharArray();
for(char c:array_Char){
//將字元作為字串添加到list表中
list.add(String.valueOf(c));
}
//調用Collections集合工具類將list類中的資料進行排序,相同的元素就排在相鄰的位置
Collections.sort(list);//排序
//遍曆排序後的集合,根據相同的值在List中第一次出現的位置和最後一次出現的位置就能計算出該字串的總個數
for(String s:list){
//該字串第一次出現的索引
int begin = list.indexOf(s);
//該字串最後一次出現的索引,因為相同元素相鄰,即可得出個數
int end = list.lastIndexOf(s);
//索引結束統計字元數
if(list.get(end)==s){
System.out.print("字元‘"+s+"‘有"+(end-begin+1)+"個");
}
}
}
/**
* 使用Map集合類統計字串出現的次數,以該字串作為鍵,以出現的次數作為值,迴圈遍曆即可
* @param str
*/
private static void countEveryOneByMap(String str){
//建立HashMap對象來存放字串數組及其出現的次數
Map<String,Integer> hashMap = new HashMap<String,Integer>();
char[] array_Char = str.toCharArray();
for(char c:array_Char){
String key = String.valueOf(c);
//如果已經出現過該字串就將該字串的value加1
if (hashMap.containsKey(key)) {
Integer value = hashMap.get(key)+1;
hashMap.put(key, value);
}else {
//如果該字串是第一次出現,就將該字串及其出現的次數添加到hashMap中
hashMap.put(key, 1);
}
}
//遍曆hashMap集合,輸出結果
Set<Map.Entry<String, Integer>> sets = hashMap.entrySet();
for (Map.Entry<String, Integer> mapEntry :sets) {
System.out.println("字元‘"+mapEntry.getKey()+"‘有"+mapEntry.getValue()+"個");
}
}
}
運行結果:
2、程式2
package tong.yue.hong;
import java.util.Scanner;
import javax.xml.transform.Templates;
/**
* 題目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一個數字。
* 例如2+22+222+2222+22222,由鍵盤控制相加的次數,輸入多少個資料進行相加
* @author tong
*
*/
public class SumOneNum {
public static void main(String[] args) {
String E3 = "[0-9]";
Scanner scanner = new Scanner(System.in);
System.out.println("請輸入一個0-9的數字:");
String num = scanner.next();
while (!num.matches(E3)) {
System.out.println("您輸入的數字有誤,請重新輸入:");
num = scanner.next();
}
System.out.println("請輸入要相加的資料個數:");
String times = scanner.next();
while (!times.matches(E3)) {
System.out.println("您輸入的數字有誤,請重新輸入:");
times = scanner.next();
}
scanner.close();
//方法1直接是根據字串拼接規律和數字變化規律相加求和
mulAdd(num,times);
//方法2使用StringBuffer進行前面顯示的字串的拼接,用add方法將數字累加
System.out.println(expressed(num,times)+add(num,times));
}
/**
* 確定來源資料的變化規律,根據規律number =number*10+number%10進行變化,並更加相加次數進行相加
* @param num
* @param times
*/
private static void mulAdd(String num, String times) {
//String轉換為int
int number = Integer.parseInt(num);
long sum = 0;
int temp = 0;
for (int i = 1; i <= Integer.parseInt(times); i++) {
//資料每次變化的規律
temp =temp*10+number;
sum +=temp;
//若為不是最後一次相加,就輸出加號
if (i<Integer.parseInt(times)) {
System.out.print(temp+"+");
}else {
System.out.print(temp+"=");
}
}
System.out.println(sum);
}
//用StringBuffer輸出前面的數字連續相乘的字串運算式
private static String expressed(String num,String times){
StringBuffer sb = new StringBuffer();
StringBuffer subSB = new StringBuffer();
for(int i=1;i<=Integer.parseInt(times);i++){
subSB = subSB.append(num);
sb = sb.append(subSB);
if(i<Integer.parseInt(times))
sb = sb.append("+");
}
sb.append("=");
return sb.toString();
}
//輸出連續數字累加和
private static long add(String num,String times){
Integer a = Integer.parseInt(num);
long sum = 0;
long subSUM = 0;
for(int i=1;i<=Integer.parseInt(times);i++){
subSUM = subSUM*10+a;
sum = sum+subSUM;
}
return sum;
}
}
運行結果:
3、程式3
package tong.yue.hong;
import java.util.Scanner;
/*
* 題目:一個數如果恰好等於它的因子之和,這個數就稱為"完數",即除了本身以外的不重複因數和等於其本身。編程找出m以內的所有完數。
* 例如6=1+2+3.第二個完全數是28,它有約數1、2、4、7、14、28,除去它本身28外,其餘5個數相加,1+2+4+7+14=28。
* 首先求出所有質因數,然後判斷相加和是否等於原數
*/
public class NumberSpec {
public static void main(String[] args) {
System.out.println("請輸入一個大於0小於等於10000的正整數表示完數的範圍(>0):");
Scanner scanner = new Scanner(System.in);
int scale = scanner.nextInt();
while (scale<0||scale>10000) {
System.out.println("您的輸入有誤,請重新輸入一個大於0小於等於10000的正整數表示完數的範圍(>0):");
scale = scanner.nextInt();
}
compNumber(scale);
}
private static void compNumber(int n){
System.out.println(n+"以內的完數:");
for(int i=1;i<=n;i++){
int sum = 0;
for(int j=1;j<i/2+1;j++){
if((i%j)==0){
sum += j;
}
}
if(sum==i){
System.out.print(i+" ");
}
}
}
}
運行結果:
JAVA基礎編程50題(7-9題)詳解