B组C语言Word下载.docx
《B组C语言Word下载.docx》由会员分享,可在线阅读,更多相关《B组C语言Word下载.docx(18页珍藏版)》请在冰豆网上搜索。
a<
=9;
a++)
for(b=0;
b<
b++)
for(c=0;
c<
c++)
for(d=0;
d<
d++)
for(e=0;
e<
e++)
if(a!
=4&
&
b!
c!
d!
e!
=4)
count++;
}
cout<
<
count<
endl;
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
这段代码输三个结果,把每个结果带进去试一下就知道那个是了。
inta,b,c,d,e,f,g;
for(f=0;
f<
f++)
for(g=0;
g<
g++)
if((a*1000+b*100+c*10+d)+(1000+e*100+f*10+b)==(10000+e*1000+c*100+b*10+g))
=1&
f!
=1)
=b&
a!
=c&
=d&
=e&
=f&
=g&
=e&
=g)
1*1000+e*100+f*10+b<
全排列方法:
algorithm>
inta[10];
for(inti=0;
i<
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<
y<
}while(next_permutation(a,a+10));
=======================================================================================
代码填空
第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,效果就不对了。
类似使用说明的代码如下:
cstring>
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。
for(inti=1;
=48;
for(intj=i+2;
j<
j++)
if(1225-i-(i+1)-j-(j+1)==2015-i*(i+1)-j*(j+1))
i<
第7题:
牌型种数
原题:
小明被劫持到X赌城,被迫与其他3人玩牌。
一副扑克牌(去掉大小王牌,共52张),均匀发给4个人,每个人13张。
这时,小明脑子里突然冒出一个问题:
如果不考虑花色,只考虑点数,也不考虑自己得到的牌的先后顺序,自己手里能拿到的初始牌型组合一共有多少种呢?
请填写该整数,不要填写任何多余的内容或说明文字。
这里也是两种方法,暴力搜索,动态规划(DP)。
第一种:
暴力方法:
inta[13];
staticintcount;
intans=0;
for(a[0]=0;
a[0]<
=4;
a[0]++)
for(a[1]=0;
a[1]<
a[1]++)
for(a[2]=0;
a[2]<
a[2]++)
for(a[3]=0;
a[3]<
a[3]++)
for(a[4]=0;
a[4]<
a[4]++)
for(a[5]=0;
a[5]<
a[5]++)
for(a[6]=0;
a[6]<
a[6]++)
{
for(a[7]=0;
a[7]<
a[7]++)
for(a[8]=0;
a[8]<
a[8]++)
for(a[9]=0;
a[9]<
a[9]++)
for(a[10]=0;
a[10]<
a[10]++)
for(a[11]=0;
a[11]<
a[11]++)
for(a[12]=0;
a[12]<
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)
ans=count;
}
ans<
具体参考:
解法二:
动态规划, DP。
假设牌是从1到13按顺序取的,dp[i][j]表示取到第i号的牌,目前总共有j张牌的取法总数,那么有状态转移方程(注意公式没考虑边界处理):
如图:
typedeflonglongLL;
LLdp[14][14];
//dp[i][j]:
当前到第i张牌,总共有j张牌时的解的个数
dp[1][0]=dp[1][1]=dp[1][2]=dp[1][3]=dp[1][4]=1;
for(inti=2;
=13;
i++){
for(intk=0;
k<
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<
dp[13][13]<
endl;
第8题:
计算房子间曼哈顿距离
房子按S形摆放,如
123
654
78……
现输入每行的宽度w,计算出任意两个房子m、n的曼哈顿距离(横向距离+竖向距离)。
直接计算两点的距离就可以了。
cmath>
Fun(intw,intn,int&
x,int&
y)
x=(n-1)/w+1;
y=n%w;