个人觉得代码有很大的改进空间,希望多讨论解决一下。
1.输入一个由字母和空格组成的句子,可能会出现一个或多个空格,不区分大小写
(1)输出该句子中字母的个数;
(2)输出该句子中单词的个数;
(3)输出该句子中出现次数最多的字母和次数
例如:输入:This is my love
输出:
字母个数:12
单词个数:4
出现次数最多的字母: i s
出现次数:2
2.输入一个十二进制数(a和b代表10和11),按要求输出
(1)第一行输出每一位的十进制下的数
(2)第二行输出这个十二进制数的十进制数
(3)第三行输出转换后的十进制数在内存中的每一位二进制数(共四个字节,每个字节以空格隔开)
例如:输入:a2
输出:10 2
122
00000000 00000000 00000000 00001100
3.输入一个带除法运算的字符串,输出运算结果
(1)若能除尽,则直接输出
(2)若为循环小数,则输出前几位并用括号括起来
(3)若无法除尽,则保留小数用括号括起来
如输入:8/5 输出1.6
输入:1/3 输出.(3)
输入:11/13 输出.(846153)
/**
* @className:Exerciese13
* @Description:
* @author:TAO
* @Date:2018/6/6 9:35
*/
import java.util.Scanner;
/**算法思想:(1)扫描整个字符串,先将字母个数初始化为0,当扫描到一个字母则sum++,直到完成遍历即统计出字母的个数,
* 空格不计入字母个数.
* (2)扫描整个字符串,先将单词个数初始化为0,当扫描到一个单词则sum++,关键是如何判断是否满足为一个单词,
* * 如果用字符指针pIndex指向当前处理字符,则满足*pIndex!=' '&&*(pIndex+1)==' '时即为一个单词。
* (3)由于不区分大小写,所以可以先把所有的字母转换成小写,然后用26个长度数组记录每个字母的长度,在遍历过程,
* 同时记录出现的次数,最后遍历一次数组,看看哪个数组里面记录的数字最大(有点蠢的办法)。
* */
class Solution1{
public int findLetter(String s){
int sum=0;
int i=0;//记录当前所扫描到的字母
while(i<s.length()){
if((s.charAt(i)>='a'&&s.charAt(i)<='z')||(s.charAt(i)>='A'&&s.charAt(i)<='Z'))
sum++;
i++;
}
return sum;
}
public int findWord(String s){
int sum=0;//记录单词的个数
int i=0;//记录当前正在遍历的位置
while(i<s.length()-1){//避免角标越界
if(s.charAt(i)!=' '&&s.charAt(i+1)==' ')
sum++;
i++;
}
return sum+1;//最后一个单词加上
}
public void maxLetter(String s){
//1.先将所有的字母转换成小写
char []a=s.toCharArray();
int i=0;
while(i<a.length){
if(a[i]>='A'&&a[i]<='Z')
a[i]= (char) (a[i]+32);//转变为小写,如果直接在字符串里转换会出现左侧不是变量的情况,所以先变成数组
i++;
}
//2.统计哪个字母出现的次数最多
int []temp=new int[26];//不排除所有字母相同出现的情况。
for(int j=0;j<temp.length;j++)
temp[i]=0;//全部初始化为0;假设temp[0]存放的是a出现的次数,temp[1]存放是b出现的次数,依次类推
int k=0;
while(k<a.length){
if(a[k]==' ')
k++;
else{
temp[a[k]-'a']++;
k++;
}
}
int max=0;
for(int m=0;m<temp.length;m++)
if(temp[m]>max)
max=temp[m];
System.out.printf("出现字母最多的为:");
for(int l=0;l<temp.length;l++)
if(temp[l]==max)
System.out.println((char)(l+'a'));
System.out.printf("次数为:"+max);
}
}
/**算法思想:本题主要是学习进制数的转换,每次的输入都是以一个字符串的形式,只需要识别即可
* */
class Solution2{
public void printDec(String s){
int i=0;
while (i<s.length()){
if(s.charAt(i)=='a')
System.out.printf("%2d",10);
else if (s.charAt(i)=='b')
System.out.printf("%2d",11);
else
System.out.printf("%2s",s.charAt(i));
i++;
}
}
public int exchangeToDec(String s){
//1.首先记录字符的个数,为转换作准备
int number=s.length();
//2.创建一个长度为number的整形数组,每一位存放相应的十进制数据
int []temp=new int[number];
int j=0;
while(j<number){
if(s.charAt(j)=='a')
temp[j]=(int)Math.pow(12,number-j-1)*10;
else if(s.charAt(j)=='b')
temp[j]=(int)Math.pow(12,number-j-1)*11;
else
temp[j]=((int)Math.pow(12,number-j-1))*(s.charAt(j)-'0');
j++;
}
//3.将temp中的数据全部加上即为所求
int sum=0;
for(int k=0;k<temp.length;k++)
sum+=temp[k];
return sum;
}
public void binaryToDecimal(int n){
for(int i = 32;i > 0; i--){
if(i%8==0)
System.out.printf(" ");
System.out.print(n >>> i & 1);
}
}
}
class Solution3{}
public class Exerciese13 {
public static void main(String[] args) {
// System.out.println("请输入一个句子:");
// Scanner scanner=new Scanner(System.in);
// String string=scanner.nextLine();
// Solution1 solution1=new Solution1();
// int letters=solution1.findLetter(string);
// System.out.println("字母的个数为:"+letters);
// int words=solution1.findWord(string);
// System.out.println("单词的个数为:"+words);
// solution1.maxLetter(string);
System.out.println("请输入十二进制数:");
Scanner scanner=new Scanner(System.in);
String string=scanner.nextLine();
Solution2 solution2=new Solution2();
System.out.println("每一位数字的十进制数为:");
solution2.printDec(string);
System.out.println();
System.out.println("转换为的十进制数为:");
int m=solution2.exchangeToDec(string);
System.out.println(m);
System.out.println("转换的二进制数为:");
solution2.binaryToDecimal(m);
}
}
第三题:
#include <iostream>
#include <memory.h>
#include <stdio.h>
using namespace std;
/**算法思想(借鉴灰神公众号里面的方法):对于循环小数的判断,这里使用余数检测法,即模拟除法的过程,如要计算1/7的
* 循环节,先求出整数部分,也就是1/7=0.然后再求小数部分,求出第一组商con和它对应的余数r,即con=(1x10)/7=1,
* r=(1x10)%7=3,然后进入循环,将第一注数据保存起来,接下来算第二组,con=(3x10)/7=4,r=(3x10)%7=2
*每次求出一组商和余数的数据,我们需要判断一下:所求出的商之前没出现过,当商和余数同时出现在同一个位置,那么
* 就说明循环节出现了,然后我们记录循环节的位置pos,在之后把从0到pos之前的数据单独输出,这一部分是不循环的,
*然后从pos到最后的部分单独输出,这一部分是循环的。
* */
int pos;
bool find(int *Rem,int *Dec,int r,int con,int q){
for(int i=0;i<q;i++)
if(Rem[i]==r&&Dec[i]==con){
pos=i;//记录循环点的起始位置
return false;
}
return true;
}
void cal(int a,int b){
int i;
int p=0;//Dec的指针
int q=0;//Rem的指针
int e=0;//结束的位置
int Int,Dec[100],Rem[100],r,con;//Int整数部分,Dec小数部分,Rem余数部分,r零时余数,con零时商
memset(Rem,0, sizeof(Rem));//memset:作用是在一段内存块中填充某个给定的值,主要是清零
memset(Dec,0, sizeof(Dec));
Int=a/b;
if(a>=b)
a=a%b;
con=a*10/b;
r=a*10%b;//算出第一组商和余数
while(find(Rem,Dec,r,con,q)){
Dec[p++]=con;
Rem[q++]=r;
r=r*10;
con=r/b;
r=r%b;
}
cout<<Int<<".";//输出整数部分
for (i = 0; i < pos; i++)//输出不循环部分
cout << Dec[i];
for (i = 99; i >= 0; i--)//找到结束位置
if (Dec[i] != 0) {
e = i;
break;
}
for (i = pos; i < e; i++) {
if (i == pos)
cout << "(";
cout << Dec[i];
if (i == e - 1)
cout << ")";
}
cout << endl;
}
int main() {
printf("请输入两个除数和被除数:");
int a,b;
scanf("%d%d",&a,&b);
cal(a,b);
return 0;
}