蓝桥杯基础题(3,4题)

来源:互联网 发布:男生毛孔粗大知乎 编辑:程序博客网 时间:2024/05/16 05:30
1.立方尾不变

有些数字的立方的末尾正好是该数字本身。
比如:1,4,5,6,9,24,25,....

请你计算一下,在10000以内的数字中(指该数字,并非它立方后的数值),符合这个特征的正整数一共有多少个。

请提交该整数,不要填写任何多余的内容。

这一题的要点:
1.10000的数字立方会很大,所以需要用到Long/BigInteger
2.立方后的尾部长度是不固定的,但是它与立方前的数字长度是相同的,所以需要用到String:substring,valueOf,equals
3.这里因为数值比较大,所以要用BigInteger的multipy进行平方,也因为multipy的操作对象是BigInteger,所以需要用String.valueOf将i转化为String,然后再通过new BigInteger的方式转化为BigInteger

          BigInteger threeNum=new BigInteger(String.valueOf(i));
          threeNum=threeNum.multiply(threeNum).multiply(threeNum);
          if(threeNum.toString().endsWith(i+"")){
              count++;
          }
BigInteger的获取对象是字符串,字符串的转化方式是String.valueOf,而BigInteger自带multiply的平方方法
最后可以得到答案是36

2.煤球数目

有一堆煤球,堆成三角棱锥形。具体:
第一层放1个,
第二层3个(排列成三角形),
第三层6个(排列成三角形),
第四层10个(排列成三角形),
....
如果一共有100层,共有多少个煤球?

请填表示煤球总数目的数字。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。


这里容易写错,写成5050.因为算的只是每层新增个数的总和,没有上一层加进去,所以每一层都要  上一层+新增个数,然后再算每一层的总和
public class Main {
     public static void main(String[] args) {
          int all=0;
          int thisCeng=0;
          for (int i = 1; i <= 100; i++) {
              thisCeng+=i;
              all+=thisCeng;
          }
          System.out.println(all);
     }
}
这里运用的是两次累加。

3.国王的遗产
X国是个小国。国王K有6个儿子。在临终前,K国王立下遗嘱:国王的一批牛作为遗产要分给他的6个儿子。 其中,大儿子分1/4,二儿子1/5,三儿子1/6,.... 直到小儿子分1/9。 牛是活的,不能把一头牛切开分。 最后还剩下11头牛,分给管家。 请计算国王这批遗产中一共有多少头牛。 这是一个整数,请通过浏览器提交答案,不要填写任何多余的内容(比如说明性的文字)

这道题隐藏的信息就是,这些牛的头数可以被以上六个分数的分母进行整除,所以可以用循环暴力破解。

          if(i%9==0&&i%8==0&&i%7==0&&i%6==0&&i%5==0&&i%4==0&&i-i/9-i/8-i/7-i/6-i/5-i/4==11){...

可以得出答案2520,这里要注意他是总数可以%这些值,而不是没算上管家那一份,所以管家的条件也要加上去。
优化程序:可以从几个数的最小公倍数2520开始寻找,很快就能得出答案。

4.猜生日
今年的植树节(2012年3月12日),小明和他的叔叔还有小伙伴们一起去植树。休息的时候,小明的同学问他叔叔多大年纪,他叔叔说:“我说个题目,看你们谁先猜出来!”
”把我出生的年月日连起来拼成一个8位数(月、日不足两位前补0)正好可以被今天的年、月、日整除!”
他想了想,又补充到:“再给个提示,我是6月出生的。”
根据这些信息,请你帮小明算一下,他叔叔的出生年月日。

格式是年月日连成的8位数。
例如,如果是1948年6月12日,就写:19480612


     for (int i = 1900; i < 2012; i++) {

              for (int j = 1; j < 31; j++) {
     ...
                   }
              }
     }
这里使用的是合成法,合成元素不是越细越好,而是适中,太大会不灵活,太小会太零散。
得出结果是19550604

5.n的各位互不相同
题目如题意

题目分析:
1.新建数组[10],10种数字
2.while(n>10)循环,每一次取他的个位,将个位作为脚标让数组赋值为1(赋值为++可以获取其位个数)
3.判断数组的总和与位数是否相等,就知道这串数位数是否都不相同
while(num>0){
     a[num%10]=1;
     num=num/10;
     numCount++;
}
一个while循环用来放数字,一个循环用来算数字个数。
(由于数组原因,一般只能处理一次,除非进行处理)
6.成比例N个数字互不相同
1,2,3……,9组成3个三位数abc,defghi,每个数字恰好使用一次,要求abc:def:ghi=1:2:3.输出所有解。

------------------------------------------------------------------------------------------------------------------------------------
题目分析:
1.匹配数字:三层循环三个数(存入数组),但是这里三个数都有规律,所以也不用三层循环,一层循环就可以确认三个数(100333)
2.恰用一次:循环三个数,判断计数数组总和是不是为9,是的话符合题意,输出答案一直到程序结束。(用传过去9位数的方式判断,可以用int)
基本类型范围
     int a=1234567890;   //10位
     long b=1234567890123456789l;   //19位

     for (int i = 123; i < 334; i++) {
          int a=i;
          int b=i*2;
          int c=i*3;
          if(check(a*1000000+b*1000+c)){
              System.out.println(i+" "+i*2+" "+i*3);
          }

     }
答案的结果有四个。要排除带0的数,只要在统计个数的数组的时候,从1遍历到9。
192 384 576
219 438 657
273 546 819
327 654 981
0 0
原创粉丝点击