B组C语言.docx
- 文档编号:3706367
- 上传时间:2022-11-24
- 格式:DOCX
- 页数:18
- 大小:42.94KB
B组C语言.docx
《B组C语言.docx》由会员分享,可在线阅读,更多相关《B组C语言.docx(18页珍藏版)》请在冰豆网上搜索。
B组C语言
第一题:
第1题:
统计不含4的数字
题目大意
统计10000至99999中,不包含4的数值个数。
解题分析:
第一种解法:
数学方法,这种是在网上看到的一种解法:
最高位除了0、4不能使用,其余8个数字(1,2,3,5,6,7,8,9)均能使用,剩下的四位(千位、百位、十位、个位)
可以使用除了4以外的所有数字,所以共有8*9*9*9*9种解,
计算得答案为:
52488。
第二种解法:
暴力搜索方法,这个数字的位数共有5位因此,可以设置a,b,c,d,e,分别代表这5位。
代码:
#include
#include
usingnamespacestd;
intmain()
{
inta,b,c,d,e;
intcount=0;
for(a=1;a<=9;a++)
{
for(b=0;b<=9;b++)
{
for(c=0;c<=9;c++)
{
for(d=0;d<=9;d++)
{
for(e=0;e<=9;e++)
{
if(a!
=4&&b!
=4&&c!
=4&&d!
=4&&e!
=4)
{
count++;
}
}
}
}
}
}
cout< return0; } 输出为: 52488 第2题: 计算1千天后的日期 题目大意 2014-11-09再过1000天是哪一日? 解题分析: 我想这里题目,对于大家来说分析的时候难点就在于那年是闰年,那年是平年 那么从2014到2017年之间2016年是闰年,因此这一年就是365天, 这道题,我是手算的。 答案是: 2017-08-05 重点是要按照格式提交。 第3题: 竖式加法 题目大意 祥瑞生辉 三羊献瑞 ? ? ? ? ? ? ? ? 三羊生瑞气 题目用了8个不同的汉字,表示0~9里八种不同的数字。 组成两个数值相加,等于第三个数值。 求三羊献瑞”对应到数字是多少? 解题分析: 第一种暴力搜索: 我假设结果中进位的是1,那么三对应的就是数字1. 接下来定义变量。 abcd +1 e f b ------------------ 1ecbg 代码: 这段代码输三个结果,把每个结果带进去试一下就知道那个是了。 #include #include usingnamespacestd; intmain() { inta,b,c,d,e,f,g; for(a=1;a<=9;a++) { for(b=0;b<=9;b++) { for(c=0;c<=9;c++) { for(d=0;d<=9;d++) { for(e=0;e<=9;e++) { for(f=0;f<=9;f++) { for(g=0;g<=9;g++) { if((a*1000+b*100+c*10+d)+(1000+e*100+f*10+b)==(10000+e*1000+c*100+b*10+g)) { if(a! =1&&b! =1&&c! =1&&d! =1&&e! =1&&f! =1) { if(a! =b&&a! =c&&a! =d&&a! =e&&a! =f&&a! =g&&b! =c&&b! =d&&b! =e&&b! =f&&b! =g&&c! =d&&c! =e&&c! =f&&c! =g&&d! =e&&d! =f&&d! =g&&e! =f&&e! =g&&f! =g) { cout<<1*1000+e*100+f*10+b< } } } } } } } } } } return0; } 第二种解法: 全排列方法: 代码: #include #include #include usingnamespacestd; intmain() { inta[10]; for(inti=0;i<=9;i++) { a[i]=i; } do { if(! a[2]||! a[6]) continue; intx=a[2]*1000+a[3]*100+a[4]*10+a[5]; inty=a[6]*1000+a[7]*100+a[8]*10+a[3]; intz=a[6]*10000+a[7]*1000+a[4]*100+a[3]*10+a[9]; if(x+y==z) cout< }while(next_permutation(a,a+10)); return0; } ======================================================================================= 代码填空 ======================================================================================= 第4题: 古怪的星号修饰符 题目大意 是道代码填空题,主要是完成一个字符串s,按宽度width截断后,在固定宽度为width,两边为符号’|’的居中输出。 难点是题目给出了printf(“%*s%s%*s”,___),要求填printf的实参列表。 这道题看的时候觉得有点坑,因为自己不懂printf("%*s%s%*s",);;的意思,我开始还以为是指针那一块的。 现在把网上的给大家分享: 有些童鞋可能知道scanf里用*修饰符,是起到过滤读入的作用。 比如一个有三列数值的数据,我只想得到第2列数值,可以在循环里用scanf(“%*d%d%*d”,a[i])来读入第i行的第2个数值到a[i]。 *修饰符在printf中的含义完全不同。 如果写成printf(“%6d”,123),很多童鞋应该就不会陌生了,这是设置域宽的意思。 同理,%6s也是域宽。 *修饰符正是用来更灵活的控制域宽。 使用%*s,表示这里的具体域宽值由后面的实参决定,如printf(“%*s”,6,“abc”)就是把”abc”放到在域宽为6的空间中右对齐。 明白了*是用变量来控制域宽,那么这题就简单了,这里应该填写5个实参。 然后字符长度的计算应该用buf而不是s,因为buf才是截断后的长度,用s的话,如果s长度超过了width-2,效果就不对了。 类似使用说明的代码如下: #include #include #include usingnamespacestd; intmain(){ chars[100]="abcd1234"; charbuf[1000]; intwidth=20; strcpy(buf,s); buf[width-2]=0; printf("|%*s%s%*s|\n",(width-strlen(buf)-2)/2,"",buf,(width-strlen(buf)-2)/2,""); return0; } 第5题: 补充全排列的回溯算法 题目大意 1,2,3…9这九个数字组成一个分数,其值恰好为1/3,如何组法? 与第3题一样可以用全排列暴力,但这题是代码填空题,且已经手写一部分全排列算法,我们负责补充其中一行代码。 写全排就是用回溯的思想,直接猜到for循环里的第三行,应该就是把第一行的交换操作再交换回来~~复制for里的第一行代码,运行下程序,还不放心就调试下,看看数组是不是有按字典序在变化就行了。 答案: {t=x[k];x[k]=x[i];x[i]=t;} ====================================================================================== 填空 ======================================================================================= 第6题: 加号改乘号 题目大意 把1+2+3+…+48+49中的两个加号改成乘号(修改位置不能相邻),使得式子的结果由1225变为2015。 解题分析: 用双循环暴力两个乘号的位置,计算在数字i、j后的加号改为乘号,式子数值的变化即可,注意j的起始位置为i+2。 代码: #include #include usingnamespacestd; intmain() { for(inti=1;i<=48;i++) { for(intj=i+2;j<=48;j++) { if(1225-i-(i+1)-j-(j+1)==2015-i*(i+1)-j*(j+1)) cout< } } return0; } 第7题: 牌型种数 题目大意 原题: 小明被劫持到X赌城,被迫与其他3人玩牌。 一副扑克牌(去掉大小王牌,共52张),均匀发给4个人,每个人13张。 这时,小明脑子里突然冒出一个问题: 如果不考虑花色,只考虑点数,也不考虑自己得到的牌的先后顺序,自己手里能拿到的初始牌型组合一共有多少种呢? 请填写该整数,不要填写任何多余的内容或说明文字。 解题分析: 这里也是两种方法,暴力搜索,动态规划(DP)。 第一种: 暴力方法: #include #include usingnamespacestd; intmain() { inta[13]; staticintcount; intans=0; for(a[0]=0;a[0]<=4;a[0]++) { for(a[1]=0;a[1]<=4;a[1]++) { for(a[2]=0;a[2]<=4;a[2]++) { for(a[3]=0;a[3]<=4;a[3]++) { for(a[4]=0;a[4]<=4;a[4]++) { for(a[5]=0;a[5]<=4;a[5]++) { for(a[6]=0;a[6]<=4;a[6]++) { for(a[7]=0;a[7]<=4;a[7]++) { for(a[8]=0;a[8]<=4;a[8]++) { for(a[9]=0;a[9]<=4;a[9]++) { for(a[10]=0;a[10]<=4;a[10]++) { for(a[11]=0;a[11]<=4;a[11]++) { for(a[12]=0;a[12]<=4;a[12]++) { if(a[0]+a[1]+a[2]+a[3]+a[4]+a[5]+a[6]+a[7]+a[8]+a[9]+a[10]+a[11]+a[12]==13) { count++; ans=count; } } } } } } } } } } } } } } cout< return0; } 具体参考: 解法二: 动态规划, DP。 假设牌是从1到13按顺序取的,dp[i][j]表示取到第i号的牌,目前总共有j张牌的取法总数,那么有状态转移方程(注意公式没考虑边界处理): 如图: 代码: #include #include usingnamespacestd; typedeflonglongLL; LLdp[14][14];//dp[i][j]: 当前到第i张牌,总共有j张牌时的解的个数 intmain(){ dp[1][0]=dp[1][1]=dp[1][2]=dp[1][3]=dp[1][4]=1; for(inti=2;i<=13;i++){ for(intk=0;k<=13;k++){ if(k-4>=0)dp[i][k]+=dp[i-1][k-4]; if(k-3>=0)dp[i][k]+=dp[i-1][k-3]; if(k-2>=0)dp[i][k]+=dp[i-1][k-2]; if(k-1>=0)dp[i][k]+=dp[i-1][k-1]; dp[i][k]+=dp[i-1][k]; } } cout< return0; } 第8题: 计算房子间曼哈顿距离 题目大意 房子按S形摆放,如 123 654 78…… 现输入每行的宽度w,计算出任意两个房子m、n的曼哈顿距离(横向距离+竖向距离)。 解题分析: 直接计算两点的距离就可以了。 代码: #include #include #include usingnamespacestd; Fun(intw,intn,int&x,int&y) { x=(n-1)/w+1; y=n%w;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言