HNUCM-OJ算法课后习题

Oj第二次练习

问题a:x星人的地盘

一天,X星人和Y星人在一张矩形地图上玩抢地盘的游戏。 X星人每抢到一块地,在地图对应的位置标记一个“X”;Y星人每抢到一块地,在地图对应的位置标记一个“Y”;如果某一块地无法确定其归属则标记一个“N”。 最终统计谁拥有的地盘最大,即统计“X”和“Y”的个数。如果“X”的个数多,则说明X星人的地盘更大,输出“X win”;反之,如果Y星人的地盘更大,则输出“Y win”;如果X星人和Y星人拥有的地盘一样大,则输出“The same”。

import java.util.Scanner;
​
public class Main {
​
    public static void main(String[] args) {
        // TODO Auto-generated method stub
​
        Scanner sc = new Scanner(System.in);
        int m = sc.nextInt();
        int n = sc.nextInt();
        int p=0;
        int q=0;
        int i;
            for(i=0;i<=n;i++){
                String str= new String();
                str=sc.nextLine();
                char a[]= new char[m];
                a=str.toCharArray();
                for(char c:a){
                    if(c=='X')
                        p++;
                    if(c=='Y')
                        q++;
                    else if(c=='N')
                        continue;
                }
            }
            
        if(p>q){
            System.out.print("X win");
        }
        else if(q>p){
            System.out.print("Y win");
        }
        else if(q==p){
            System.out.print("The same");
        }
    }
​
}

出现运行错误18%,可能是数组越界,或者是堆栈溢出,又或者是调用非法空间,但是在eclipse运行答案是正确的,可以实现换行依次输入!! 至少这个先实现了,后续再进行改进吧!

将m,n互换位置,提交成功。i<m,char[n] 改为 i<n,char[m],没有为什么......

问题b:x星宿舍

X星大学的宿舍很有意思,男生都是6人间,女生都是5人间。 现在已知N个学生的性别,性别用'0'或者'1'表示,其中'0'表示男生,'1'表示女生。 请你编写一个程序计算最少需要多少间男生宿舍?多少间女生宿舍? (注:不要求每一间宿舍都住满)

import java.util.Scanner;
public class Main {
​
    public static void main(String[] args) {
        // TODO Auto-generated method stub
​
        int w=0,m=0,i,n1=0,n2=0;
        Scanner sc = new Scanner(System.in);
            String s = sc.nextLine();
            for(i=0;i<s.length();i++)
            {
                char[] a=s.toCharArray();
                if(a[i]=='1'){
                    w++;
                }
                else if(a[i]=='0')
                {
                    m++;
                }
            }
            n1=w/5;
            n2=m/6;
            if(w%5!=0)n1++;
            if(m%6!=0)n2++;
        System.out.print(n2+" "+n1);
    }
​
}

计算错误,在最后改为先除5除6,再判断是否除得尽,判断是否+1,可使运算简便,且提交成功。

问题c:一二三

你弟弟刚刚学会写英语的一(one)、二(two)和三(three)。他在纸上写了好些一二三,可惜有些字母写错 了。已知每个单词最多有一个字母写错了(单词长度肯定不会错),你能认出他写的啥吗?

import java.util.Scanner;
public class Main {
​
    public static void main(String[] args) {
        // TODO Auto-generated method stub
​
        int w=0,m=0,i,n1=0,n2=0;
        Scanner sc = new Scanner(System.in);
            String s = sc.nextLine();
            for(i=0;i<s.length();i++)
            {
                char[] a=s.toCharArray();
                if(a[i]=='1'){
                    w++;
                }
                else if(a[i]=='0')
                {
                    m++;
                }
            }
            n1=w/5;
            n2=m/6;
            if(w%5!=0)n1++;
            if(m%6!=0)n2++;
        System.out.print(n2+" "+n1);
    }
​
}

整体思想没有出错,编译报错,只需修改while(sc.hasNextLine())为while(sc.hasNext()),str = sc.nextLine();改为str = sc.next();即可

不改将会导致指针出界报错

问题d:一家人

有三户人家共拥有一作花园,每户人家的太太均需帮忙整理花园。A太太工作了 5天,B太太则工作了 4天,才将花园整理完毕。C 太太因为正身怀六甲无法加入她们的行列,便出了 90 元。请问这笔钱如何分给 A、B二位太太较为恰当?A应得多少元? 90/(5+4)*5=50元?如果这么想你就上当了!正确答案是 60元。如果没想通的话再想想吧。 下面回答一个一般性的问题:假定 A 太太工作了 x 天,B 太太工作了 y 天,C 太太出了 90 元,则 A太太应得多少元?输入保证二位太太均应得到非负整数元钱。

import java.util.Scanner;
​
public class Main{
​
    public static void main(String[] args) {
        // TODO Auto-generated method stub
​
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        int [][]a=new int[n][3];
        int i,j;
        for(i=0;i<n;i++){
            for(j=0;j<3;j++){
                a[i][j]=sc.nextInt();  //将输入的x,y,z依次加入到数组
            }
        }
        int m;
        for(i=0;i<n;i++){
            double p=0,q;
            p=(a[i][0]+a[i][1])/3.0;
            m=(int)((a[i][0]-p)*a[i][2]/p);
            System.out.print(m+"\n");
        }
    }
}

这题问题在于,不会算这个数学题,不会怎么计算解决这个数学问题,没有思路。另,Java中用两个for循环,似乎可以实现按行按数组顺序输入,对第一题有启示作用

问题e:汽水瓶

有这样一道智力题:“某商店规定:三个空汽水瓶可以换一瓶汽水。小张手上有十个空汽水瓶,她最多可以换多少瓶汽水喝?”答案是5瓶,方法如下:先用9个空瓶子换3瓶汽水,喝掉3瓶满的,喝完以后4个空瓶子,用3个再换一瓶,喝掉这瓶满的,这时候剩2个空瓶子。然后你让老板先借给你一瓶汽水,喝掉这瓶满的,喝完以后用3个空瓶子换一瓶满的还给老板。如果小张手上有n个空汽水瓶,最多可以换多少瓶汽水喝?

import java.util.Scanner;
​
public class Main{
​
    public static void main(String[] args) {
        // TODO Auto-generated method stub
​
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        int [][]a=new int[n][3];
        int i,j;
        for(i=0;i<n;i++){
            for(j=0;j<3;j++){
                a[i][j]=sc.nextInt();  //将输入的x,y,z依次加入到数组
            }
        }
        int m;
        for(i=0;i<n;i++){
            double p=0,q;
            p=(a[i][0]+a[i][1])/3.0;
            m=(int)((a[i][0]-p)*a[i][2]/p);
            System.out.print(m+"\n");
        }
    }
}

第一次一次就提交成功(虽然思路是参照别人的。)

这题是思考题,所以解题思路很重要,第一次思考时,思路存在挺大的问题,但是后来经过演算,也慢慢靠近正确思路。其实就是通过一个循环,不断迭代,通过a=a/3+a%3,不断更新a的值,再将每次a/3的值加到总瓶数n中

问题 f: 数字整除

定理:把一个至少两位的正整数的个位数字去掉,再从余下的数中减去个位数的5倍。当且仅当差是17的倍数时,原数也是17的倍数 。

例如,34是17的倍数,因为3-20=-17是17的倍数;201不是17的倍数,因为20-5=15不是17的倍数。输入一个正整数n,你的任务是判断它是否是17的倍数。

import java.util.Scanner;
​
public class Main {
​
    public static void main(String[] args) {
        // TODO Auto-generated method stub
​
        Scanner sc = new Scanner(System.in);
        
        while(sc.hasNext()){
            int i,n=0;
            String str =sc.nextLine();
            char a[] = str.toCharArray();
            if(str.length()==1){ //输入0或个位数,则退出
                break;
            }
            else 
            {
                for(i=0;i<str.length();i++){
                    n=n*10+(a[i]-'0');
                    n=n%17;               //按位依次模17取余
                }
                if(n==0)
                    System.out.print("1\n");
                else if(n!=0)
                    System.out.print("0\n");
            }
            
    }
    }
}

按照int整数存储,可能会有溢出,因为这题指定的数字范围是0~2^10,数字过大,用long也不行,所以必须用字符串保存,再一个一个地放到字符数组中

但是后面的按位依次模17取余并不是很理解,是在网上找的答案

尝试用n来保存除个位数以外的高位,但也是一样的错误,就是long n也存储不了那么大的数

后续还有答案错误,因为出题者设定输入0或者小于十的一位数都直接退出程序,之前令一位数输出结果“0”,导致出现“答案错误”

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值