(待续)
1---空瓶换汽水
2---三人年龄
3---考察团组成
4---微生物增殖
5---除去次方数
6---古堡算式
7---奇怪的比赛
8---欧拉与鸡蛋
9---猜生日
10--棋盘上的麦子
11--国庆星期日
12--找素数
13--填写算式
14--取字母组成串
(由于文章太长,所以可以用ctrl+F键来搜索题目)
1.空瓶换汽水
浪费可耻,节约光荣。饮料店节日搞活动:不用付费,用3个某饮料的空瓶就可以换一瓶该饮料。刚好小明前两天买了2瓶该饮料喝完了,瓶子还在。他耍了个小聪明,向老板借了一个空瓶,凑成3个,换了一瓶该饮料,喝完还瓶!!
饮料店老板一统计,已经售出该饮料且未还瓶的有12345瓶,那么如果这些饮料的买主都如小明一样聪明,老板最多还需要送出多少瓶饮料呢?
显然答案是个正整数。
结果:
6172
过程:
最多送饮料的情况就是一个人拥有12345个空瓶,然后每次都拿着两个空瓶就去换酒,因为如果拿着三个瓶去换酒的话,你就会少三个空瓶,而前者你会少两个空瓶。所以前者是最最优的。 12345/22.三人年龄
三个神秘蒙面人来访F博士。
博士询问他们年龄时,他们说:我们中年龄最小的不超过19岁。我们3人年龄总和为70岁。且我们三人年龄的乘积是所有可能情况中最大的。
请帮助F博士计算他们的年龄,从小到大排列,用逗号分开。
答案:
19 25 26
代码如下:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
int max = 0;
for(int i=10;i<70;i++){
for(int j=10;j<70;j++){
for(int k=10;k<70;k++){
if(i+j+k==70){
if(Math.min(i, Math.min(j, k))<=19){
if(i*j*k>max){
max=i*j*k;
System.out.println(i+" "+j+" "+k);
}
}
}
}
}
}
}
}
3.考察团组成
某饭店招待国外考察团。按照标准,对领导是400元/人,随团职员200元/人,对司机50元/人。
考察团共36人,招待费结算为3600元,请问领导、职员、司机各几人。
答案是三个整数,用逗号分隔。
答案:
3,5,28
代码如下:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
for(int i=1;i<=36;i++){
for(int j=1;j<=36;j++){
for(int k=1;k<=36;k++){
if(i*400+j*200+k*50==3600 && i+j+k==36){
System.out.print(i+","+j+","+k);
System.out.println();
}
}
}
}
}
}
4.微生物增殖
假设有两种微生物 X 和 Y
X出生后每隔3分钟分裂一次(数目加倍),Y出生后每隔2分钟分裂一次(数目加倍)。
一个新出生的X,半分钟之后吃掉1个Y,并且,从此开始,每隔1分钟吃1个Y。
现在已知有新出生的 X=10, Y=89,求60分钟后Y的数目。
如果X=10,Y=90 呢?
本题的要求就是写出这两种初始条件下,60分钟后Y的数目。
题目的结果令你震惊吗?这不是简单的数字游戏!真实的生物圈有着同样脆弱的性质!
结果:
0(结果为负数,则吃光了,为0)
94371840
思路:
不用管X是半分钟吃一个Y还是一分钟吃一个Y,都可以算成一分钟吃一个Y,比如一个新出生的X,它在0.5分钟的时候吃了一个Y,在第1.5分钟吃一个,2.5分钟又吃了一个,也就是说,三分钟内,X吃了3个Y。
代码如下:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
int x = 10,y=89;
for(int i=1;i<=120;i++){//把i++换算0.5秒
if(i%2==1){//都可以算成一分钟吃一个Y
y-=x;
}
if(i%4==0){
y*=2;
}
if(i%6==0){
x*=2;
}
}
System.out.println(y);
}
}
5.除去次方数
自然数的平方数是:1 4 9 16 25 …
自然数的立方数是:1 8 27 64 125 …
自然数的4次方数是:1 16 81256 …
…
这些数字都可以称为次方数。
1~10000中,去掉所有的次方数,还剩下多少个数字?
结果:
9875
思路:
因为从平方开始,所以数值最大100,而2^14=16384,所以次方最大到14就行。(节省时间)
代码如下:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
int[] arr = new int[10001];
for(int i=1;i<=100;i++){
for(int j=2;j<=14;j++){
if(Math.pow(i, j)<=10000){
int a1 = (int)Math.pow(i, j);
arr[a1]=1;
}
}
}
int sum = 0;
for(int i=1;i<=10000;i++){
if(arr[i]==1)
sum++;
}
System.out.println(10000-sum);
}
}
6.古堡算式
福尔摩斯到某古堡探险,看到门上写着一个奇怪的算式:
ABCDE * ? = EDCBA
他对华生说:“ABCDE应该代表不同的数字,问号也代表某个数字!”
华生:“我猜也是!”
于是,两人沉默了好久,还是没有算出合适的结果来。
请你利用计算机的优势,找到破解的答案。
把 ABCDE 所代表的数字写出来。
答案写在“解答.txt”中,不要写在这里!
结果:
2 1 9 7 8
代码如下:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
for(int i=0;i<=9;i++){
for(int j=0;j<=9;j++){
for(int k=0;k<=9;k++){
for(int l=0;l<=9;l++){
for(int m=0;m<=9;m++){
for(int x=0;x<=9;x++){
if(i!=j && i!=k && i!=l && i!=m &&
j!=k && j!=l && j!=m &&
k!=l && k!=m &&
l!=m){
int lef = i*10000+j*1000+k*100+l*10+m;
int right = m*10000+l*1000+k*100+j*10+i;
if(lef*x==right)
System.out.println(i+" "+j+" "+k+" "+l+" "+m);
}
}
}
}
}
}
}
}
}
7.奇怪的比赛
某电视台举办了低碳生活大奖赛。题目的计分规则相当奇怪:
每位选手需要回答10个问题(其编号为1到10),越后面越有难度。答对的,当前分数翻倍;答错了则扣掉与题号相同的分数(选手必须回答问题,不回答按错误处理)。
每位选手都有一个起步的分数为10分。
某获胜选手最终得分刚好是100分,如果不让你看比赛过程,你能推断出他(她)哪个题目答对了,哪个题目答错了吗?
如果把答对的记为1,答错的记为0,则10个题目的回答情况可以用仅含有1和0的串来表示。例如:0010110011 就是可能的情况。
你的任务是算出所有可能情况。每个答案占一行。
多个答案顺序不重要。
答案写在“解答.txt”中,不要写在这里!
结果:
0010110011
0111010000
1011010000
代码如下:
import java.awt.Checkbox;
import java.util.Scanner;
public class Main{
public static void main(String[] args){
int init = 10;
for(int a=0;a<=1;a++){
for(int b=0;b<=1;b++){
for(int c=0;c<=1;c++){
for(int d=0;d<=1;d++){
for(int e=0;e<=1;e++){
for(int f=0;f<=1;f++){
for(int g=0;g<=1;g++){
for(int h=0;h<=1;h++){
for(int i=0;i<=1;i++){
for(int j=0;j<=1;j++){
String string=""+a;
string+=b;
string+=c;
string+=d;
string+=e;
string+=f;
string+=g;
string+=h;
string+=i;
string+=j;
check(string);
}
}
}
}
}
}
}
}
}
}
}
public static void check(String string){
int init = 10;
for(int i=0;i
8.欧拉与鸡蛋
大数学家欧拉在集市上遇到了本村的两个农妇,每人跨着个空篮子。她们和欧拉打招呼说两人刚刚卖完了所有的鸡蛋。
欧拉随便问:“卖了多少鸡蛋呢?”
不料一个说:“我们两人自己卖自己的,一共卖了150个鸡蛋,虽然我们卖的鸡蛋有多有少,但刚好得了同样的钱数。你猜猜看!”
欧拉猜不出。
另一个补充道:“如果我按她那样的价格卖,可以得到32元;如果她按我的价格卖,可以得到24.5元”。
欧拉想了想,说出了正确答案。
我们不是数学家,懒得列出公式来分析。但计算机可以“暴力破解”,就是把所有可能情况都试验一遍,撞上为止!
请写出每人鸡蛋的数目(顺序不限),用逗号隔开。
答案写在“解答.txt”中,不要写在这里!结果:
80 70
代码如下:
import java.util.Scanner;
public class Main{
public static void main(String[] args){
int b = 0;//b的个数
double bprice=0;
double aprice=0;
for(int a=1;a<150;a++){//a的个数
b=150-a;
bprice=32.0/a;//b的单价
aprice=24.5/b;//a的单价
if(a*aprice==b*bprice){
System.out.println(a+" "+b);
}
}
}
}
9.猜生日
今年的植树节(2012年3月12日),小明和他的叔叔还有小伙伴们一起去植树。休息的时候,小明的同学问他叔叔多大年纪,他叔叔说:“我说个题目,看你们谁先猜出来!”
“把我出生的年月日连起来拼成一个8位数(月、日不足两位前补0)正好可以被今天的年、月、日整除!”
他想了想,又补充到:“再给个提示,我是6月出生的。”
根据这些信息,请你帮小明算一下,他叔叔的出生年月日。
答案写在“解答.txt”中,不要写在这里!
格式是年月日连成的8位数。
例如,如果是1948年6月12日,就写:19480612
结果:
19230696(日小于等于30,剔除)
19550604
19900692(日小于等于30,剔除)
代码如下:
import java.util.Scanner;
public class Main{
public static void main(String[] args){
for(int i=19120000;i<20000000;i++){
if(i%2012==0 && i%3==0 && i%12==0){
if(i/100%10==6 && i/1000%10==0){
System.out.println(i);
}
}
}
}
}
10.棋盘上的麦子
你一定听说过这个故事。国王对发明国际象棋的大臣很佩服,问他要什么报酬,大臣说:请在第1个棋盘格放1粒麦子,在第2个棋盘格放2粒麦子,在第3个棋盘格放4粒麦子,在第4个棋盘格放8粒麦子,......后一格的数字是前一格的两倍,直到放完所有棋盘格(国际象棋共有64格)。
国王以为他只是想要一袋麦子而已,哈哈大笑。
当时的条件下无法准确计算,但估算结果令人吃惊:即使全世界都铺满麦子也不够用!
请你借助计算机准确地计算,到底需要多少粒麦子。
答案写在“解答.txt”中,不要写在这里!
答案:
18446744073709551615
代码如下:
import java.math.BigInteger;
import java.util.Scanner;
public class Main{
public static void main(String[] args){
BigInteger sum = new BigInteger("0");
BigInteger js = new BigInteger("2");
for(int i=0;i<64;i++){
BigInteger val = js.pow(i);
sum=sum.add(val);
}
System.out.println(sum);
}
}
11.国庆星期日
1949年的国庆节(10月1日)是星期六。
今年(2012)的国庆节是星期一。
那么,从建国到现在,有几次国庆节正好是星期日呢?
只要答案,不限手段!
可以用windows日历,windows计算器,Excel公式,。。。。。
当然,也可以编程!
不要求写出具体是哪些年,只要一个数目!
千万不要提交源代码!
答案不要写在这里,写在“解答.txt”中
答案:
9
代码如下:import java.util.Scanner;
public class Main{
public static void main(String[] args){
int counter=0;//计算器
int a = 6;
for(int year=1950;year<=2012;year++){
if(isleapyear(year)){
a+=2;
}else{
a+=1;
}
if(a%7==0){
counter++;
}
}
System.out.println(counter);
}
//判断是否为闰年
private static boolean isleapyear(int year){
return (year%400==0||(year%4==0&&year%100!=0));
}
}
12.找素数
素数就是不能再进行等分的整数。比如:7,11。而9不是素数,因为它可以平分为3等份。一般认为最小的素数是2,接着是3,5,...
请问,第100002(十万零二)个素数是多少?
请注意:“2”是第一素数,“3” 是第二个素数,依此类推。
不需要提交源代码,只要写出准确的结果即可!
答案写在:“解答.txt”中,不要写在这里。
结果:
1299743
代码如下:
import java.util.Scanner;
public class Main{
public static void main(String[] args){
int count = 0;
for(int i=2;i<100000000;i++){
if(su(i)){
count++;
}
if(count==100002){
System.out.println(i);
break;
}
}
}
private static boolean su(int i){
if(i==1&&i==0){
return false;
}
for(int j=2;j*j<=i;j++){
if(i%j==0){
return false;
}
}
return true;
}
}
13.填写算式
看这个算式:
☆☆☆ + ☆☆☆ = ☆☆☆
如果每个五角星代表 1 ~ 9 的不同的数字。
这个算式有多少种可能的正确填写方法?
173 + 286 = 459
295 + 173 = 468
173 + 295 = 468
183 + 492 = 675
以上都是正确的填写法!
注意:
111 + 222 = 333 是错误的填写法!
因为每个数字必须是不同的!
也就是说:1~9中的所有数字,每个必须出现且仅出现一次!
注意:
不包括数字“0”!
注意:
满足加法交换率的式子算两种不同的答案。
所以答案肯定是个偶数!
注意:
只要求计算不同的填法的数目
不要求列出所有填写法
更不要求填写源代码!
答案不要写在这里,请写在“解答.txt”中!
结果:
336
代码如下:
import java.util.Scanner;
public class Main{
public static void main(String[] args){
int cnt = 0;
for(int a=1;a<=9;a++){
for(int b=1;b<=9;b++){
for(int c=1;c<=9;c++){
for(int d=1;d<=9;d++){
for(int e=1;e<=9;e++){
for(int f=1;f<=9;f++){
for(int g=1;g<=9;g++){
for(int h=1;h<=9;h++){
for(int i=1;i<=9;i++){
if(a!=b && a!=c && a!=d && a!=e && a!=f && a!=g && a!=h && a!=i &&
b!=c && b!=d && b!=e && b!=f && b!=g && b!=h && b!=i &&
c!=d && c!=e && c!=f && c!=g && c!=h && c!=i &&
d!=e && d!=f && d!=g && d!=h && d!=i &&
e!=f && e!=g && e!=h && e!=i &&
f!=g && f!=h && f!=i &&
g!=h && g!=i &&
h!=i){
if(a!=0 && d!=0 && g!=0){
if((a*100+b*10+c)+(d*100+e*10+f)==(g*100+h*10+i)){
cnt++;
}
}
}
}
}
}
}
}
}
}
}
}
System.out.println(cnt);
}
}
14.取字母组成串
A B C D中取5次,每个字母都可以重复取出,形成一个串。
现在要求,串中A出现的次数必须为偶数(0次也算偶数)。
求可以形成多少种可能的串。
结果:
528
代码如下:
import java.util.Scanner;
public class Main{
public static void main(String[] args){
char[] a={'A','B','C','D'};
int total=0,ans=0;
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
for(int k=0;k<4;k++){
for(int m=0;m<4;m++){
for(int n=0;n<4;n++){
if(a[i]=='A')
ans++;
if(a[j]=='A')
ans++;
if(a[k]=='A')
ans++;
if(a[m]=='A')
ans++;
if(a[n]=='A')
ans++;
if(ans%2==0)
total++;
ans=0;
}
}
}
}
}
System.out.println(total);
}
}
(待续)