切面条
一根高筋拉面,中间切一刀,可以得到2根面条。
如果先对折1次,中间切一刀,可以得到3根面条。
如果连续对折2次,中间切一刀,可以得到5根面条。 那么,连续对折10次,中间切一刀,会得到多少面条呢?
答案及解析:
0 2
1 3
2 5
10 ?
因为是对折,容易想到和 有关。由归纳法知:对折10次,有 +1 根面条。
大衍数列
中国古代文献中,曾记载过“大衍数列”, 主要用于解释中国传统文化中的太极衍生原理。
它的前几项是:0、2、4、8、12、18、24、32、40、50 …
其规律是:对偶数项,是序号平方再除2,奇数项,是序号平方减1再除2。
以下的代码打印出了大衍数列的前 100 项。
请填补空白处的内容。
#include <stdio.h>
int main()
{
int i;
for (i = 1; i <= 100; i++)
{
if (__________________)
printf("%d ", i * i / 2);
else
printf("%d ", (i * i - 1) / 2);
}
printf("\n");
}
答案及解析:
判断 i 是奇数还是偶数 ,用 % 。
门牌制作
小蓝要为一条街的住户制作门牌号。
这条街一共有 2020 位住户,门牌号从 1 到 2020 编号。
小蓝制作门牌的方法是先制作 0 到 9 这几个数字字符,最后根据需要将字符粘贴到门牌上,例如门牌 1017 需要依次粘贴字符 1、0、1、7,即需要 1 个字符 0,2 个字符 1,1 个字符 7。
请问要制作所有的 1 到 2020 号门牌,总共需要多少个字符 2?
#include <bits/stdc++.h>
using namespace std;
int main()
{
int ans = 0, x;//声明一个计数器ans,和一个整型变量x
for (int i = 1; i <= 2020; i++)// 遍历i从1到2020,i = 2021 时跳出循环
{
x = i;
while (x)//当 x=0 时,跳出循环
{
if(x%10 == 2)// 如果该数个位是2
{
ans++ //ans计数器加一
}
x /= 10; //否则把数除以10,相当于把个位去掉,原来的x十位上的数 变成个位了
________________;
}
}
cout << ans;
return 0;
}
提示:
利用循环将当前数字的每一位求出,分别进行判断即可
答案及解析:
结合题目中的代码,进行判断
方阵转置
问题描述
给定一个n×m矩阵相乘,求它的转置。其中1≤n≤20,1≤m≤20,矩阵中的每个元素都在整数类型(4字节)的表示范围内。
输入格式
第一行两个整数n和m;
第二行起,每行m个整数,共n行,表示n×m的矩阵。数据之间都用一个空格分隔。
输出格式
共m行,每行n个整数,数据间用一个空格分隔,表示转置后的矩阵。
样例输入
2 4
34 76 -54 7
-4 5 23 9
样例输出
34 -4
76 5
-54 23
7 9
请从以下四个选项中选择正确的代码填补空白处,实现方阵转置功能。
提示:
对一个方阵转置,就是把原来的行号变列号,原来的列号变行号
#include <bits/stdc++.h>
using namespace std;
int main()
{
int m, n;//n是行,m是列
int a[20][20];
int i, j;
cin >> m >> n;//输入原数组行数,列数
for (i = 0; i < m; i++)//遍历列数, i=m时跳出循环
{
for (j = 0; j < n; j++)//遍历行数,j=n时跳出循环
{
cin >> a[j][i];//把输入的数字存到原数组里去
}
}
__________________;//把原来的行号变列号,原来的列号变行号
return 0;
}
答案及解析:
微生物增殖
假设有两种微生物 X 和 Y
X出生后每隔3分钟分裂一次(数目加倍),Y出生后每隔2分钟分裂一次(数目加倍)。
一个新出生的X,半分钟之后吃掉1个Y,并且,从此开始,每隔1分钟吃1个Y。
现在已知有新出生的 X=10, Y=89,求60分钟后Y的数目。
如果X=10,Y=90呢?
本题的要求就是写出这两种初始条件下,60分钟后Y的数目。
以下程序实现了这一功能,请你补全空白处内容:
提示:
分析可知,Y分别会在0.5,1.5,2.5······时被吃,所以,把60分钟分成120份
,则在除以2余数为1时,Y的数目减少X个。
#include <iostream>
using namespace std;
int main()
{
int x = 10, y = 90;
for (int i = 1; i <= 120; i++)
{
________________;
}
cout << y << endl;
}
解析:120份,一份半分钟, Y分别会在0.5,1.5,2.5······时被吃,就是第一个半分钟被吃,第三个半分钟被吃,第五个半分钟被吃。相当于 i 从 1 到 120 ,奇数项时y被吃,问题转换成 如何判断奇数项 ,i % 2 ==1
x 三分钟加倍,就是六份半分钟。 问题转化成找 6 的倍数。即 i能被4整除。
y 两分钟加倍,就是四份半分钟。问题转化成找 4 的倍数。即i能被6整除。
成绩统计
问题描述
编写一个程序,建立了一条单向链表,每个结点包含姓名、学号、英语成绩、数学成绩和C++成绩,并通过链表操作平均最高的学生和平均分最低的学生并且输出。
输入格式
输入n+1行,第一行输入一个正整数n,表示学生数量;接下来的n行每行输入5个数据,分别表示姓名、学号、英语成绩、数学成绩和C++成绩。注意成绩有可能会有小数。
输出格式
输出两行,第一行输出平均成绩最高的学生姓名。第二行输出平均成绩最低的学生姓名。
样例输入
2
yx1 1 45 67 87
yx2 2 88 90 99
样例输出
yx2
yx1
提示: 类似冒泡法求最大值最小值
#include <bits/stdc++.h>
using namespace std;
int main()
{
struct student //定义结构体student
{
string xm; //属性 姓名
int xh; //属性 学号
double yy; // 属性 英语
double sx; // 属性 数学
double cpp; //属性 c++
};
student a[1000]; //定义结构体的类型 确定用数组类型来储存数据 并且给分配足够的空间
int n;
double sum = 0, min = 301, max = 0;
string mins, maxs;
cin >> n;
for (int i = 0; i < n; i++)//有几个人就输入几遍
{
cin >> a[i].xm >> a[i].xh >> a[i].yy >> a[i].sx >> a[i].cpp;
sum = a[i].yy + a[i].sx + a[i].cpp; //往数组里输入数据
__________________;//如果当前比最小的小,就把当前的值给最小。如果当前比最大的大,就把当前的值给最大。
}
cout << maxs << endl
<< mins;
return 0;
星系炸弹
在X星系的广袤空间中漂浮着许多X星人造“炸弹”,用来作为宇宙中的路标。
每个炸弹都可以设定多少天之后爆炸。
比如:阿尔法炸弹2015年1月1日放置,定时为15天,则它在2015年1月16日爆炸。
有一个贝塔炸弹,2014年11月9日放置,定时为1000天,请你计算它爆炸的准确日期。
以下程序实现了这一功能,请你填补空白处内容:
提示: json
先判断是否为闰年,这会影响2月份是28还是29,如果是闰年,2月份是29,如果不是,就是28
能被400整除,或者能被4整除但不能被100整除的都是闰年,其余的年份均为平年
#include <stdio.h>
int main()
{
int monthDays[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int days = 1000;
int year = 2014, month = 11, day = 9;
int i;
for (i = 0; i < days; i++) //i是天数,i = 1000 时跳出循环
{
day++;
if (day > monthDays[month - 1])//如果day大于当前月的天数
{
day = 1; // 就把day重置为1
month++; // 月份加一
if (month > 12) //如果月份大于12
{
month = 1; //月份重置为1
year++; //年数增加1
____________________;
}
}
}
printf("%d-%d-%d\n", year, month, day);
getchar();
return 0;
}
答案及解析:
能被400整除,或者能被4整除但不能被100整除的都是闰年,其余的年份均为平年
特别数的和
题目描述
小明对数位中含有 2、0、1、9 的数字很感兴趣(不包括前导 0),在 1 到 40 中这样的数包括 1、2、9、10 至 32、39 和 40,共 28 个,他们的和是 574。
请问,在 1 到 n 中,所有这样的数的和是多少?
输入格式
共一行,包含一个整数 n。
输出格式
共一行,包含一个整数,表示满足条件的数的和。
数据范围
1≤n≤10000
输入样例:
40
输出样例:
574
以下代码实现了这一功能,请你填补空白处的内容:
提示:只要利用模除找出含有2,0,1,9的数即可
#include <iostream>
using namespace std;
int ans, n;
bool check(int n)
{
while (n)
{
int tmpn = n % 10;
if (tmpn == 2 || tmpn == 0 || tmpn == 1 || tmpn == 9)
return true;
____n/=10______________;
}
return false;
}
int main()
{
cin >> n;
for (int i = 1; i <= n; i++)
{
if (check(i))
ans += i;
}
cout << ans << endl;
return 0;
}
答案及解析: