P1036 跟奥巴马一起编程
转跳点:🐏
1036 跟奥巴马一起编程 (15分)
美国总统奥巴马不仅呼吁所有人都学习编程,甚至以身作则编写代码,成为美国历史上首位编写计算机代码的总统。2014 年底,为庆祝“计算机科学教育周”正式启动,奥巴马编写了很简单的计算机代码:在屏幕上画一个正方形。现在你也跟他一起画吧!
输入格式:
输入在一行中给出正方形边长 N(3)和组成正方形边的某种字符 C,间隔一个空格。
输出格式:
输出由给定字符 C 画出的正方形。但是注意到行间距比列间距大,所以为了让结果看上去更像正方形,我们输出的行数实际上是列数的 50%(四舍五入取整)。
输入样例:
10 a
输出样例:
aaaaaaaaaa
a a
a a
a a
aaaaaaaaaa
这道题只需要注意一点就好了,题目中的这句话 “我们输出的行数实际上是列数的 50%”,记住行数是列数的一半。但这又涉及到另一个问题,当列数为奇数的时候存在四舍五入的情况,C语言整数相除是向0取整的,所以我们需要一个式子来判断小数是不是大于5。那么这个式子怎么写呢?
(m+n/2)/ n, 为什么呢,让我们先思考一下,为什么是如何判断小数部分是不是大于0.5。
其实很简单,设n为除数,m为被除数,如果 m%n > n / 2 的时候求出来的小数绝对大于等于0.5,因为余数的可能为n,所以0~9能乘出的数据就被分成n份当其得出的余数大于n/2时,就会用到n*n/2以上的数据。既然如此那么我们给数据加上n/2的大小,如果原数据大于除数的一半,那么加上n/2之后就会上升到另一个数量级,如果小于n,那么数量级不变。
这道题 n = 2 所以啊,原始就变形为 (M+1)/ 2
其他就没有什么了
AC代码如下:
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 int main(void) 5 { 6 int n; 7 char ch; 8 9 scanf("%d %c", &n, &ch); 10 11 for (int i = 0; i < (n + 1) / 2; i++) 12 { 13 for (int j = 0; j < n; j++) 14 { 15 if (0 == i || ((n + 1) / 2) - 1 == i) 16 { //第一行和最后一行全部输出 17 printf("%c", ch); 18 continue; 19 } 20 if (0 == j || n - 1 == j) 21 { //其他行的第一位和最后一位 22 printf("%c", ch); 23 continue; 24 } 25 printf(" "); 26 } 27 printf("\n"); 28 } 29 }
PTA不易,诸君共勉!
大道五十,天衍四九,人遁其一!