1036 跟奥巴马一起编程
美国总统奥巴马不仅呼吁所有人都学习编程,甚至以身作则编写代码,成为美国历史上首位编写计算机代码的总统。2014 年底,为庆祝“计算机科学教育周”正式启动,奥巴马编写了很简单的计算机代码:在屏幕上画一个正方形。现在你也跟他一起画吧!
输入格式:
输入在一行中给出正方形边长 N(3≤N≤20)和组成正方形边的某种字符 C,间隔一个空格。
输出格式:
输出由给定字符 C 画出的正方形。但是注意到行间距比列间距大,所以为了让结果看上去更像正方形,我们输出的行数实际上是列数的 50%(四舍五入取整)。
输入样例:
10 a
输出样例:
aaaaaaaaaa a a a a a a aaaaaaaaaa
代码:
#include<stdio.h> int main(){ char a;//用于存放要打印的字符 int i, length;//i用于控制打印的次数,length用于存放要打印的边长 scanf("%d %c", &length, &a); for(i = 1; i <= length; i++){//第一行打印length个字符 printf("%c", a); } printf("\n");//换行到第二行 int high;//存放高度 if (length % 2 == 0){//对高度进行赋值,长度的50%,四舍五入 high = length / 2; } else{ high = length / 2 + 1; } for(i = 2; i <= high - 1; i++){//控制第二行到倒数第二行的输出 for(int j = 1; j <= length; j++){//控制每行输出的元素个数 if(j == 1 || j== length){//如果是第一个元素和最后一个元素,输出字符 printf("%c", a); } else{//其余元素,输出空格 printf(" "); } } printf("\n");//结束每行的输出后换行 } for(i = 1; i <= length; i++){//输出最后一行的元素 printf("%c", a); } return 0; }
1027 打印沙漏
本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印
***** *** * *** *****
所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。
给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。
输入格式:
输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。
输出格式:
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。
输入样例:
19 *
输出样例:
***** *** * *** ***** 2
代码:
(1)
#include<stdio.h> int count(int current, int total, int floor) {//求出最多能存下几层的符号(半边) current = 2 * floor - 1 + current;//current指的是当前层的符号数 if (total >= current) {//判断当前符号的总数是否超过了指定的总数 count(current, total, floor + 1);//未超过,则进行递归运算,计算下一层的情况 } else {//如果已经超过,则说明当前数量过多,需要退回一层,返回上一层的层数 return floor - 1; } } int above(int floor, int quantity, char symbol) {//打印上半个沙漏,最中间那层上层循环不打印 int k1 = 1, k2 = 1, j1 = floor, j2 = floor; for (int i = 1; i < floor; i++) {//一共打印floor - 1层 for (j2 = j1; j2 < floor; j2++) {//打印空格 printf(" "); } for (k2 = k1; k2 <= 2 * floor - 1; k2++) {//打印符号,并记录打印符号的总数 printf("%c", symbol); quantity++; } k1 += 2;//下层比当前层少打印两个符号 j1 -= 1;//下层比当前层多打印一个空格 printf("\n"); } return quantity;//返回上半个沙漏总共打印了多少个符号 } int below(int floor, int quantity, char symbol) { int k1 = floor, k2 = floor, j1 = 1, j2 = 1; for (int i = 1; i <= floor; i++) {//一共打印floor层,最中间那层由下层循环打印 for (j2 = j1; j2 < floor; j2++) { printf(" "); } for (k2 = k1; k2 <= floor; k2++) { printf("%c", symbol); quantity++; } k1 -= 2;//下层比当前层多打印两个符号 j1 += 1;//下层比当前层少打印一个空格 printf("\n"); } return quantity; } int main() { int floor = 1, total, used = 0, initialCount = 0, initialFloor = 1;//left记录剩余的字符个数,floor记录层数 char symbol; scanf("%d %c", &total, &symbol); if (total == 1) {//特殊情况:当输入的数字为1时,打印一个符号,并且输出0,return结束程序 printf("%c\n", symbol); printf("0"); return 0; } else { floor = count(initialCount, total / 2, initialFloor);//通过count函数计算层数 } used = above(floor, used, symbol);//通过above函数打印上半个沙漏 used = below(floor, used, symbol);//通过below函数打印下半个沙漏 printf("%d", total - used);//输出剩余的符号数,总数减去已使用数 return 0; }
(2)
#include<stdio.h> #include<math.h> int main() { int n; char c; scanf("%d %c", &n, &c); int bottom = (int)sqrt(2.0 * (n + 1)) - 1;//三角形底边拥有的字符数 if (bottom % 2 == 0) {//如果bottom为偶数,使他为奇数 bottom--; } int used = (bottom + 1) * (bottom + 1) / 2 - 1;//计算总共输出的非空格字符数 //输出倒三角 for (int i = bottom; i >= 1; i -= 2) { for (int j = 0; j < (bottom - i) / 2; j++) { printf(" "); } for (int j = 0; j < i; j++) { printf("%c", c); } printf("\n"); } //输出正三角 for (int i = 3; i <= bottom; i += 2) { for (int j = 0; j < (bottom - i) / 2; j++) { printf(" "); } for (int j = 0; j < i; j++) { printf("%c", c); } printf("\n"); } printf("%d\n", n - used); return 0; }