JAVA基础编程50题(7-9题)详解

 一、描述

1、输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的总个数和每个字符出现的频率。
        程序分析:使用String类的matchs()分别统计符合正则表达式的每类字符的总个数,然后分别使用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()分别统计符合正则表达式的每类字符的总个数,然后分别使用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);
}


/**
* 定义几种类型字符的正则表达式,并且使用String类的matchs()方法匹配每类字符的个数
* @param str
*/
private static void count(String str){
//定义四个正则表达式分别表示各类字符
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+" ");  
   }
}
}



}
 

运行结果:

完数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值