L1-002
本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印
*****
***
*
***
*****
所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。
给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。
输入格式:
输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。
输出格式:
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。
输入样例:
19 *
输出样例:
***** *** * *** ***** 2
这道题目一开始看到我也没有任何思路,主要是对这种打印对应格式的内容只停留在printf了,
分析一下这道题目:
输入符号和个数,根据个数输出对应的沙漏,如果有多的就输出多几个
那么需要一个符号变量,一个总量,还需要几个变量用于计数
然后观察,发现这个沙漏是上下对称的,每个半边都是一个等差数列,前n项和为n方
所以半边半边的看的话,假设每个半边都是m行
也就是说 相当于半边的等差数列有m项,也就是说 n = m方*2-1
所以算出m等于sqrt((n+1)/2)
之后就是输出的问题了,采用上下半分开输出的方式,当然,就上半来说,每行需要输出的
空格数分别是0,1,2,3.....也就是用一个变量,每行输出的时候让它自己加一
这样就能做到每行比上一行多输出一个空格的目的了
然后是具体输出的过程,上半相当于从第m项输出到第一项,也即是
for(int i = m;i>=1;i--)
z这每一次的循环都是在输出每一行的内容
中间嵌套刚才说的输出空格 也就是
for(int j = 0;j<m-i;j++)
m-1一开始是0,然后是1,然后是2....根据这个变化输出不同个数的空格
然后就可以进行符号的输出了
for(int k = 0;k<2*i-1;k++)
2*i-1,相当于等差数列第i行输出2*i-1个符号
这样上半就做完了
下半循环由于上半已经输出了一个符号的情况,因此i从2开始
for(int i = 2;i<=m;i++)
然后再嵌套空格和符号输出即可,
对于数字的计算,定义一个count1,count2,每次k循环输出一个符号的时候++
这样最终用n减去他们俩的和就是剩下的数字了
代码如下
#include <iostream> #include <cmath> using namespace std; int main() { int n = 0, m = 0; char c; int i = 0, j = 0, k = 0; int count1 = 0, count2 = 0, count = 0; cin >> n >> c; m = sqrt((n + 1) / 2); for (i = m; i >= 1; i--) { for (j = 0; j < m - i; j++) cout << " "; for (k = 0; k < 2 * i - 1; k++) { cout << c; count1++; } cout << endl; } for (i = 2; i <= m; i++) { for (j = 0; j < m - i; j++) cout << " "; for (k = 0; k < 2 * i - 1; k++) { cout << c; count2++; } cout << endl; } count = count1 + count2; cout << n - count << endl; }
对于这道题目,重点在于把每一行看作等差数列的每一项去处理,就能够做出来了
L1-003
这道题目主要问题在于,一开始我定义了一个char[1000],然后循环输入检测,问题在于每次都需要输入1000位
而不能自己停止,在这种情况下,选择换成了string,检测是否为‘\0’,是说明到末尾了
代码
#include <iostream> using namespace std; int main() { string s; int a0=0, a1=0, a2=0, a3=0, a4=0, a5=0, a6=0, a7=0, a8=0, a9=0; cin >> s; for (int i = 0; i < s.length(); i++) { if (s[i] != '/0') { switch (s[i]){ case '0': a0++; break; case '1': a1++; break; case '2': a2++; break; case '3': a3++; break; case '4': a4++; break; case '5': a5++; break; case '6': a6++; break; case '7': a7++; break; case '8': a8++; break; case '9': a9++; break; } } } int a[10] = { a0,a1,a2,a3,a4,a5,a6,a7,a8,a9 }; for (int j = 0; j < 10; j++) { if (a[j] != 0) { cout << j << ":" << a[j] << endl; } } return 0; }
标签:case,输出,符号,int,++,003,002,L1,break From: https://www.cnblogs.com/Arkiya/p/17770483.html