第一题 报纸页数
X星球日报和我们地球的城市早报是一样的, 都是一些单独的纸张叠在一起而已。每张纸印有4版。
比如,某张报纸包含的4页是:5,6,11,12, 可以确定它应该是最上边的第2张报纸。
我们在太空中捡到了一张X星球的报纸,4个页码分别是: 1125,1126,1727,1728
请你计算这份报纸一共多少页(也就是最大页码,并不是用了几张纸哦)?
请填写表示总页数的数字。 注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
答案:
题目还是没看懂第二题 煤球数目
有一堆煤球,堆成三角棱锥形。具体: 第一层放1个, 第二层3个(排列成三角形), 第三层6个(排列成三角形), 第四层10个(排列成三角形), …. 如果一共有100层,共有多少个煤球?
请填表示煤球总数目的数字。
//题目不难,用一个函数计算第几层有多少个,然后加到总和 /*for(int i=1; i<=100; i++) { sum += fun(i); }*/ //100层煤球一共有多少个 //100层煤球一共有多少个 //100层煤球一共有多少个 //不要再粗心写5050了,勿忘勿忘勿忘 #include<stdio.h> int fun(int n) { int sum = 0; for(int i=1; i<=n; i++) { sum += i; } return sum; } int main() { int sum = 0; for(int i=1; i<=100; i++) { sum += fun(i); } printf("%d", sum); return 0; } //另一种解法 #include <stdio.h> int main() { int i,n,sum; sum = 0; n = 0; for (i = 1; i <= 100; ++i) { // n +=i; sum += n; printf("%d\n", n); } printf("%d\n", sum); return 0; }第三题 平方怪圈
如果把一个正整数的每一位都平方后再求和,得到一个新的正整数。 对新产生的正整数再做同样的处理。
如此一来,你会发现,不管开始取的是什么数字, 最终如果不是落入1,就是落入同一个循环圈。
请写出这个循环圈中最大的那个数字。 请填写该最大数字。
#include<iostream> #include<cstring> using namespace std; char s[100]; int fun(char *s) { int sum = 0; int len = strlen(s); //每个数都平方 for(int i=0; i<len; i++) { sum += (s[i]-'0')*(s[i]-'0'); } return sum; } int main() { int num = 14; int MAX = 0; //根据题意,设置循环50次 for(int i=0; i<50; i++) { //因为要检测一个数一共有几位,所以把他转化为字符串,利用strlen就可以检测到,然后每个数都平方,再返回一个数值 sprintf(s, "%d", num); num = fun(s); //每一次都比较,把最大的放出来 MAX = max(MAX, num); } cout << MAX << endl; return 0; }第四题 打印方格 小明想在控制台上输出 m x n 个方格。 比如 10x4的,输出的样子是:
以下是小明写的程序,请你分析其流程,填写划线部分缺少的代码 #include<stdio.h> void f(int m, int n) { int row; int col; for(row=0; row<n; row++) { for(col=0; col<m; col++) printf("+---"); printf("+\n"); for(col=0; col<m; col++) printf("| "); printf("\n"); } printf("+"); //填写代码 printf("\n"); } int main() { f(10,4); return 0; } //通过简单的调试,可以看出来。不难,题目很水,别粗心就好了 #include<stdio.h> void f(int m, int n) { int row; int col; for(row=0; row<n; row++) { for(col=0; col<m; col++) printf("+---"); printf("+\n"); for(col=0; col<m; col++) printf("| "); printf("|\n"); } printf("+"); //循环打印---------------------------------------- for(col=0; col<m; col++) printf("---+"); printf("\n"); } int main() { f(10,4); return 0; }第五题 快速排序
排序在各种场合经常被用到。 快速排序是十分常用的高效率的算法。
其思想是:先选一个“标尺”, 用它把整个队列过一遍筛子, 以保证:其左边的元素都不大于它,其右边的元素都不小于它。
这样,排序问题就被分割为两个子区间。 再分别对子区间排序就可以了。
下面的代码是一种实现,请分析并填写划线部分缺少的代码。
复制代码
#include <stdio.h> void swap(int a[], int i, int j) { int t = a[i]; a[i] = a[j]; a[j] = t; } int partition(int a[], int p, int r) { int i = p; int j = r + 1; int x = a[p]; while(1){ while(i<r && a[++i]<x); while(a[--j]>x); if(i>=j) break; swap(a,i,j); } ______________________; return j; } void quicksort(int a[], int p, int r) { if(p<r){ int q = partition(a,p,r); quicksort(a,p,q-1); quicksort(a,q+1,r); } } int main() { int i; int a[] = {5,13,6,24,2,8,19,27,6,12,1,17}; int N = 12; quicksort(a, 0, N-1); for(i=0; i<N; i++) printf("%d ", a[i]); printf("\n"); return 0; }答案:看不懂的,建议百度快排,看一下原理
swap(a,p,j)
凑算式
这个算式中A~I代表1~9的数字,不同的字母代表不同的数字。
比如: 6+8/3+952/714 就是一种解法, 5+3/1+972/486 是另一种解法。
这个算式一共有多少种解法?
注意:你提交应该是个整数,不要填写任何多余的内容或说明性文字。
//double型,这种题还是for好用啊!!!!!! #include<stdio.h> int main() { double a, b, c, d, e, f, g, h, i; double t1, t2, t3; int sum = 0; for(a=1; a<=9; a++) { for(b=1; b<=9; b++) { for(c=1; c<=9; c++) { for(d=1; d<=9; d++) { for(e=1; e<=9; e++) { for(f=1; f<=9; f++) { for(g=1; g<=9; g++) { for(h=1; h<=9; h++) { for(i=1; i<=9; i++) { if(a!=b && a!=c && a!=d && a!=e && a!=f && a!=g && a!=h && a!=i) { if(b!=c && b!=d && b!=e && b!=g && b!=h && b!=i && b!=f) { if(c!=d && c!=e && c!=f && c!=g && c!=h && c!=i) { if(d!=e && d!=f && d!=g && d!=h && d!=i) { if(e!=f && e!=g && e!=h && e!=i) { if(f!=g && f!=h && f!=i) { if(g!=h && g!=i) { if(h!=i) { t1 = a; t2 = b/c; t3 = (d*100+e*10+f)/(g*100+h*10+i); if(t1+t2+t3==10) { sum++; printf("%f %f %f %f %f %f %f %f %f\n", a, b, c, d, e, f, g, h, i); printf("%d\n", sum); } } } } } } } } } } } } } } } } } } } //另一种使用DFS的方法 //我有博文专门介绍DFS的,大家可以去看一下 //这里主要是判断结束的条件有点难度 #include<stdio.h> //a b c d e f g h i int a[10]; bool isVisit[10]; int t1, t2, t3, sum=0; void dfs(int num) { if (num == 10) { //让后面两个分数通分 t1 = a[3] * (a[7] * 100 + a[8] * 10 + a[9]); t2 = a[2] * (a[7] * 100 + a[8] * 10 + a[9]); t3 = a[3] * (a[4] * 100 + a[5] * 10 + a[6]); //如果后面两个式子是整数,则满足条件,具体为什么,自己好好想一下 //一个整数肯定是加一个整数才能等于一个整数 if((t2+t3) % t1 == 0){ if(a[1] + ((t2 + t3) / t1) == 10) { sum++; } } } for (int i = 1; i < 10; i++) { if (isVisit[i] == 0) { isVisit[i] = 1; a[num] = i; dfs(num + 1); isVisit[i] = 0; } } } int main() { dfs(1); printf("%d\n", sum); return 0; }第六题
寒假作业
现在小学的数学题目也不是那么好玩的。 看看这个寒假作业:
□ + □ = □ □ - □ = □ □ × □ = □ □ ÷ □ = □
(如果显示不出来,可以参见【图1.jpg】)
每个方块代表1~13中的某一个数字,但不能重复。 比如: 6 + 7 = 13 9 - 8 = 1 3 * 4 = 12 10 / 2 = 5
以及: 7 + 6 = 13 9 - 8 = 1 3 * 4 = 12 10 / 2 = 5
就算两种解法。(加法,乘法交换律后算不同的方案)
你一共找到了多少种方案?
请填写表示方案数目的整数。 注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
//当时第一时间就想到这种办法,但这样要运行很久很久才可以得出答案, 遍历所有可能,但step==13的时候判断条件,满足则SUM++; #include<stdio.h> int book[14], a[14]; int sum = 0; void dfs(int step) { if(step == 13) { if(a[1]+a[2]==a[3] && a[4]-a[5]==a[6] && a[7]*a[8]==a[9] && a[10]/a[11]==a[12]) { sum++; } } for(int i=1; i<=13; i++) { if(book[i] == 0) { book[i] = 1; a[step] = i; dfs(step+1); book[i] = 0; } } } int main() { dfs(1); printf("%d", sum); return 0; } //每循环完一个式子,就判断是否满足条件,如果不满足就跳过,这样可以很快速出答案 #include<stdio.h> int book[14], a[14]; int sum = 0; int judge(int n) { if(n == 3) { if(a[1] + a[2] != a[3]) return 0; } if(n == 6) { if(a[4] - a[5] != a[6]) return 0; } if(n == 9) { if(a[7] * a[8] != a[9]) return 0; } if(n == 12) { if(a[10]%a[11]!=0 || a[10]/a[11]!=a[12]) return 0; sum++; printf("%d + %d = %d\n", a[1],a[2],a[3]); printf("%d - %d = %d\n", a[4],a[5],a[6]); printf("%d * %d = %d\n", a[7],a[8],a[9]); printf("%d / %d = %d\n", a[10],a[11],a[12]); printf("\n\n\n"); } return 1; } void dfs(int step) { for(int i=1; i<=13; i++) { if(book[i] == 0) { book[i] = 1; a[step] = i; if(judge(step) == 0) { book[i] = 0; continue; } dfs(step+1); book[i] = 0; } } } int main() { dfs(1); printf("%d", sum); return 0; }第八题 冰雹数 任意给定一个正整数N, 如果是偶数,执行: N / 2 如果是奇数,执行: N * 3 + 1
生成的新的数字再执行同样的动作,循环往复。
通过观察发现,这个数字会一会儿上升到很高, 一会儿又降落下来。 就这样起起落落的,但最终必会落到“1” 这有点像小冰雹粒子在冰雹云中翻滚增长的样子。
比如N=9 9,28,14,7,22,11,34,17,52,26,13,40,20,10,5,16,8,4,2,1 可以看到,N=9的时候,这个“小冰雹”最高冲到了52这个高度。
输入格式: 一个正整数N(N<1000000) 输出格式: 一个正整数,表示不大于N的数字,经过冰雹数变换过程中,最高冲到了多少。
例如,输入: 10 程序应该输出: 52
再例如,输入: 100 程序应该输出: 9232
//这道题反正我无语 //一个正整数,表示不大于N的数字,经过冰雹数变换过程中,最高冲到了多少。 //表示不大于N的数字,经过冰雹数变换过程中,最高冲到了多少。 //不大于N的数字,最高冲到了多少。 //我的北京啊,无缘啊 #include<stdio.h> int n, MAX=0; void fun(int n) { if(n > MAX) MAX = n; if(n == 1) return; if(n % 2 == 0) { n /= 2; } else { n = n * 3 + 1; } fun(n); } int main() { for(int i=9; i<=100; i++) { printf("%d ", i); fun(i); printf("%d\n", MAX); MAX = 0; } return 0; }卡片换位
你玩过华容道的游戏吗? 这是个类似的,但更简单的游戏。 看下面 3 x 2 的格子
+—+—+—+ | A | * | * | +—+—+—+ | B | | * | +—+—+—+
在其中放5张牌,其中A代表关羽,B代表张飞,* 代表士兵。 还有一个格子是空着的。
你可以把一张牌移动到相邻的空格中去(对角不算相邻)。 游戏的目标是:关羽和张飞交换位置,其它的牌随便在哪里都可以。
输入格式: 输入两行6个字符表示当前的局面
输出格式: 一个整数,表示最少多少步,才能把AB换位(其它牌位置随意)
例如,输入: * A **B
程序应该输出: 17
再例如,输入: A B
程序应该输出: 12
暂时不会,留坑密码脱落
X星球的考古学家发现了一批古代留下来的密码。 这些密码是由A、B、C、D 四种植物的种子串成的序列。 仔细分析发现,这些密码串当初应该是前后对称的(也就是我们说的镜像串)。 由于年代久远,其中许多种子脱落了,因而可能会失去镜像的特征。
你的任务是: 给定一个现在看到的密码串,计算一下从当初的状态,它要至少脱落多少个种子,才可能会变成现在的样子。
输入一行,表示现在看到的密码串(长度不大于1000) 要求输出一个正整数,表示至少脱落了多少个种子。
例如,输入: ABCBA 则程序应该输出: 0
再例如,输入: ABDCDCBABC 则程序应该输出: 3
暂时不会,留坑