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”,导致出现“答案错误”