1.有奖猜谜
小明很喜欢猜谜语。最近,他被邀请参加了X星球的猜谜活动。每位选手开始的时候都被发给777个电子币。规则是:猜对了,手里的电子币数目翻倍,猜错了,扣除555个电子币, 扣完为止。小明一共猜了15条谜语。战果为:vxvxvxvxvxvxvvx其中v表示猜对了,x表示猜错了。
请你计算一下,小明最后手里的电子币数目是多少。请填写表示最后电子币数目的数字。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
public class 有奖猜谜 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int x = 777;
String s = "vxvxvxvxvxvxvvx";
for (int i = 0; i < 15; i++) {
if (s.charAt(i) == 'v') {
x = 2 * x;
} else
x = x - 555;
}
System.out.println(x);
}
}
2.煤球数目
有一堆煤球,堆成三角棱锥形。具体:
第一层放1个,
第二层3个(排列成三角形),
第三层6个(排列成三角形),
第四层10个(排列成三角形),
…
如果一共有100层,共有多少个煤球?
请填表示煤球总数目的数字。
public class 煤球数目 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int i = 1;
int j = 2;
int count = 1;
int sum = 1;
for (int k = 2; k <= 100; k++) {
count += j;
j++;
sum = sum + count;
}
System.out.println(sum);
}
}
3.平方怪圈
如果把一个正整数的每一位都平方后再求和,得到一个新的正整数。
对新产生的正整数再做同样的处理。
如此一来,你会发现,不管开始取的是什么数字,
最终如果不是落入1,就是落入同一个循环圈。
请写出这个循环圈中最大的那个数字。
请填写该最大数字。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
【分析】数位基本操作(分离&逐位累加求和)+找规律
public class 平方怪圈 {
public static void main(String[] args) {
int start = 3;
int ant = 0;
while (ant < 1000) {
System.out.println(start);
start = extract(start);
ant++;
}
}
static int extract(int start) {
String str = start + "";// 整数转字符串,i+""
int ans = 0;
for (int i = 0; i < str.length(); ++i) {
ans += (str.charAt(i) - '0') * (str.charAt(i) - '0');
}
return ans;
}
}
4.骰子游戏
我们来玩一个游戏。
同时掷出3个普通骰子(6个面上的数字分别是1~6)。
如果其中一个骰子上的数字等于另外两个的和,你就赢了。
下面的程序计算出你能获胜的精确概率(以既约分数表示)
public class 骰子游戏 {
public static int gcd(int a, int b) {
if (b == 0)
return a;
else
return gcd(b, a % b);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int n = 0;
for (int i = 0; i < 6; i++) {
for (int j = 0; j < 6; j++) {
for (int k = 0; k < 6; k++) {
if (i + j + 1 == k || i + k + 1 == j || j + k + 1 == i) {
n++;
}
}
}
}
int m = gcd(n, 6 * 6 * 6);
System.out.println(n / m + "/" + 6 * 6 * 6 / m);
}
}
6.凑算式
B DEF
A + — + ------- = 10
C GHI
(如果显示有问题,可以参见【图1.jpg】)
这个算式中AI代表19的数字,不同的字母代表不同的数字。
比如:
6+8/3+952/714 就是一种解法,
5+3/1+972/486 是另一种解法。
这个算式一共有多少种解法?
注意:你提交应该是个整数,不要填写任何多余的内容或说明性文字。
【分析】循环+枚举
A~I代表1~9 9个数字,因此可使用全排列代替传统的9重循环枚举,并且不需手动实现去重,更加高效。
此外,B/C和DEF/GHI不一定是整数,因此在计算A+ B/C + DEF/GHI之和时,结果与10需进行实数(浮点数)的大小比较,以避免精度问题影响结果。
public class 凑算式1 {
static int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
static int ans;
static boolean check() {
int x = a[3] * 100 + a[4] * 10 + a[5];
int y = a[6] * 100 + a[7] * 10 + a[8];
if ((a[1] * y + a[2] * x) % (y * a[2]) == 0 && a[0] + (a[1] * y + a[2] * x) / (y * a[2]) == 10) {
return true;
}
return false;
}
static void f(int k) {
if (k == 9) {
if (check()) {
ans++;
}
}
for (int i = k; i < 9; ++i) {
{
int t = a[i];
a[i] = a[k];
a[k] = t;
}
f(k + 1);
{
int t = a[i];
a[i] = a[k];
a[k] = t;
}
}
}
public static void main(String[] args) {
f(0);
System.out.println(ans);
}
}
7.小明最近喜欢搭数字积木,
一共有10块积木,每个积木上有一个数字,0~9。
搭积木规则:
每个积木放到其它两个积木的上面,并且一定比下面的两个积木数字小。
最后搭成4层的金字塔形,必须用完所有的积木。
下面是两种合格的搭法:
0
1 2
3 4 5
6 7 8 9
0
3 1
7 5 2
9 8 6 4
请你计算这样的搭法一共有多少种?
请填表示总数目的数字。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
public class 搭积木 {
static int a[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
static int ans = 0;
private static void f(int k) {
if (k == 10) {
ans++;
}
for (int i = k; i < 10; i++) {
swap(k, i);
if (k == 1 && a[1] < a[0] || k == 2 && a[2] < a[0] || k == 3 && a[3] < a[1]
|| k == 4 && (a[4] < a[1] || a[4] < a[2]) || k == 5 && a[5] < a[2] || k == 6 && a[6] < a[3]
|| k == 7 && (a[7] < a[3] || a[7] < a[4]) || k == 8 && (a[8] < a[4] || a[8] < a[5])
|| k == 9 && a[9] < a[5]) {
swap(k, i);
continue;
}
f(k + 1);
swap(k, i);
}
}
private static void swap(int k, int i) {
int t = a[i];
a[i] = a[k];
a[k] = t;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
f(0);
System.out.println(ans);
}
}
冰雹数
任意给定一个正整数N,
如果是偶数,执行: N / 2
如果是奇数,执行: N * 3 + 1
生成的新的数字再执行同样的动作,循环往复。
通过观察发现,这个数字会一会儿上升到很高,
一会儿又降落下来。
就这样起起落落的,但最终必会落到“1”
这有点像小冰雹粒子在冰雹云中翻滚增长的样子。
比如N=9
9,28,14,7,22,11,34,17,52,26,13,40,20,10,5,16,8,4,2,1
可以看到,N=9的时候,这个“小冰雹”最高冲到了52这个高度。
输入格式:
一个正整数N(N<1000000)
输出格式:
一个正整数,表示不大于N的数字,经过冰雹数变换过程中,最高冲到了多少。
例如,输入:
10
程序应该输出:
52
再例如,输入:
100
程序应该输出:
9232
import java.util.Scanner;
public class 冰雹数 {
public static void main(String args[]) {
int n = new Scanner(System.in).nextInt();
int t = 1;
for (int i = 1; i < n; i++) {
int max = fun(i, i);
if (max > t)
t = max;
}
System.out.print(t);
}
public static int fun(int n, int max) {
if (n == 1) {
return max;
} else {
if (n % 2 == 0) {
// 偶数
n = n / 2;
if (n > max)
max = n;
return fun(n, max);
} else {
// 奇数
n = n * 3 + 1;
if (n > max)
max = n;
return fun(n, max);
}
}
}
}
9.四平方和
四平方和定理,又称为拉格朗日定理:
每个正整数都可以表示为至多4个正整数的平方和。
如果把0包括进去,就正好可以表示为4个数的平方和。
比如:
5 = 0^2 + 0^2 + 1^2 + 2^2
7 = 1^2 + 1^2 + 1^2 + 2^2
(^符号表示乘方的意思)
对于一个给定的正整数,可能存在多种平方和的表示法。
要求你对4个数排序:
0 <= a <= b <= c <= d
并对所有的可能表示法按 a,b,c,d 为联合主键升序排列,最后输出第一个表示法
程序输入为一个正整数N (N<5000000)
要求输出4个非负整数,按从小到大排序,中间用空格分开
例如,输入:
5
则程序应该输出:
0 0 1 2
再例如,输入:
12
则程序应该输出:
0 2 2 2
再例如,输入:
773535
则程序应该输出:
1 1 267 838
import static java.lang.Math.*;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class 四平方和 {
static int n;
static Map<Integer, Integer> cache = new HashMap<Integer, Integer>();
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
for (int c = 0; c * c <= n / 2; ++c) {
for (int d = c; c * c + d * d <= n; d++) {
if (cache.get(c * c + d * d) == null)
cache.put(c * c + d * d, c);
}
}
for (int a = 0; a * a <= n / 4; ++a) {
for (int b = a; a * a + b * b <= n / 2; ++b) {
if (cache.get(n - a * a - b * b) != null) {
int c = cache.get(n - a * a - b * b);
int d = (int) sqrt(n - a * a - b * b - c * c);
System.out.printf("%d %d %d %d\n", a, b, c, d);
return;
}
}
}
}
}