/*
标题: 购物单小明刚刚找到工作,老板人很好,只是老板夫人很爱购物。老板忙的时候经常让小明帮忙到商场代为购物。小明很厌烦,但又不好推辞。
这不,XX大促销又来了!老板夫人开出了长长的购物单,都是有打折优惠的。
小明也有个怪癖,不到万不得已,从不刷卡,直接现金搞定。
现在小明很心烦,请你帮他计算一下,需要从取款机上取多少现金,才能搞定这次购物。取款机只能提供100元面额的纸币。小明想尽可能少取些现金,够用就行了。
你的任务是计算出,小明最少需要取多少现金。以下是让人头疼的购物单,为了保护隐私,物品名称被隐藏了。
-----------------
**** 180.90 88折
**** 10.25 65折
**** 56.14 9折
**** 104.65 9折
**** 100.30 88折
**** 297.15 半价
**** 26.75 65折
**** 130.62 半价
**** 240.28 58折
**** 270.62 8折
**** 115.87 88折
**** 247.34 95折
**** 73.21 9折
**** 101.00 半价
**** 79.54 半价
**** 278.44 7折
**** 199.26 半价
**** 12.97 9折
**** 166.30 78折
**** 125.50 58折
**** 84.98 9折
**** 113.35 68折
**** 166.57 半价
**** 42.56 9折
**** 81.90 95折
**** 131.78 8折
**** 255.89 78折
**** 109.17 9折
**** 146.69 68折
**** 139.33 65折
**** 141.16 78折
**** 154.74 8折
**** 59.42 8折
**** 85.44 68折
**** 293.70 88折
**** 261.79 65折
**** 11.30 88折
**** 268.27 58折
**** 128.29 88折
**** 251.03 8折
**** 208.39 75折
**** 128.88 75折
**** 62.06 9折
**** 225.87 75折
**** 12.89 75折
**** 34.28 75折
**** 62.16 58折
**** 129.12 半价
**** 218.37 半价
**** 289.69 8折
--------------------需要说明的是,88折指的是按标价的88%计算,而8折是按80%计算,余者类推。
特别地,半价是按50%计算。请提交小明要从取款机上提取的金额,单位是元。
答案是一个整数,类似4300的样子,结尾必然是00,不要填写任何多余的内容。
特别提醒:不许携带计算器入场,也不能打开手机。
*/
答案:5200
方法:用excel或者电脑上的计算器,其中Excel分列时注意粘贴在哪一行就将那一列分列。
立方变自身
观察下面的现象,某个数字的立方,按位累加仍然等于自身。
1^3 = 1
8^3 = 512 5+1+2=8
17^3 = 4913 4+9+1+3=17
...请你计算包括1,8,17在内,符合这个性质的正整数一共有多少个?
请填写该数字,不要填写任何多余的内容或说明性的文字。
答案:6
方法:枚举
代码:
public class Main {
public static int sum = 0;
public static void main(String[] args) {
for(int i = 1; i <= 100000000; i ++) {
if(check(i)) {
System.out.println(i);
sum ++;
}
}
}
private static boolean check(int i) {
int n = 0;
int x = i * i * i;
while(x > 0) {
n += x % 10;
x = x /10;
}
if(n == i) return true;
return false;
}
}
三羊献瑞
观察下面的加法算式:
祥 瑞 生 辉
+ 三 羊 献 瑞
-------------------
三 羊 生 瑞 气(如果有对齐问题,可以参看【图1.jpg】)
其中,相同的汉字代表相同的数字,不同的汉字代表不同的数字。
请你填写“三羊献瑞”所代表的4位数字(答案唯一),不要填写任何多余内容。
*/
/*
a b c d
+ e f g b
-------------------
e f c b ie=1,a=9,f=0,c=b+1,c+g>10
答案:1085
方法:将八个不同的字分别用八个不同的数字代替,用到8/10全排列,我采用的是dfs
代码:
public class Main {
public static int a[] = new int[9];
public static boolean vis[] = new boolean[10];
public static void main(String[] args) {
dfs(0);
}
private static void dfs(int n) {
if(n == 8) {
if(check()) {
System.out.println(a[4] * 1000 + a[3] * 100 + a[5] * 10 + a[6]);
System.out.println(a[0] * 1000 + a[1] * 100 + a[2] * 10 + a[3]);
System.out.println(a[0] * 10000 + a[1] * 1000 + a[5] * 100 + a[3] * 10 + a[7]);
System.out.println();
}
return;
}
for(int i = 0; i <=9; i ++) {
if(!vis[i]) {
vis[i] = true;
a[n] = i;
dfs(n + 1);
vis[i] = false;
}
}
}
private static boolean check() {
int t1, t2, t3;
t1 = a[4] * 1000 + a[3] * 100 + a[5] * 10 + a[6];
t2 = a[0] * 1000 + a[1] * 100 + a[2] * 10 + a[3];
t3 = a[0] * 10000 + a[1] * 1000 + a[5] * 100 + a[3] * 10 + a[7];
if(t1 + t2 == t3) return true;
return false;
}
}
/*
循环节长度两个整数做除法,有时会产生循环小数,其循环部分称为:循环节。
比如,11/13=6=>0.846153846153..... 其循环节为[846153] 共有6位。
下面的方法,可以求出循环节的长度。请仔细阅读代码,并填写划线部分缺少的代码。
注意,只能填写缺少的部分,不要重复抄写已有代码。不要填写任何多余的文字。*/
public class Main {public static void main(String[] args) {
System.out.println( f(11,13));
}
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()-v.indexOf(n); //填空
}
}}
/*
九数组分数1,2,3...9 这九个数字组成一个分数,其值恰好为1/3,如何组法?
下面的程序实现了该功能,请填写划线部分缺失的代码。
public class A
{
}注意,只能填写缺少的部分,不要重复抄写已有代码。不要填写任何多余的文字。
*/
public class Main {
public static void test(int[] x)
{
int a = x[0]*1000 + x[1]*100 + x[2]*10 + x[3];
int b = x[4]*10000 + x[5]*1000 + x[6]*100 + x[7]*10 + x[8];
if(a*3==b) System.out.println(a + " " + b);
}
public static void f(int[] x, int k)
{
if(k>=x.length){
test(x);
return;
}
for(int i=k; i<x.length; i++){
{int t=x[k]; x[k]=x[i]; x[i]=t;}
f(x,k+1);
int t=x[i]; x[i]=x[k]; x[k]=t; // 填空
}
}
public static void main(String[] args)
{
int[] x = {1,2,3,4,5,6,7,8,9};
f(x,0);
}
}
加法变乘法
我们都知道:1+2+3+ ... + 49 = 1225
现在要求你把其中两个不相邻的加号变成乘号,使得结果为2015比如:
1+2+3+...+10*11+12+...+27*28+29+...+49 = 2015
就是符合要求的答案。请你寻找另外一个可能的答案,并把位置靠前的那个乘号左边的数字提交(对于示例,就是提交10)。
注意:需要你提交的是一个整数,不要填写任何多余的内容。
*/
答案:16
方法:枚举
代码:
public class Main {
public static int a[] = new int[3];
//public static int
public static void main(String[] args) {
int sum = 0;
for(int i = 1;i <= 47;i ++) {
a[0] = i;
for(int j = i + 2;j <= 48; j ++) {
a[1] = j;
sum = 0;
for(int k = 1;k <= 49; k++) {
if(k == a[0] || a[1] == k) {
sum += k * (k + 1);
k ++;
}
else sum += k;
}
/*System.out.println(a[0]);
System.out.println(a[1]);
System.out.println();*/
if(sum == 2015) {
System.out.println(a[0]);
System.out.println(a[1]);
System.out.println();
}
}
//System.out.println(sum);
}
/*for(int k = 1;k <= 49; k++) {
if(k == 10 || 27 == k) {
sum += k * (k + 1);
k ++;
}
else sum += k;
}
System.out.println(sum);*/
}
}
/*
牌型种数小明被劫持到X赌城,被迫与其他3人玩牌。
一副扑克牌(去掉大小王牌,共52张),均匀发给4个人,每个人13张。
这时,小明脑子里突然冒出一个问题:
如果不考虑花色,只考虑点数,也不考虑自己得到的牌的先后顺序,自己手里能拿到的初始牌型组合一共有多少种呢?请填写该整数,不要填写任何多余的内容或说明文字。
*/
答案:3598180
方法:dfs深搜
代码:
public class Main {
public static int a[] = new int[14];
public static int vis[] = new int[14];
public static int sum = 0;
public static void main(String[] args) {
dfs(0,13);
System.out.println(sum);
}
private static void dfs(int n,int l) {
if(l < 0) {
return;
}
if(n == 13) {
if(l == 0) {
sum ++;
}
return ;
}
if(n > 13) {
return;
}
dfs(n + 1,l);
dfs(n + 1,l - 1);
dfs(n + 1,l - 2);
dfs(n + 1,l - 3);
dfs(n + 1,l - 4);
}
}