蓝桥杯第九届省赛C/C++ C组 编程大题 第七、八题 次数差、等腰三角形

本文分享了蓝桥杯第九届省赛C/C++组的两个编程问题——次数差和等腰三角形的解题思路与代码实现。对于次数差问题,给出了简单的代码实现;等腰三角形问题,通过逆时针填充数字形成三角形。同时,作者提到对C语言掌握的不足,希望得到优化建议和学习资源。

七:次数差

x星球有26只球队,分别用a~z的26个字母代表。他们总是不停地比赛。

在某一赛段,哪个球队获胜了,就记录下代表它的字母,这样就形成一个长长的串。
国王总是询问:获胜次数最多的和获胜次数最少的有多大差距?(当然,他不关心那些一次也没获胜的,认为他们在怠工罢了)

输入,一个串,表示球队获胜情况(保证串的长度<1000)

要求输出一个数字,表示出现次数最多的字母比出现次数最少的字母多了多少次。

比如:
输入:
abaabcaa

则程序应该输出:
4

解释:a出现5次,最多;c出现1次,最少。5-1=4

再比如:
输入:
bbccccddaaaacccc

程序应该输出:
6

资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗  < 1000ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。

注意:
main函数需要返回0;
只使用ANSI C/ANSI C++ 标准;
不要调用依赖于编译环境或操作系统的特殊函数。
所有依赖的函数必须明确地在源文件中 #include <xxx>
不能通过工程设置而省略常用头文件。

提交程序时,注意选择所期望的语言类型和编译器类型。

附上我写的代码(大一小白,多多指教)

#include<stdio.h>

#include<string.h>

int main()
{
char a[26]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};      //便于比较
int b[26]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};                      //便于记录上面的对应的次数
char c[1050]={};
int i,j,max=0,min=1050,sub;
gets(c);
for(i=0;i<1050;i++)
{
if(c[i]!='\0')
{
for(j=0;j<26;j++)
{
if(c[i]==a[j])
{
b[j]=b[j]+1;
}
}
}
}
for(j=0;j<26;j++)
{
if(b[j]!=0)
{
min=(min<b[j]?min:b[j]);
max=(max>b[j]?max:b[j]);
}
}
sub=max-min;
printf("%d",sub);
return 0;

}

八:等腰三角形

本题目要求你在控制台输出一个由数字组成的等腰三角形。
具体的步骤是:
1. 先用1,2,3,...的自然数拼一个足够长的串
2. 用这个串填充三角形的三条边。从上方顶点开始,逆时针填充。
比如,当三角形高度是8时:

       1
      2 1
     3   8
    4     1
   5       7
  6         1
 7           6
891011121314151

显示不正确时,参看:p1.png


输入,一个正整数n(3<n<300),表示三角形的高度
输出,用数字填充的等腰三角形。

为了便于测评,我们要求空格一律用"."代替。

例如:
输入:
5

程序应该输出:
....1
...2.1
..3...2
.4.....1
567891011

再例如:
输入:
10

程序应该输出:
.........1
........2.2
.......3...2
......4.....2
.....5.......1
....6.........2
...7...........0
..8.............2
.9...............9
1011121314151617181

再例如:
输入:
15

程序应该输出:

..............1
.............2.3
............3...2
...........4.....3
..........5.......1
.........6.........3
........7...........0
.......8.............3
......9...............9
.....1.................2
....0...................8
...1.....................2
..1.......................7
.1.........................2
21314151617181920212223242526

资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗  < 1000ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。

注意:
main函数需要返回0;
只使用ANSI C/ANSI C++ 标准;
不要调用依赖于编译环境或操作系统的特殊函数。
所有依赖的函数必须明确地在源文件中 #include <xxx>
不能通过工程设置而省略常用头文件。

提交程序时,注意选择所期望的语言类型和编译器类型。

#include <stdio.h>
int main()
{
int a[4000]={1,2,3,4,5,6,7,8,9,1,0,1,1,1,2,1,3,1,4,1,5,1,6,1,7,1,8,1,9,2,0,2,1,2,2,2,3,2,4,2,5,2,6,2,7,2,8,2,9,3,0,3,1,3,2,3,3};
//打印的数字的位置 ,3<n<300,我未做全全部,目前这个打印到 n=15 ,还在想怎么实现分开10以后的数字,然后记录下来 

int i=1,j=0,k=0,l=0,g;               //i记录打印数量,j记录打印的数字,k记录行数,l记录打印最底一行数字的数量的位置,g记录中间有空格后,该打印的数字位置 

int n,m;                                    //n记录行数,m也是记录行数 
scanf("%d",&n);
m=n;
g=m+m*2-3+m-2;                              //g等于(n+n*2-3+n-2);打印的数字一个用到(n+n*2-3+n-1)个, 
do{
for(i=1;i<n;i++)                        //打印小于行数减一的空格 
printf(" ");
printf("%d",a[j]);                      //打印该行对应的数字 
j++;                                    //下一行的数字到下一个 
if(k<m-1)                               //判断打印空格,还是最底行的连着的数字 
{
for(i=1;i<=k*2-1;i++)               //打印中间的空格数量 
printf(" ");
if(k>0)                             //除开第一行不用打印第二个数字 
{
printf("%d",a[g]);
g--;                            //因为g是呈现向前退 
}
}
else
for(l=0;l<=m*2-3;l++)               //打印最底一行的l个数字
printf("%d",a[l+j]);            //l是上面j后的数字 
printf("\n");                           //打印完所需打印的内容,进行换行 
k++;                                    //已打印的行数加一,用于后面判断是否打印够n行了 
n=n-1;                                  //使记录的行数减一(记录行数用了两个变量) ,使下一行打印的开头的空格减一 
}while(k<m);                                //已打印行数是否大于n 
return 0;
}


初学,报的是C,当时比赛用 if(xx=='a') 复制了好多行     :(     ,

各位大佬有用C优化再优化的,望能指点。

个人觉得自己,对函数的了解薄弱,一些常见的、有启发性的代码也了解不够,

也希望大佬们能给个,学习这方面的链接。谢谢。(也希望有8、9、10题,能AC的代码,了解一下思路)

好像找了很多都没后续6、7、8、9、10题的,补了一个第六题的,大佬指点指点对不对

#include<stdio.h>  
int gcd(int a, int b)
{
if(b==0) return a;
return gcd(b,a%b);
}
int main()
{
// 这是屏幕上显示的那个分数 a/b
int a = 7;
int b = 13;

int m,n;
int max_a = 0;
int max_b = 1; 

for(n=100; n>1; n--){
for(m=n-1; m>=1; m--){
if(m*b<a*n && gcd(m,n)==1){
if( m<n&&n%b==0||b%n==0 ){  //填空
max_a = m;
max_b = n;
break;
}
}
}
}

printf("%d/%d\n", max_a, max_b);
return 0;

}

九:小朋友崇拜圈

班里N个小朋友,每个人都有自己最崇拜的一个小朋友(也可以是自己)。
在一个游戏中,需要小朋友坐一个圈,
每个小朋友都有自己最崇拜的小朋友在他的右手边。
求满足条件的圈最大多少人?

小朋友编号为1,2,3,...N
输入第一行,一个整数N(3<N<100000)
接下来一行N个整数,由空格分开。

要求输出一个整数,表示满足条件的最大圈的人数。

例如:
输入:
9
3 4 2 5 3 8 4 6 9

则程序应该输出:
4

解释:

如图p1.png所示,崇拜关系用箭头表示,红色表示不在圈中。


显然,最大圈是[2 4 5 3] 构成的圈

再例如:
输入:
30
22 28 16 6 27 21 30 1 29 10 9 14 24 11 7 2 8 5 26 4 12 3 25 18 20 19 23 17 13 15

程序应该输出:
16

资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗  < 1000ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。

注意:
main函数需要返回0;
只使用ANSI C/ANSI C++ 标准;
不要调用依赖于编译环境或操作系统的特殊函数。
所有依赖的函数必须明确地在源文件中 #include <xxx>
不能通过工程设置而省略常用头文件。

提交程序时,注意选择所期望的语言类型和编译器类型。


十:耐摔指数

x星球的居民脾气不太好,但好在他们生气的时候唯一的异常举动是:摔手机。

各大厂商也就纷纷推出各种耐摔型手机。x星球的质监局规定了手机必须经过耐摔测试,并且评定出一个耐摔指数来,之后才允许上市流通。

x星球有很多高耸入云的高塔,刚好可以用来做耐摔测试。塔的每一层高度都是一样的,与地球上稍有不同的是,他们的第一层不是地面,而是相当于我们的2楼。

如果手机从第7层扔下去没摔坏,但第8层摔坏了,则手机耐摔指数=7。
特别地,如果手机从第1层扔下去就坏了,则耐摔指数=0。
如果到了塔的最高层第n层扔没摔坏,则耐摔指数=n

为了减少测试次数,从每个厂家抽样3部手机参加测试。

如果已知了测试塔的高度,并且采用最佳策略,在最坏的运气下最多需要测试多少次才能确定手机的耐摔指数呢?

输入数据,一个整数n(3<n<10000),表示测试塔的高度。
输出一个整数,表示最多测试多少次。

例如:
输入:
3

程序应该输出:
2

解释:
手机a从2楼扔下去,坏了,就把b手机从1楼扔;否则a手机继续3层扔下

再例如:
输入:
7

程序应该输出:
3

解释:
a手机从4层扔,坏了,则下面有3层,b,c 两部手机2次足可以测出指数;
若是没坏,手机充足,上面5,6,7 三层2次也容易测出。

资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗  < 1000ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。

注意:
main函数需要返回0;
只使用ANSI C/ANSI C++ 标准;
不要调用依赖于编译环境或操作系统的特殊函数。
所有依赖的函数必须明确地在源文件中 #include <xxx>
不能通过工程设置而省略常用头文件。

提交程序时,注意选择所期望的语言类型和编译器类型。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值