2015年第六届c/c++ c组真题及解析
作者:互联网
- 由于博主刚上大一初学c语言2月知识经验不足,所以以下题解方法多采用暴力破解法,如有不足欢迎大家在评论区指出。
1. 隔行变色
Excel表的格子很多,为了避免把某行的数据和相邻行混淆,可以采用隔行变色的样式。
小明设计的样式为:第1行蓝色,第2行白色,第3行蓝色,第4行白色,…
现在小明想知道,从第21行到第50行一共包含了多少个蓝色的行。
请你直接提交这个整数,千万不要填写任何多余的内容。
题解思路:利用数学方法直接计算
#include<stdio.h>
int main()
{
printf("%d",(50-21)/2+1);
return 0;
}
结果:15
2.立方尾不变
有些数字的立方的末尾正好是该数字本身。
比如:1,4,5,6,9,24,25,…
请你计算一下,在10000以内的数字中(指该数字,并非它立方后的数值),符合这个特征的正整数一共有多少个。
请提交该整数,不要填写任何多余的内容。
题解思路:求出该数位数后对其立方数进行求尾数
#include<stdio.h>
#include<math.h>
int main()
{
long long i,cnt=0;
for(i=1;i<=10000;i++){
long long c,b,a=0,d=0;
double g,f;
c=i*i*i;
for(b=i;b>0;b/=10) a++; //计算i是几位数
g=a*1.0;
f=pow(10.0,g);
int p;
p=c%(int)f; //保留后a位数
if(p==i) {
printf("%d\t",i);
cnt++;
}
}
printf("\n");
printf("共有%d个数",cnt);
return 0;
}
结果:36
3.三羊献瑞
观察下面的加法算式:
祥 瑞 生 辉
- 三 羊 献 瑞
三 羊 生 瑞 气
其中,相同的汉字代表相同的数字,不同的汉字代表不同的数字。
请你填写“三羊献瑞”所代表的4位数字(答案唯一),不要填写任何多余内容。
题解思路:易得三==1 遍历所有可能性 暴力破解
int a,b,c,d,e=1,f,g,h; /*a:祥 b:瑞 c:生 d:辉 e:三 f:羊 g:献 h:气 */
int sum1,sum2,sum;
for(a=1;a<10;a++){
for(b=0;b<10;b++){
for(c=0;c<10;c++){
for(d=0;d<10;d++){
for(f=0;f<10;f++){
for(g=0;g<10;g++){
for(h=0;h<10;h++){
sum1=a*1000+b*100+c*10+d;
sum2=1*1000+f*100+g*10+b;
sum=1*10000+f*1000+c*100+b*10+h;
if(sum==sum1+sum2 && a!=b && a!=c && a!=d && a!=e
&& a!=f && a!=g && a!=h && b!=c&&b!=d&&b!=e&&b!=f
&&b!=g&&b!=h && c!=d&&c!=e&&c!=f&&c!=g&&c!=h
&& d!=e&&d!=f&&d!=g&&d!=h&&e!=f&&e!=g&&e!=h
&&f!=g&&f!=h&&g!=h) printf("%d%d%d%d",e,f,g,b);
}
}
}
}
}
}
}
结果:1085
4. 格子中输出
StringInGrid函数会在一个指定大小的格子中打印指定的字符串。
要求字符串在水平、垂直两个方向上都居中。
如果字符串太长,就截断。
如果不能恰好居中,可以稍稍偏左或者偏上一点。
下面的程序实现这个逻辑,请填写划线部分缺少的代码。
题解思路:
根据代码很容易得到填空中应填方框中要打印的部分
这里要注意%*s,%*s表示这里的具体域宽值由后面的实参决 定,如printf(“%*s”, 6, “abc”)就是把”abc”放到在域宽为6的空间中右对齐。
故题目中应将%s字符串 放置在方框中央则两侧%*s应控制两侧宽度。
#include <stdio.h>
#include <string.h>
void StringInGrid(int width, int height, const char* s)
{
int i,k;
char buf[1000];
strcpy(buf, s); //strcpy把含有'\0'结束符的字符串复制到另一个地址空间,返回值的类型为char*
if(strlen(s)>width-2) buf[width-2]=0; //控制宽
printf("+");
for(i=0;i<width-2;i++) printf("-");
printf("+\n");
for(k=1; k<(height-1)/2;k++){
printf("|");
for(i=0;i<width-2;i++) printf(" "); //上框
printf("|\n");
}
printf("|");
printf("%*s%s%*s",(width-strlen(buf)-2)/2,"",buf,(width-strlen(buf)-2)/2,""); //填空 *s是("%*s",6,"abc")将abc放在6域宽中右对齐 打印 abcd123
printf("|\n");
for(k=(height-1)/2+1; k<height-1; k++){
printf("|");
for(i=0;i<width-2;i++) printf(" "); //下框
printf("|\n");
}
printf("+");
for(i=0;i<width-2;i++) printf("-");
printf("+\n");
}
int main()
{
StringInGrid(20,6,"abcd1234");
return 0;
}
结果:(width-strlen(buf)-2)/2,"",buf,(width-strlen(buf)-2)/2,"")
5. 串逐位和
给定一个由数字组成的字符串,我们希望得到它的各个数位的和。
比如:“368” 的诸位和是:17
这本来很容易,但为了充分发挥计算机多核的优势,小明设计了如下的方案:
题解思路:递归+二分
#include<stdio.h>
int f(char s[], int begin, int end) //数 0 数组元素个数
{
int mid;
if(end-begin==1) return s[begin] - '0';
mid = (end+begin) / 2;
return f(s,begin,mid)+f(s,mid,end); //填空 递归分两组逐位求和
}
int main()
{
char s[] = "4725873285783245723";
printf("%d\n",f(s,0,strlen(s)));
return 0;
}
结果:f(s,begin,mid)+f(s,mid,end);
6. 奇妙的数字
小明发现了一个奇妙的数字。它的平方和立方正好把0~9的10个数字每个用且只用了一次。
你能猜出这个数字是多少吗
题解思路:将其平方与立方的每位数算出枚举法求出符合要求的数。
#include<stdio.h>
int hight(int l);
int main()
{
int i;
for(i=10;i<100;i++){
int q=i*i,cnt,cnt1,f=1;
int k=hight(q);
int d[k];
for(cnt=0;cnt<k;cnt++){
d[cnt]=q%10;
q/=10;
}
int w=i*i*i;
int e=hight(w);
int g[e];
for(cnt=0;cnt<e;cnt++){
g[cnt]=w%10;
w/=10;
}
for(cnt=0;cnt<k-1;cnt++){
for(cnt1=cnt+1;cnt1<k;cnt1++){
if(d[cnt]==d[cnt1]) f=0; //计算单个数组中是否有重复元素
}
}
if(f==1){
for(cnt=0;cnt<e-1;cnt++){
for(cnt1=cnt+1;cnt1<e;cnt1++){
if(g[cnt]==g[cnt1]) f=0;
}
}
}
if(e+k==10 && f==1){ //判断是否共用了10个数
for (cnt=0;cnt<k;cnt++){
for (cnt1=0;cnt1<e;cnt1++){
if (d[cnt]==g[cnt1]){
f=0; //判断两数组中是否有重复元素
break;
}
}
if(f==0) break;
}
if(f)printf("%d\t",i);
}
}
return 0;
}
int hight(int l)
{
int p=0;
while(l>0){ //计算元素个数
l/=10;
p++;
}
return p;
}
结果:69
7.加法变乘法
我们都知道:1+2+3+ … + 49 = 1225
现在要求你把其中两个不相邻的加号变成乘号,使得结果为2015
比如:
1+2+3+…+1011+12+…+2728+29+…+49 = 2015
就是符合要求的答案。
请你寻找另外一个可能的答案,并把位置靠前的那个乘号左边的数字提交
题解思路:将题中所给答案改为1+2+3+10+11…+49+1011+2728-10-11-27-18=2015.则较容易设计程序。
#include<stdio.h>
int main()
{
int i,sum=0;
for(i=1;i<50;i++) sum+=i;
for(i=1;i<=46;i++){
int f;
for(f=i+2;f<49;f++){
int k=sum;
k=k+i*(i+1)+f*(f+1)-i-(i+1)-f-(f+1);
if(k==2015) printf("%d\n",i);
}
}
return 0;
}
答案:16
8.饮料换购
乐羊羊饮料厂正在举办一次促销优惠活动。乐羊羊C型饮料,凭3个瓶盖可以再换一瓶C型饮料,并且可以一直循环下去(但不允许暂借或赊账)。
请你计算一下,如果小明不浪费瓶盖,尽量地参加活动,那么,对于他初始买入的n瓶饮料,最后他一共能喝到多少瓶饮料。
输入:一个整数n,表示开始购买的饮料数量(0<n<10000)
输出:一个整数,表示实际得到的饮料数
例如:
用户输入:
100
程序应该输出:
149
用户输入:
101
程序应该输出:
151
资源约定:
峰值内存消耗 < 256M
CPU消耗 < 1000ms
题解思路:每次换购后将剩余瓶盖赋值给一个变量,将每次所得饮料相加。
#include<stdio.h>
int main()
{
int n,l;
scanf("%d",&n);
l=n;
while(n>3){
l+=n/3;
n=n/3+n%3;
}
printf("%d",l);
return 0;
}
9.打印大X
小明希望用星号拼凑,打印出一个大X,他要求能够控制笔画的宽度和整个字的高度。
为了便于比对空格,所有的空白位置都以句点符来代替。
要求输入两个整数m n,表示笔的宽度,X的高度。用空格分开(0<m<n, 3<n<1000, 保证n是奇数)
要求输出一个大X
例如,用户输入:
3 9
程序应该输出:
…
.***…**.
….…
……
……
……
…***.***…
.***…***.
…
(如有对齐问题,参看【图1.jpg】)
再例如,用户输入:
4 21
程序应该输出
…
.….
………
………
………
………
………
………
……
……
……
……
…********…
………
………
………
………
………
………
.….
…
(如有对齐问题,参看【图2.jpg】)
资源约定:
峰值内存消耗 < 256M
CPU消耗 < 1000ms
题解思路:一定 一定 一定要仔细看题中所给的图m为奇偶时,中间图形变换规律不同,将图形分为上下两部分,并将每部分分为中间有点与无点的两种情况并分奇偶进行分析,分别找规律设计代码。
#include<stdio.h>
int main()
{
int m,n,cnt,cnt1=0; //m宽n 高 0<m<n, 3<n<1000, 保证n是奇数
int i,f,a1,a2,a3,a4;
scanf("%d %d",&m,&n);
for(i=0;i<n/2+1;i++){
cnt=0;
for(a1=m-i;a1<m;a1++) printf(".");
for(a2=0;a2<m;a2++) printf("*"); //打印x上半部分
for(a3=i;a3<n-m-1-i;a3++) {
printf(".");
cnt++;}
for(a2=0;a2<m;a2++) printf("*");
for(a1=m-i;a1<m;a1++) printf(".");
if(cnt<3) break;
printf("\n");
}
f=2*m;
cnt=0;
while(f>m){
printf("\n");
i++;
for(a1=m-i;a1<m;a1++) printf(".");
if(cnt==0){
if(m%2==0) f-=0; //中间无点的上半部分
else f-=1;}
else f-=2;
for(a4=0;a4<f;a4++) printf("*");
for(a1=m-i;a1<m;a1++) printf(".");
cnt=1;
cnt1++;
}
f=m;
while(f<2*m){
i--;
f+=2;
cnt1++;
if(f>=2*m && m%2!=0) break;
printf("\n"); //中间无点的下半部分
for(a1=m-i;a1<m;a1++) printf(".");
for(a4=0;a4<f;a4++) printf("*");
for(a1=m-i;a1<m;a1++) printf(".");
}
int p=(n-cnt1)/2;
if(m%2!=0) p+=1;
if(p%2==0) cnt=2; //对m的奇偶行进行讨论
else cnt=1;
cnt1=0;
for(i=p;i>0;i--){
printf("\n");
for(a1=i-1;a1>0;a1--) printf(".");
for(a2=0;a2<m;a2++) printf("*"); //打印下半部分
for(a3=0;a3<cnt;a3++) printf(".");
for(a2=0;a2<m;a2++) printf("*");
for(a1=i-1;a1>0;a1--) printf(".");
cnt1=1;
cnt+=2;
}
return 0;
}
10.垒骰子
赌圣atm晚年迷恋上了垒骰子,就是把骰子一个垒在另一个上边,不能歪歪扭扭,要垒成方柱体。
经过长期观察,atm 发现了稳定骰子的奥秘:有些数字的面贴着会互相排斥!
我们先来规范一下骰子:1 的对面是 4,2 的对面是 5,3 的对面是 6。
假设有 m 组互斥现象,每组中的那两个数字的面紧贴在一起,骰子就不能稳定的垒起来。
atm想计算一下有多少种不同的可能的垒骰子方式。
两种垒骰子方式相同,当且仅当这两种方式中对应高度的骰子的对应数字的朝向都相同。
由于方案数可能过多,请输出模 10^9 + 7 的结果。
不要小看了 atm 的骰子数量哦~
「输入格式」
第一行两个整数 n m
n表示骰子数目
接下来 m 行,每行两个整数 a b ,表示 a 和 b 数字不能紧贴在一起。
「输出格式」
一行一个数,表示答案模 10^9 + 7 的结果。
「样例输入」
2 1
1 2
「样例输出」
544
「数据范围」
对于 30% 的数据:n <= 5
对于 60% 的数据:n <= 100
对于 100% 的数据:0 < n <= 10^9, m <= 36
资源约定:
峰值内存消耗 < 256M
CPU消耗 < 2000ms
本题参考此链接
ps:以上代码均在devc++编译环境下运行
标签:10,组真题,cnt1,int,cnt,c++,&&,printf,2015 来源: https://blog.csdn.net/qq_34058342/article/details/110028786