华科2018 机考题

个人觉得代码有很大的改进空间,希望多讨论解决一下。

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;
}

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值