目录
第1题 数位和
标题:数位和
数学家高斯很小的时候就天分过人。一次老师指定的算数题目是:1+2+...+100。
高斯立即做出答案:5050!
这次你的任务是类似的。但并非是把一个个的数字加起来,而是对该数字的每一个数位作累加。
这样从1加到100的“和”是:901
从10加到15是:21,也就是:1+0+1+1+1+2+1+3+1+4+1+5,这个口算都可以出结果的。
按这样的“加法”,从1加到1000是多少呢? 请通过浏览器提交该结果。
当然,我们并不期望你能像高斯一样,发现数字背后深奥的秘密,只要请计算机帮忙,一切都easy!
注意:你需要提交的是一个整数,不要填写任何多余的内容(比如:说明性文字)答案:13501
思路:循环一下数,然后拆分累加得到结果。
public class Main {
public static int count = 0;
public static void main(String[] args) {
for(int i=1;i<=1000;i++){
show(i);
}
System.out.println(count);
}
private static void show(int i) {
// TODO Auto-generated method stub
while(i>=10){
count+=i%10;
i=i/10;
}
count+=i;
}
}
//13501
第2题 数字划分
标题:数字划分
w星球的长老交给小明一个任务:
1,2,3...16 这16个数字分为两组。
要求:
这两组数字的和相同,
并且,两组数字的平方和也相同,
并且,两组数字的立方和也相同。
请你利用计算机的强大搜索能力解决这个问题。
并提交1所在的那个分组的所有数字。
这些数字要从小到大排列,两个数字间用一个空格分开。
即类似:1 4 5 8 ... 这样的答案。
注意,只提交这一组数字,不要填写任何多余的内容。
----------------------------------------
笨笨有话说:
只要一个组的成员确定了,另一个组的成员也就确定了。枚举一个组的成员就可以了。
凭直觉,两个组的成员数目不会差太多吧。
歪歪有话说:
既然求 1 所在的那个组,那只要枚举剩余的成员就可以了。
貌似都是8个成员的可能性很大啊。答案:1 4 6 7 10 11 13 16
思路:用两个长度为8的数组,然后全排列一个数组,另一个补全即可。
public class Main {
public static int [] a = new int [8];
public static int [] b = new int [8];
public static boolean[] c = new boolean [17];
public static void main(String[] args) {
dfs(0);
}
/*
* 递归全排列
*/
private static void dfs(int temp) {
if(temp>7){
if(show())
print();
return;
}
for(int i=1;i<=16;i++){
if(!c[i]){
c[i] = true;
a[temp] = i;
dfs(temp+1);
c[i] = false;
}
}
}
/**
* 判断是否满足条件 满足返回true 否则返回false
* @return
*/
public static boolean show(){
//判断是不是从小到大的顺序
for(int i=0;i<8;i++){
for(int j=i;j<8;j++){
if(a[i]>a[j]){
return false;
}
}
}
//根据第一组数,把第二组数赋值一下
int e =0;
for(int i=1;i<=16;i++){
boolean fal = false;
for(int j=0;j<8;j++){
if(a[j]==i){
fal = true;
break;
}
}
if(!fal){
b[e] = i;
e++;
}
}
int counta = 0;//第一组数和
int countb = 0;//第二组数和
// 和
for(int i=0;i<8;i++){
counta+=a[i];
countb+=b[i];
}
if(counta!=countb){
return false;
}
counta = 0;
countb = 0;
// 平和和
for(int i=0;i<8;i++){
counta+=a[i]*a[i];
countb+=b[i]*b[i];
}
if(counta!=countb){
return false;
}
counta = 0;
countb = 0;
// 立方和
for(int i=0;i<8;i++){
counta+=a[i]*a[i]*a[i];
countb+=b[i]*b[i]*b[i];
}
if(counta!=countb){
return false;
}
return true;
}
/**
* 输出
*/
public static void print(){
for(int i=0;i<8;i++){
System.out.print(a[i]+" ");
}
System.out.println();
}
}
//1 4 6 7 10 11 13 16
第3题 树形显示
标题:树形显示
对于分类结构可以用树形来形象地表示。比如:文件系统就是典型的例子。
树中的结点具有父子关系。我们在显示的时候,把子项向右缩进(用空格,不是tab),
并添加必要的连接线,以使其层次关系更醒目。
下面的代码就是为了这个目的的,请仔细阅读源码,并填写划线部分缺少的代码。
import java.util.*;class MyTree
{
private Map<String, List<String>> map_ch = new HashMap<String, List<String>>();
private Map<String,String> map_pa = new HashMap<String,String>();
public void add(String parent, String child)
{
map_pa.put(child, parent);
List<String> lst = map_ch.get(parent);
if(lst==null){
lst = new ArrayList<String>();
map_ch.put(parent, lst);
}
lst.add(child);
}
public String get_parent(String me){
return map_pa.get(me);
}
public List<String> get_child(String me){
return map_ch.get(me);
}
private String space(int n)
{
String s = "";
for(int i=0; i<n; i++) s += ' ';
return s;
}
private boolean last_child(String x){
String pa = map_pa.get(x);
if(pa==null) return true;
List<String> lst = map_ch.get(pa);
return lst.get(lst.size()-1).equals(x);
}
public void show(String x){
String s = "+--" + x;
String pa = x;
while(true){
pa = map_pa.get(pa);
if(pa==null) break;
s = ___________________________________ ; // 填空
}
System.out.println(s);
}
public void dfs(String x){
show(x);
List<String> lst = map_ch.get(x);
if(lst==null) return;
for(String it: lst){
dfs(it);
}
}
}public class TreeView
{
public static void main(String[] args)
{
MyTree tree = new MyTree();
tree.add("root", "dog");
tree.add("root", "cat");
tree.add("root", "duck");
tree.add("dog", "AAdog");
tree.add("dog", "BBdog");
tree.add("dog", "CCdog");
tree.add("AAdog", "AAdog01");
tree.add("AAdog", "AAdog02");
tree.add("cat", "XXcat");
tree.add("cat", "YYcat");
tree.add("XXcat","XXcat-oo");
tree.add("XXcat","XXcat-qq");
tree.add("XXcat-qq", "XXcat-qq-hahah");
tree.add("duck", "TTduck");
tree.add("TTduck", "TTduck-001");
tree.add("TTduck", "TTduck-002");
tree.add("TTduck", "TTduck-003");
tree.add("YYcat","YYcat.hello");
tree.add("YYcat","YYcat.yes");
tree.add("YYcat","YYcat.me");
tree.dfs("root");
}
}
思路:读代码可知,添加的时候是根据父节点和子节点来添加。父节点只有一个,子节点有多个。
第一次判断没有父节点,直接输出。
第二行因为他的父节点的同类只有一个,所以加4个空格在输出。
第三行由于父节点的同类有多个,所以再加上|和3个空格在输出,
还有就是判断是不是最后一个,后面依次类推。
答案:last_child(pa) ? space(4) + s : "|"+ space(3) + s
//last_child(pa) ? space(4) + s : "|"+ space(3) + s
第4题 小数第n位
来自:CSDN 作者: 萤火虫的微亮 原文:https://blog.csdn.net/weixin_42318538/article/details/89407266
第5题 分考场
来自:CSDN 作者: 萤火虫的微亮 原文:https://blog.csdn.net/weixin_42318538/article/details/8942427
第6题 合根植物
来自:CSDN 作者: 萤火虫的微亮 原文:https://blog.csdn.net/weixin_42318538/article/details/89425239