1.熊怪吃核桃
森林里有一只熊怪,很爱吃核桃。不过它有个习惯,每次都把找到的核桃分成相等的两份,吃掉一份,留一份。如果不能等分,熊怪就会扔掉一个核桃再分。第二天再继续这个过程,直到最后剩一个核桃了,直接丢掉。
有一天,熊怪发现了1543个核桃,请问,它在吃这些核桃的过程中,一共要丢掉多少个核桃。
请填写该数字(一个整数),不要填写任何多余的内容或说明文字。
public static void main(String[] args){
int n=1543;
int x=0;
while(n!=1){
if(n%2!=0){
n=(n-1)/2;
x++;
}
else
n=n/2;
}
System.out.println(x+1);
}
2.星系炸弹
在X星系的广袤空间中漂浮着许多X星人造“炸弹”,用来作为宇宙中的路标。
每个炸弹都可以设定多少天之后爆炸。
比如:阿尔法炸弹2015年1月1日放置,定时为15天,则它在2015年1月16日爆炸。
有一个贝塔炸弹,2014年11月9日放置,定时为1000天,请你计算它爆炸的准确日期。
请填写该日期,格式为 yyyy-mm-dd 即4位年份2位月份2位日期。比如:2015-02-19
public static void main(String[] args) {
int monthDays[]={31,28,31,30,31,30,31,31,30,31,30,31};
int days=1000;
int year=2014, month=11, day=9;
int i;
for(i=0;i<days;i++){
day++;
if(day>monthDays[month-1]){
day=1;
month++;
if(month>12){
month=1;
year++;
if((year%400==0)||(year%4==0&&year%100!=0))
monthDays[1]=29;
else
monthDays[1]=28;
}
}
}
System.out.println(year+"-"+month+"-"+day);
}
用Calendar类迅速解决。Calender类的月数从0开始,所以要加一。
public static void main(String[] args) {
Calendar c=Calendar.getInstance();
c.set(2014, 10, 9);
c.add(Calendar.DAY_OF_YEAR, 1000);
System.out.println(c.get(Calendar.YEAR)+" "+(int)(c.get(Calendar.MONTH)+1)+" "+c.get(Calendar.DATE));
}
另外,还可以通过excel表格进行计算,日期加双引号,前面加等号。右键设置单元格格式设置为日期型
也可以手算
已知当前日期为2014-11-09,定时为1000天,2015不是闰年,1000-365=635,日期为2015-11-09;2016年是闰年(能被4整除但不能被100整除),635-366=269,日期为2016-11-09;266不满一年,所以接下来按月做减法,11月30天,12月31天,1月31天,2月28天,3月31天,4月30天,5月31天,6月30天,7月31天,269-30-31-31-28-31-30-31-30=27,日期为2017-07-09;27-22=5,日期为2017-07-31;最后日期为2017-08-05。
也可以用win10的计算器算 (下图加了999天最多)
3.九数分三组
1~9的数字可以组成3个3位数,设为:A,B,C, 现在要求满足如下关系:
B = 2 * A
C = 3 * A
请你写出A的所有可能答案,数字间用空格分开,数字按升序排列。
public static void main(String[] args){
for(int A=111;A<=333;A++){
HashSet<Character> set=new HashSet<>();
String Astring=A+"";
String Bstring=A*2+"";
String Cstring=A*3+"";
for(int i=0;i<3;i++){
set.add(Astring.charAt(i));
set.add(Bstring.charAt(i));
set.add(Cstring.charAt(i));
}
if(set.size()==9)
System.out.println(A);
}
}
4.循环节长度
两个整数做除法,有时会产生循环小数,其循环部分称为:循环节。
比如,11/13=6=>0.846153846153..... 其循环节为[846153] 共有6位。
下面的方法,可以求出循环节的长度。
请仔细阅读代码,并填写划线部分缺少的代码。
public static int f(int n, int m)
{
n = n % m;
Vector v = new Vector();
for(;;)
{
v.add(n);
n *= 10;
n = n % m;
if(n==0) return 0;
if(v.indexOf(n)>=0) return v.size();
___return v.size();_______________________ ; //填空
}
}
5.打印菱形
给出菱形的边长,在控制台上打印出一个菱形来。
为了便于比对空格,我们把空格用句点代替。
当边长为8时,菱形为:
.......*
......*.*
.....*...*
....*.....*
...*.......*
..*.........*
.*...........*
*.............*
.*...........*
..*.........*
...*.......*
....*.....*
.....*...*
......*.*
.......*
下面的程序实现了这个功能,但想法有点奇怪。
请仔细分析代码,并填写划线部分缺失的代码。
public class A
{
public static void f(int n)
{
String s = "*";
for(int i=0; i<2*n-3; i++) s += ".";
s += "*";
String s1 = s + "\n";
String s2 = "";
for(int i=0; i<n-1; i++){
//System.out.println("=>"+s);
s = "." + ____s.substring(0, 2 * (n-2)-i)_______ + "*"; //填空
s1 = s + "\n" + s1;
s2 += s + "\n";
}
System.out.println(s1+s2);
}
public static void main(String[] args)
{
f(8);
}
}
s1从下往上打印上班部分
s2从上往下打印下半部分 主要还是对代码的理解 自己画图更容易理解
6.加法变乘法
我们都知道:1+2+3+ ... + 49 = 1225
现在要求你把其中两个不相邻的加号变成乘号,使得结果为2015
比如:
1+2+3+...+1011+12+...+2728+29+...+49 = 2015
就是符合要求的答案。
请你寻找另外一个可能的答案,并把位置靠前的那个乘号左边的数字提交(对于示例,就是提交10)。 16
public static void main(String[] args)
{
int[] a=new int[49];
for(int i=0;i<49;i++)
a[i]=i+1;
for(int i=0;i<46;i++)
for(int j=i+2;j<48;j++){
int x=a[i]*a[i+1];
int y=a[j]*a[j+1];
int sum=x+y+1225-a[i]-a[i+1]-a[j]-a[j+1];
if(sum==2015)
System.out.println(a[i]+" "+a[j]);
}
}
7.牌型种数
小明被劫持到X赌城,被迫与其他3人玩牌。
一副扑克牌(去掉大小王牌,共52张),均匀发给4个人,每个人13张。
这时,小明脑子里突然冒出一个问题:
如果不考虑花色,只考虑点数,也不考虑自己得到的牌的先后顺序,自己手里能拿到的初始牌型组合一共有多少种呢?
public class test07 {
public static int ans=0;
public static void dfs(int cur,int sum){
if(cur>13)return;
if(sum>13)return;
if(sum==13&&cur==13){
ans++;
}
for(int i=0;i<=4;i++){
dfs(cur+1,sum+i);
}
}
public static void main(String[] args){
dfs(0,0);
System.out.println(ans);
}
}
8.移动距离
X星球居民小区的楼房全是一样的,并且按矩阵样式排列。其楼房的编号为1,2,3...
当排满一行时,从下一行相邻的楼往反方向排号。
比如:当小区排号宽度为6时,开始情形如下:
1 2 3 4 5 6
12 11 10 9 8 7
13 14 15 .....
我们的问题是:已知了两个楼号m和n,需要求出它们之间的最短移动距离(不能斜线方向移动)
输入为3个整数w m n,空格分开,都在1到10000范围内
w为排号宽度,m,n为待计算的楼号。
要求输出一个整数,表示m n 两楼间最短移动距离。
例如:
用户输入:
6 8 2
则,程序应该输出:
4
再例如:
用户输入:
4 7 20
则,程序应该输出:
5
资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 1000ms
public class test0802 {
public static int distance(int W, int a, int b){
int i1 = 0; // a的行数
int i2 = 0; // b的行数
int j1 = 0; // a的列数
int j2 = 0; // b的列数
//全部都是从0,0开始计算的
if(a%W != 0)//判断是不是W整倍数,如果是计算时结果要减一
//w=6举例,因为像6,12这些数字和同一行的除以w结果不同,所以区别处理判断行数
i1 = a/W;
else
i1 = a/W-1;
if(i1%2!=0)//根据求出的i1行数进行计算。判断是奇数行还是偶数行(从0开始算,第一行偶数行)
//如果是是奇数行,即从右往左计数。如下
j1 = (i1+1)*W-a;
else //如果是偶数行,从左往右正常计数。从0开始再减一
j1 = a-i1*W-1;
//对B进行完全一样的处理
if(b%W != 0)
i2 = b/W;
else
i2 = b/W-1;
if(i2%2!=0)
j2 = (i2+1)*W-b;
else
j2 = b-i2*W-1;
System.out.println("("+i1+","+j1+")+("+i2+","+j2+")");
int distance = Math.abs(i1-i2) + Math.abs(j1-j2);
return distance;
}
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
int N = scanner.nextInt();
int a = scanner.nextInt();
int b = scanner.nextInt();
System.out.println(distance(N, a, b));
scanner.close();
}
}