编程语言
首页 > 编程语言> > 2015年第六届c/c++ c组真题及解析

2015年第六届c/c++ c组真题及解析

作者:互联网

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