15年蓝桥杯第4题

题意: StringInGrid函数会在一个指定大小的格子中打印指定的字符串。要求字符串在水平、垂直两个方向上都居中。如果字符串太长,就截断。如果不能恰好居中,可以稍稍偏左或者偏上一点。下面的程序实现这个逻辑,请填写划线部分缺少的代码。
思路:被各种输出空搞晕了,不过看的题解上的原题,一拿该是有些出入的。
开始以为的输出应该是 int len1 = (width - 2 - strlen(s)) / 2; int len2 = (width - 1 - len1 - strlen(s)); printf("%*s%s%*s", len1, " ", s, len2, " "); 应该是 int len1 = (width - 2 - strlen(s)) / 2; int len2 = (width - 1 - len1 - strlen(s)); printf("%*s%s%*s", len1, "", s, len2, ""); 错误在于当len1 == 0 时,第一个会多输出一个空格。%*s,前边的参数是字符串占的位数,后边的是要输出的字符串。当字符串长度不够该占的位数时,会用空格补齐。但是超过的时候就不会了。所以会出现上述错误。

附right代码:

 1 /*
 2  StringInGrid函数会在一个指定大小的格子中打印指定的字符串。
 3  要求字符串在水平、垂直两个方向上都居中。
 4  如果字符串太长,就截断。
 5  如果不能恰好居中,可以稍稍偏左或者偏上一点。
 6
 7  下面的程序实现这个逻辑,请填写划线部分缺少的代码。
 8  */
 9
10 #include <stdio.h>
11 #include <string.h>
12
13 void StringInGrid(int width, int height, const char* s)
14 {
15     int i, k;
16     char buf[1];
17     strcpy(buf, s);  // 长度为1的字符数组,复制?
18     if (strlen(s)>width - 2) buf[width - 2] = 0; // 截断字符串。为什么大于宽度减去2的时候就截断?
19                                                  // 意思是,要想居中两边必须都至少留一个格子?
20     printf("+");
21     for (i = 0; i<width - 2; i++) printf("-");
22     printf("+\n"); // 边框宽
23
24     for (k = 1; k<(height - 1) / 2; k++)
25     {
26         printf("");
27         for (i = 0; i<width - 2; i++) printf(" ");
28         printf("\n");
29     }
30
31       printf(""); //????
32
33     // printf("%*s%s%*s", (width-strlen(s)-2)/2, "",s,(width-strlen(s)-1)/2,""); //输出字符串!格式就是参数
34     int len1 = (width - 2 - strlen(s)) / 2;
35     int len2 = (width - 1 - len1 - strlen(s));
36     printf("%*s%s%*s", len1, "", s, len2, "");
37
38     printf("\n");
39
40     for (k = (height - 1) / 2 + 1; k<height - 1; k++)
41     {
42         printf("");
43         for (i = 0; i<width - 2; i++) printf(" ");
44         printf("\n");
45     }
46
47     printf("+");
48     for (i = 0; i<width - 2; i++) printf("-");
49     printf("+\n");
50 }
51
52 int main()
53 {
54     StringInGrid(20, 6, "abcd1234");
55     return 0;
56 }

时间: 2024-10-13 01:26:24

15年蓝桥杯第4题的相关文章

15年蓝桥杯第5题

题意: 1,2,3...9 这九个数字组成一个分数,其值恰好为1/3,如何组法? 思路:和15年第3题几乎是一样的dfs.依然不是自己想出来的.太佩服这个机智的深搜了. 如果题意是把用完九个数的话. 附right代码: 1 /* 2 1,2,3...9 这九个数字组成一个分数,其值恰好为1/3,如何组法? 3 */ 4 5 #include <stdio.h> 6 7 bool check(int x[]) { 8 for (int i=0; i<9; ++i) { 9 for (int

蓝桥杯——历年真题之带分数

问题描述 100 可以表示为带分数的形式:100 = 3 + 69258 / 714. 还可以表示为:100 = 82 + 3546 / 197. 注意特征:带分数中,数字1~9分别出现且只出现一次(不包含0). 类似这样的带分数,100 有 11 种表示法. 输入格式 从标准输入读入一个正整数N (N<1000*1000) 输出格式 程序输出该数字用数码1~9不重复不遗漏地组成带分数表示的全部种数. 注意:不要求输出每个表示,只统计有多少表示法! 样例输入1 100 样例输出1 11 样例输入

今天做了几道蓝桥杯的去年题

找了几道简单的热热身,感觉自己算法还是记不住,能描述,不会写,应该是练少了的缘故. 今天一道题交了好几遍才对啊,明明是很简单的题啊啊啊啊啊,算了,先回忆一下心路历程. 题目是这样的 问题描述 栋栋正在和同学们玩一个数字游戏. 游戏的规则是这样的:栋栋和同学们一共n个人围坐在一圈.栋栋首先说出数字1.接下来,坐在栋栋左手边的同学要说下一个数字2.再下面的一个同学要从上一个同学说的数字往下数两个数说出来,也就是说4.下一个同学要往下数三个数,说7.依次类推. 为了使数字不至于太大,栋栋和同学们约定,

蓝桥杯之填空题集合1

1.最小公倍数 求两个数字的最小公倍数是很常见的运算.比如,3和5的最小公倍是15.6和8的最小公倍数是24.下面的代码对给定的两个正整数求它的最小公倍数.请填写缺少的代码,使程序尽量高效地运行. 把填空的答案(仅填空处的答案,不包括题面)存入考生文件夹下对应题号的“解答.txt”中即可. 1 int f(int a, int b) 2 { 3 int i; 4 for(i=a;;______) 5 { 6 if(i%b==0) return i; 7 } 8 } 参考答案:i+=a 或者 i

2017蓝桥杯第十题(k倍区间)

1 #include<iostream> 2 #include<stdio.h> 3 using namespace std; 4 const int N = 10010; 5 int n,c[N*3],a[N]; 6 int lowbit(int n){ 7 return n&(-n); 8 } 9 void change(int k,int pos){ 10 while(pos<=n){ 11 c[pos]+=k; 12 pos+=lowbit(pos); 13

第四届蓝桥杯第七题 错误票据

题解:写了简单题,好开心,我果然不适合学算法.......写写简单题,当个咸鱼就好了嘛!! #include <iostream> #include <algorithm> #include <cstdlib> #include <cstdio> #include <cstring> #include <sstream> using namespace std; const int maxn = 100000 + 50; int N;

第四届蓝桥杯第八题 翻硬币

题解:简单贪心, 比赛之前写写水题 #include <iostream> #include <cstring> #include <string> using namespace std; const int maxn = 1000 + 20; void solve() { int init[maxn], over[maxn]; string in, ov; int ans = 0; cin >> in; cin >> ov; for (uns

16年蓝桥杯第七题_(string)

手链样式 小明有3颗红珊瑚,4颗白珊瑚,5颗黄玛瑙.他想用它们串成一圈作为手链,送给女朋友.现在小明想知道:如果考虑手链可以随意转动或翻转,一共可以有多少不同的组合样式呢? 请你提交该整数.不要填写任何多余的内容或说明性的文字. 一开始以为是搜索,发现不行,想了一会儿没有思路,看了题解...用了一个比较慢,但是想法简单的方法. 主要用了一些stl的函数, #include<iostream> #include<cstdio> #include<cstring> #inc

蓝桥杯------历届真题

<1>核桃的数量 问题描述 小张是软件项目经理,他带领3个开发组.工期紧,今天都在加班呢.为鼓舞士气,小张打算给每个组发一袋核桃(据传言能补脑).他的要求是: 1. 各组的核桃数量必须相同 2. 各组内必须能平分核桃(当然是不能打碎的) 3. 尽量提供满足1,2条件的最小数量(节约闹革命嘛) 输入格式 输入包含三个正整数a, b, c,表示每个组正在加班的人数,用空格分开(a,b,c<30) 输出格式 输出一个正整数,表示每袋核桃的数量. 样例输入1 2 4 5 样例输出1 20 样例输