1、外星日历
某星系深处发现了文明遗迹。 他们的计数也是用十进制。 他们的文明也有日历。日历只有天数,没有年、月的概念。 有趣的是,他们也使用了类似“星期”的概念, 只不过他们的一个星期包含了9天, 为了方便,这里分别记为: A,B,C....H,I 从一些资料上看到, 他们的23日是星期E 他们的190日是星期A 他们的343251日是星期I 令人兴奋的是,他们居然也预见了“世界末日”的那天, 当然是一个很大很大的数字 651764141421415346185 请你计算一下,这遥远的一天是该文明的星期几? 你需要提交的是一个大写字母,表示该文明的星期几, 不要填写任何多余的内容。
题解:
代码语言:javascript复制package action;
import java.math.BigInteger;
public class demo {
public static void main(String[] args) {
BigInteger x = new BigInteger("651764141421415346185");
BigInteger y = x.mod(new BigInteger("9"));
int z = y.intValue();
System.out.println((char)('A' z-1));
}
}
2、阶乘位数
代码语言:javascript复制9的阶乘等于:362880 它的二进制表示为:1011000100110000000 这个数字共有19位。 请你计算,9999 的阶乘的二进制表示一共有多少位? 注意:需要提交的是一个整数,不要填写任何无关内容(比如说明解释等)
import java.math.BigInteger;
public class demo {
public static void main(String[] args) {
BigInteger n = new BigInteger("1");
for(int i=1;i<=9999;i )
n = n.multiply(new BigInteger("0" i));
String s = n.toString(2);
System.out.println(s.length());
}
}
3、数字游戏
代码语言:javascript复制历届试题 数字游戏 时间限制:1.0s 内存限制:256.0MB 问题描述 栋栋正在和同学们玩一个数字游戏。 游戏的规则是这样的:栋栋和同学们一共n个人围坐在一圈。栋栋首先说出数字1。接下来,坐在栋栋左手边的同学要说下一个数字2。再下面的一个同学要从上一个同学说的数字往下数两个数说出来,也就是说4。下一个同学要往下数三个数,说7。依次类推。 为了使数字不至于太大,栋栋和同学们约定,当在心中数到 k-1 时,下一个数字从0开始数。例如,当k=13时,栋栋和同学们报出的前几个数依次为: 1, 2, 4, 7, 11, 3, 9, 3, 11, 7。 游戏进行了一会儿,栋栋想知道,到目前为止,他所有说出的数字的总和是多少。 输入格式 输入的第一行包含三个整数 n,k,T,其中 n 和 k 的意义如上面所述,T 表示到目前为止栋栋一共说出的数字个数。 输出格式 输出一行,包含一个整数,表示栋栋说出所有数的和。 样例输入 3 13 3 样例输出 17 样例说明 栋栋说出的数依次为1, 7, 9,和为17。 数据规模和约定 1 < n,k,T < 1,000,000; 这道题直接用等差数列求和算出来下一个数字是多少然后加起来即可。
import java.math.BigInteger;
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
BigInteger n,t,k;
Scanner sc=new Scanner(System.in);
n=sc.nextBigInteger();
k=sc.nextBigInteger();
t=sc.nextBigInteger();
BigInteger sum=BigInteger.valueOf(0),now=BigInteger.valueOf(1),pre=BigInteger.valueOf(0);
while(t.compareTo(BigInteger.valueOf(0))!=0) {
now=now.mod(k);
sum=sum.add(now);
pre=pre.add(BigInteger.valueOf(1));
now=now.add(pre.multiply(n).add((n.multiply(n.subtract(BigInteger.valueOf(1))).divide(BigInteger.valueOf(2)))));
pre=pre.add(n.subtract(BigInteger.valueOf(1)));
t=t.subtract(BigInteger.valueOf(1));
}
System.out.println(sum);
}
}
4、棋盘放麦子
代码语言:javascript复制你一定听说过这个故事。国王对发明国际象棋的大臣很佩服,问他要什么报酬,大臣说:请在第 11 个棋盘格放 11 粒麦子,在第 22 个棋盘格放 22 粒麦子,在第 33 个棋盘格放 44 粒麦子,在第 44 个棋盘格放 88 粒麦子,…后一格的数字是前一格的两倍,直到放完所有棋盘格(国际象棋共有 6464 格)。 国王以为他只是想要一袋麦子而已,哈哈大笑。 当时的条件下无法准确计算,但估算结果令人吃惊:即使全世界都铺满麦子也不够用! 请你借助计算机准确地计算,到底需要多少粒麦子。
import java.math.BigInteger;
public class demo {
public static void main (String[] arge) {
BigInteger a =new BigInteger("0");
BigInteger b = new BigInteger("2");
for (int i = 0; i < 64; i ) {
a = a.add(b.pow(i));
}
System.out.println(a);
}
}
5、四平方和
四平方和定理,又称为拉格朗日定理: 每个正整数都可以表示为至多 4 个正整数的平方和。 如果把 0 包括进去,就正好可以表示为 4 个数的平方和。 比如: 5 = 0^2 0^2 1^2 2^25=02 02 12 22; 7 = 1^2 1^2 1^2 2^27=12 12 12 22; 对于一个给定的正整数,可能存在多种平方和的表示法。 要求你对 4 个数排序: 0 leq a leq b leq c leq d0≤a≤b≤c≤d 并对所有的可能表示法按 a,b,c,da,b,c,d 为联合主键升序排列,最后输出第一个表示法。 输入描述 程序输入为一个正整数 N (N<5 times 10^6)N(N<5×106)。 输出描述 要求输出 4 个非负整数,按从小到大排序,中间用空格分开 输入输出样例 12 输出样例 0 2 2 2 运行限制
- 最大运行时间:3s
- 最大运行内存: 256M
6、乘积尾零
描述如下的10行数据,每行有10个整数,请你求出它们的乘积的末尾有多少个零?
代码语言:javascript复制5650 4542 3554 473 946 4114 3871 9073 90 4329
2758 7949 6113 5659 5245 7432 3051 4434 6704 3594
9937 1173 6866 3397 4759 7557 3070 2287 1453 9899
1486 5722 3135 1170 4014 5510 5120 729 2880 9019
2049 698 4582 4346 4427 646 9742 7340 1230 7683
5693 7015 6887 7381 4172 4341 2909 2027 7355 5649
6701 6645 1671 5978 2704 9926 295 3125 3878 6785
2066 4247 4800 1578 6652 4616 1113 6205 3264 2915
3966 5291 2904 1285 2193 1428 2265 8730 9436 7074
689 5510 8243 6114 337 4096 8199 7313 3685 211
题解:
代码语言:javascript复制public class demo {
public static void main(String[] args) {
BigInteger sum =new BigInteger("1");
Scanner scanner=new Scanner(System.in);
int n=10;
while (n-->0){
String str=scanner.nextLine();
String str1[]=str.split(" ");
for (int i = 0; i<10 ; i ) {
BigInteger big=new BigInteger(str1[i]);
sum=sum.multiply(big);
}
System.out.println(sum);
}
}
}
附加:黄金分割
代码语言:javascript复制黄金分割数0.618与美学有重要的关系。舞台上报幕员所站的位置大约就是舞台宽度的0.618处, 墙上的画像一般也挂在房间高度的0.618处,甚至股票的波动据说也能找到0.618的影子.... 黄金分割数是个无理数,也就是无法表示为两个整数的比值。 0.618只是它的近似值,其真值可以通过对5开方减去1再除以2来获得, 我们取它的一个较精确的近似值:0.618034 有趣的是,一些简单的数列中也会包含这个无理数,这很令数学家震惊! 1 3 4 7 11 18 29 47 .... 称为“鲁卡斯队列”。它后面的每一个项都是前边两项的和。 如果观察前后两项的比值,即:1/3,3/4,4/7,7/11,11/18 ... 会发现它越来越接近于黄金分割数! 你的任务就是计算出从哪一项开始,这个比值四舍五入后已经达到了与0.618034一致的精度。 请写出该比值。格式是:分子/分母。比如:29/47
import java.math.BigDecimal;
public class demo {
public static double format(double d) {
BigDecimal bd = new BigDecimal(d).setScale(6, BigDecimal.ROUND_HALF_UP);
double dd = bd.doubleValue();//返回浮点数值
return dd;
}
public static void f(int a, int b) {
double d = format((double) a / b);
if (d == 0.618034) {
System.out.println(a "/" b "=" d);
return;
}
f(b, a b);
}
public static void main(String[] args) {
f(1, 3);
}
}
总结:
其实大数处理的题都不是很难,掌握四则运算加上小数点处理就行。