一.报纸页数
X星球日报和我们地球的城市早报是一样的,
都是一些单独的纸张叠在一起而已。每张纸印有4版。
比如,某张报纸包含的4页是:5,6,11,12,
可以确定它应该是最上边的第2张报纸。
我们在太空中捡到了一张X星球的报纸,4个页码分别是:
1125,1126,1727,1728
请你计算这份报纸一共多少页(也就是最大页码,并不是用了几张纸哦)?
请填写表示总页数的数字。
思路:
假设有三张报纸,则每张报纸分别为{1,2,11,12},{3,4,9,10},{5,6,7,8}
所以最大页码为 12+1-1 10+3-1 8+5-1
所以max+min-1;即1728+1125-1=2852
二.煤球数目
有一堆煤球,堆成三角棱锥形。具体:
第一层放1个,
第二层3个(排列成三角形),
第三层6个(排列成三角形),
第四层10个(排列成三角形),
…
如果一共有100层,共有多少个煤球?
请填表示煤球总数目的数字。
思路:
题目为:1+(1+2)+(1+2+3)+….+(1+2+…+100)=?
可用代码进行计算。
int main(){
int i,j,sum1=0,sum2=0;
for(i=1;i<=100;i++){ //一共100层,加100次
sum1=0;
for(j=1;j<=i;j++){ //每一层总的个数
sum1+=j;
}
sum2+=sum1;
}
printf("%d",sum2);
return 0;
}
运行结果:171700
三.平方怪圈
如果把一个正整数的每一位都平方后再求和,得到一个新的正整数。
对新产生的正整数再做同样的处理。
如此一来,你会发现,不管开始取的是什么数字,
最终如果不是落入1,就是落入同一个循环圈。
请写出这个循环圈中最大的那个数字。
请填写该最大数字。
思路: 如以下代码
int main(){
int a=135,a1=0,s=0;
while(1){//a的循环圈
a1=0;
while(a>0){//把一个正整数的每一位都平方后再求和,得到一个新的正整数。
a1=a1+(a%10)*(a%10);
a=a/10;
}
a=a1;
if(s==a1) break;
else if(s<a1)
s=a1;
}
printf("%d\n",s);
return 0;
}
运行结果:145
四.打印方格
小明想在控制台上输出 m x n 个方格。
比如 10x4的,输出的样子是:
#include <stdio.h>
//打印m列,n行的方格
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;
}
注意:仅仅填写划线部分缺少的内容,不要添加任何已有内容或说明性文字。
填空内容: for(col=0;col<m;col++) printf("—+")
具体分析:
void f(int m, int n){
int row,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("+---")
for(col=0;col<m;col++) printf("---+"); //填空
printf("\n");
}
五. 快速排序
排序在各种场合经常被用到。快速排序是十分常用的高效率的算法。
其思想是:先选一个“标尺”,用它把整个队列过一遍筛子,
以保证:其左边的元素都不大于它,其右边的元素都不小于它。
这样,排序问题就被分割为两个子区间。再分别对子区间排序就可以了。
下面的代码是一种实现,请分析并填写划线部分缺少的代码。
#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);
具体:
int partition(int a[], int p, int r){
//一趟快速排序的思想, p,r为排序区间上下限,x作为标志元素-标尺
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); //前面的大和后面的小交换
}
swap(a,p,j);//填空 // 将最后一次移动中小于标尺的j元素和标尺互换
return j;
}
六. 凑算式
这个算式中AI代表19的数字,不同的字母代表不同的数字。比如:
6+8/3+952/714 就是一种解法,
5+3/1+972/486 是另一种解法。
这个算式一共有多少种解法?
注意:你提交应该是个整数,不要填写任何多余的内容或说明性文字。
思路:
- 暴力
- 深度优先搜寻:思路:在1~9的全排列中找符合条件的等式
#include<iostream>
using namespace std;
int ans=0,num[9];//ans=答案
int v[10];//标记是否使用过
void judge(){//判断条件
if((num[0]+(double)num[1]/num[2]+(double)(num[3]*100+num[4]*10+num[5])/(num[6]*100+num[7]*10+num[8]))==10)
ans++;
return;
}
void dfs(int i){//i为num[]的第i位
if(i==8+1){//i==8+1表示num数组中的前8个已经放置好数字
judge();
return;
}
for(int j=1;j<10;j++){
if(v[j]==0){//判断数字是否使用过
v[j]=1;
num[i]=j;
dfs(i+1);//进行下一个数字的放置
v[j]=0;//回溯,当满足一种全排列后,进行下一种尝试
}
}
}
int main(){
dfs(0);
cout<<ans<<endl;
return 0;
}