ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2020-11-24 14:32:32  阅读:230  来源: 互联网

标签:10 组真题 cnt1 int cnt c++ && printf 2015


  • 由于博主刚上大一初学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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有