C语言蓝桥杯,第十一届蓝桥杯c语言b组解析
在的第一篇博文中
你好,我是一只小鸟,欢迎阅读。有什么问题可以和我交流,喜欢我,关注我。
在进行归纳推理时,如果对某些事件的所有可能情况逐一进行调查,得出一个总的结论,那么这个结论就是可靠的。这种归纳方法叫做枚举法。
枚举法又称暴力法,是一种基于逐一尝试答案的解题策略。刚开始接触算法的时候,我们练习的基本算法都是关于枚举算法的,比如打印出9 * 9的乘法表,求水仙花的个数,求素数等等。像这样的问题就是在一定范围内寻找符合条件的答案。算法的核心思想是:列举所有可能的年龄猜测问题的描述:美国数学家N维纳(N.Wiener)早熟,11岁上大学。1935年至1936年,他应邀在中国清华大学讲学。有一次,他参加一个重要会议,年轻的面孔引人注目。于是有人问他年龄,他回答:“我年龄的立方是四位数。我的年龄的四次方是一个六位数。这10个数字正好包含从0到9的10个数字,每个数字出现一次。”请计算一下他那时有多年轻。直接提交他当时的年龄数据。
分析:通过暴力方法,求年龄的大概范围,假设他的年龄是X,103=1000,304=8100,说明X的范围在[10,30]之间。
int main(){
for(int I=10;i=30我)
{
printf(%d=%.0f %.0f\n ,I,pow(i,3),pow(i,4));//pow是指I的立方和I的四次方。
}
返回0;
}
网友年龄问题描述:某君认识一个新网友。当被问到年龄时,他的网友说:“我的年龄是两位数,比我儿子大27岁。
如果把我年龄的两位数换一下,就只是我儿子的年龄了。"
请计算一下:网民的年龄有多少种可能的情况?
提示:30岁是可能性之一。
请填写表示可能情况的物种数量。
解析:网友年龄比儿子大27岁,说明网友至少27岁,也就是初始值27,两位数最多99,范围是[27,99]。假设网友的年龄是I,a位数字是B,十位数字是10*a,他的年龄数字的交换正好是他儿子的年龄,所以他儿子的年龄是10*b a,判断条件是
#包含stdio.h
#包含数学. h
int main()
{
int i,a,b,son,sum=0;
for(I=27;i 100i ){
a=I/10;
b=i;//比如41把10除以4,10得1,就是他儿子14岁。
son=(b * 10)a;
if(27==i-son){
printf(%d\n ,I);
总和;
}
}
Printf(有%d种可能性\n ,sum);
返回0;
}
30
41
五十二个
63
74
八十五
96
生日的数目有7种可能。描述:某君从某年开始每年都要举办生日聚会,每次都要吹灭同岁的蜡烛数。现在,他已经吹灭了236支蜡烛。
请问,他几岁开始过生日?
请输入他开始生日聚会的年龄。
注意:你的输出应该是整数,不要输出任何多余的内容或说明文字。
投入
没有输入。
输出
输出一个整数,即某君开始生日聚会的年龄数。
给个提示
用printf或cout输出答案。
解析:假设I是初龄,J是终龄,J一定大于I,那么J=I 1,K是多少根蜡烛!暴力累积。
int main()
{
for(int I=1;i=100我)
{
for(int j=I 1;j=100j)
{
int sum=0;
for(int k=I;k=j;k ){
sum=k;
}
if(sum==236)
printf(%d ,I);
}
}
返回0;
}
数学问题描述:有限的五位数
一位数为6且能被3整除的五位数有多少个?
分析:首先分析5位数的范围[10000,9999],6的个位数表示至少两位数,取3的余数,累加ans。
#包含stdio.h
#包含stdlib.h
int main() {
int ans=0;
for(int I=10000;i=99999i ){
if((I * 10 ^ 6)% 3==0){
ans
}
}
Printf(有%d个可被3整除,ans);
返回0;
}
小明,一个粗心的公式,是个急性子。他上小学的时候,经常把老师写在黑板上的题抄错。有一次,老师给题:36 x 495=?但是他抄了:396 x 45=?但结果很戏剧性,他的答案是对的!因为36 * 495=396 * 45=1782可能有很多相似的巧合,比如:27* 594=297 * 54。
假设a b c d e表示从1到9的五个不同的数(注意是不同的数,不包含0)
有几个公式可以满足形式ab * cde=adb* ce?请利用计算机的优势,找出所有的可能性,并回答不同公式的类型数。
满足乘换定律的公式算作不同种类,所以答案一定是偶数。
答案直接通过浏览器提交。注:只提交一个表示最终统计类别的数字,不要提交求解过程或其他多余的内容。
解析:假设a b c d e用1到9不同的数字表示五个数,a b c d e的取值范围为[1,9]。ans累计法累计多少个结果?通过判断条件ab*cde=adb*ce满足条件,累加1,然后有A和B相等的可能,所以判断A不等于B,其他字母也一样。
#包含stdio.h
int main(){
int ans=0,m,n;
for(int a=1;a=9;a ){
for(int b=1;b=9;b ){
for(int c=1;c=9;c ){
for(int d=1;d=9;d ){
for(int e=1;e=9;e ){
m=(a * 10 b)*(c * 100d * 10 e);
n=(a * 100d * 10 b)*(c * 10 e);
if(m==n a!=b a!=c a!=d a!=e b!=c b!=d b!=e c!=d c!=e d!=e){
ans
}
}
}
}
}
}
Printf(共%d ,ans);
返回0;
}
奇怪的分数问题描述:
小学的时候,小明经常自己发明新的算法。有一次,老师的问题是:1/4乘以8/5。小明其实是把分子拼接在一起,分母拼接在一起。答案是:18/45。老师刚想批评他,可转念一想,这个答案正好对。真见鬼!
还有哪些公式可以用来计算1到9的个位数的分子和分母?请写出所有不同公式的编号(包括问题中的例子)。
很明显,把分子和分母交换后,比如4/1乘以5/8就可以满足要求,可以算作不同的公式。
但是对于同样的分子和分母,2/2乘以3/3的类型太多了,数不过来!
注意:答案是整数(考虑到对称性,必须是偶数)。
请通过浏览器提交。不要写多余的内容。
其实和上一个差不多。找出范围、判断条件和不符合条件,并使用累积ans。
* *注意不能用(a/b)\ *(c/d)==((a \ * 10c)/b \ * 10d))* *,要用数学中的十字乘法。
#包含stdio.h
int main(){
int ans=0;
for(int a=1;a=9;a ){
for(int b=1;b=9;b ){
for(int c=1;c=9;c ){
for(int d=1;d=9;d ){
如果(a==b c==d)
继续;
int e=a*10 c,f=b * 10d;
if(a*c*f==b*d*e){
ans
}
}
}
}
}
printf(%d ,ans);
返回0;
}
几何蓝有一个超大的仓库,可以装很多货。现在,小兰有N箱货物要放在仓库里,每箱货物都是一个正立方体。蓝色表示相互垂直的三个方向:长、宽、高。每箱货物的侧面必须严格平行于长度、宽度和高度。小蓝希望所有的货物最后都能放进一个大立方体里。即L、W、H的货物分别按长、宽、高方向堆放,满足N=L W H的要求,给定N,有多少种堆放方案能满足要求?
比如当n=4时,有6种方案:1 1 4,1 2 2,1 4 1,2 1 2,2 2 1,4 1 1。
请问当n=2021041820210418(注意是16位)时,总共有几个方案?
提示:建议用电脑编程解决问题。
解析:循环暴力枚举的解决方案理论上是可能的,但不可行。换个思路把整数的所有原因(近似值)分解,然后把所有因子暴力的双循环都枚举出来算结果。
#包含stdio.h
int judge(龙龙a,龙龙b,龙龙c)
{
If(a==b==c)//对于长度、宽度和高度的相同排列,只有一种组合
返回1;
if(a==b a!=ca==c a!=bb==c a!=b) //长宽高任意两个相同的排列只有3种。
返回3;
其他
返回6;//长宽高都不一样。只有6种排列
}
int mian()
{
龙龙n=2021041820210418
long long L,W,H;
long long ans=0;
for(L=1;L * L * L=n;L) //l是最小的一方。
{
If(n%L==0)//小优化
{
for(W=L;l * W * W=n;W )//l是第二大党,次数多。
{
If(n%(L*W)==0)//小优化
{
h=n/L/W;
if(H=W){
ans=judge(L,W,H);
}
}
}
}
}
printf(%d ,ans);
}
,转载请联系作者取得转载授权,否则将追究法律责任。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。