-
2021-10-29 10:06:30
本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印
***** *** * *** *****
所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。
给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。
输入格式:
输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。
输出格式:
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。
输入样例:
19 *
结尾无空行
输出样例:
***** *** * *** ***** 2
结尾无空行
代码:
#include<bits/stdc++.h> using namespace std; int main() { int n, sum = 1, j = 1, flag = 0, len = 0; string c; cin >> n >> c; if(n == 1) { cout << c << endl; cout << 0; return 0; } if(n < 7) { cout << c << endl; cout << n-1; return 0; } string s[100]; for(int i = 0; i < 100; i++) { j += 2; for(int k = 0; k < j; k++) s[len] += c; len++; sum += 2*j; if(sum > n) { len--; break; } } int cnt = 0; for(int i = len-1; i >= 0; i--) { for(int j = 0; j < cnt; j++) cout << " "; cout << s[i] << endl; cnt++; } for(int j = 0; j < cnt; j++) cout << " "; cout << c << endl; for(int i = 0; i < len; i++) { cnt--; for(int j = 0; j < cnt; j++) cout << " "; cout << s[i] << endl; } sum = 1 + len * (2*len + 4); cout << n-sum; return 0; }
更多相关内容 -
C 语言 打印沙漏
2018-05-07 17:36:01PAT 测试题 打印沙漏 但是不知道为什么我的提交就是无效 -
PTA乙级-1027 打印沙漏c++
2022-03-14 14:24:33本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印 ***** *** * *** ***** 所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先...题目内容
本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印
***** *** * *** *****
所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。
给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。
输入格式:
输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。
输出格式:
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。
输入样例:
19 *
输出样例:
***** *** * *** ***** 2
一、题解要点
- 解题思路:首先计算能输出怎样的一个沙漏,最后还剩多少符号
- 利用for循环里套两个for循环作输出,变量i既控制输出几行,也控制每行输出几个空格(通过x实现)、几个符号(通过y实现)
二、具体实现
#include<iostream> using namespace std; int main(){ int n,i=3; char c; cin>>n>>c; /*这个while循环用来计算剩下多少符号*/ n=n-1; //n先减去1,就是沙漏最中间的部分 while((n-i*2)>=0){ n=n-i*2; i+=2; } /*第一个for循环用来输出倒三角,直至倒三角的最后第二行*/ i = i - 2; //i是用来记录首行有多少个符号 int temp = i; for(;i>1;i-=2){ //i从大到小每次循环减2 for(int x=(temp-i)/2;x>0;x--){ //这个循环用来输出空格,其数量是 (temp-i)/2 cout<<" "; } for(int y=i;y>0;y--){ cout<<c; } cout<<endl; } /*第二个for循环用来输出正三角*/ for(;i<=temp;i+=2){ //这个循环与上边循环唯一的不同就是i要从小到大 for(int x=(temp-i)/2;x>0;x--){ cout<<" "; } for(int y=i;y>0;y--){ cout<<c; } cout<<endl; } cout<<n<<endl; return 0; }
总结
我还记得输出沙漏的题目我大一的时候碰到过,当时没做出来,看了同学的才知道。现在再见到这样的题目,终于可以独立完成,这算不算是一种成长。
-
1027 打印沙漏 C++
2019-05-04 20:59:08思路分析: ...取整个沙漏为研究对象,则整个沙漏的 *号个数为2n2-1。n可求。 综上,可先求上半部分,然后反转得到下半部分。 值得注意的是:1. 星号右方是没有空格的;2. 即使所有符号都用上最后也...
思路分析:
这是一道基于等差数列的问题。取沙漏的上半部分为研究对象:
从底向上*号个数分别为1、3、5、7……不难发现,该数列为首项为1,差为2的等差数列。通项公式为2n-1,前n项和为n2, 沙漏下方同理。取整个沙漏为研究对象,则整个沙漏的 *号个数为2n2-1。n可求。
综上,可先求上半部分,然后反转得到下半部分。值得注意的是:1. 星号右方是没有空格的;2. 即使所有符号都用上最后也要输出数字0。
代码示例:
#include<iostream> #include<math.h> #include<stack> using namespace std; int main() { int num; char ch; cin >> num >> ch; int n = sqrt((num+1)/2); int sum = 2*n * n-1;//根据n求等差数列之和 stack<string> sta; int topLine = 2*n-1;//等差数列an项的值 //打印上三角行数为n(包括最底下只有一个星的一行)沙漏 for (int i = 0; i < n; i++) {//控制打n行 string str; for (int j = 0; j < i; j++) {//控制打空格 str += " "; } for (int k = 0; k < topLine; k++) {//打符号 str += ch; } cout << str; sta.push(str); cout << endl; topLine -= 2; } sta.pop();//第一项没用,舍弃 while (!sta.empty()) { cout<<sta.top(); cout << endl; sta.pop(); } int rest = num - sum; cout << rest << endl; return 0; }
-
PTA打印沙漏L1-002打印沙漏
2020-01-11 17:26:55个人的想法,通俗易懂。 -
PTA L1-002 打印沙漏 C++实现
2020-02-20 09:17:29打印沙漏 Talk is cheap. Show me the code. #include<iostream> using namespace std; int main() { int n=0;char sign='*'; cin>>n>>sign; if(n==0) { cout<<n<&...打印沙漏
本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印
***** *** * *** *****
沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。
给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。
输入格式:
输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。
输出格式:
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。
输入样例:19 *
输出样例:
***** *** * *** ***** 2
Talk is cheap. Show me the code.
#include<iostream> using namespace std; int main() { int n=0;char sign='*'; cin>>n>>sign; if(n==0) { cout<<n<<endl; return 0; } int hourglass=1,increment=6; int hourglass_arr[1000]; int remain=0,row=0; for(int k=0;k<1000;k++,increment+=4) { hourglass_arr[k]=hourglass; hourglass=hourglass+increment; if(n<hourglass_arr[k]) { remain=n-hourglass_arr[k-1]; row=k-1; break; } } int odd=1; for(int k=0;k<row;k++) { odd=odd+2; } int blank=0;bool flag=false; for(int temp_num=odd;temp_num>0;temp_num--) { if(!flag) { for(int k=blank;k>0;k--) { cout<<" "; } for(int k=odd-(2*blank);k>0;k--) { cout<<sign; } cout<<endl; if(temp_num-1==odd/2) { flag=true; odd=3; blank--; } else { blank++; } } else { for(int k=blank;k>0;k--) { cout<<" "; } for(int k=odd;k>0;k--) { cout<<sign; } cout<<endl; blank--; odd=odd+2; } } cout<<remain; }
解题思路
1000以内能够完美打印沙漏而无剩余的只有1 7 17 31 49 71 97 127 161 199 241 287 337 391 449 511 577 647 721 799 881 967这几个数,所以只需判断输入的N在哪个数之后即可,例如:输入N=19,则选中的数为17,剩余=19-17=2个。通过规律可以得到沙漏使用符号最多的一行也刚好为行数,例如:17时打印为5 3 1 3 5,共5行,所用符号最多的一行(最上面或最下面)也为5个。并且规律可以得到能够完美打印沙漏而无剩余的这几个数中行数刚好时按照1 3 5 7 9 …递增的,所以能够只需通过数组下标与值将行数(使用输入符号最多的一行)与选中的数联系起来,例如:输入N=19,选中的数为17为值,行数(使用输入符号最多的一行)5为下标。
分步代码解读
1.
int hourglass=1,increment=6; int hourglass_arr[1000]; int remain=0,row=0; for(int k=0;k<1000;k++,increment+=4) { hourglass_arr[k]=hourglass; hourglass=hourglass+increment; if(n<hourglass_arr[k]) { remain=n-hourglass_arr[k-1]; row=k-1; break; } }
hourglass_arr[1000]数组内存的是能够完美打印沙漏而无剩余的数(1000个显然大的多,可以适当减小)。这些数的计算方法(即规律)为1 + 6 = 7,7 + 10 = 17 ,17 + 14 =31 ,所以 hourglass_arr[0]=1,后续则为 hourglass_arr[1] = hourglass_arr[0] + 6,hourglass_arr[2] = hourglass_arr[1] + 10…,而 6 + 4 = 10,10 + 4 = 14(即 increment += 4)。
2.
int odd=1; for(int k=0;k<row;k++) { odd=odd+2; }
这部分代码就是根据能够完美打印沙漏而无剩余的这几个数中行数刚好时按照1 3 5 7 9 …递增的这一规律计算行数,得到行数就可以打印沙漏了,注意:行数也是所用*最多的一行(最上面或最下面)。
3.
int blank=0;bool flag=false; for(int temp_num=odd;temp_num>0;temp_num--) { if(!flag) { for(int k=blank;k>0;k--) { cout<<" "; } for(int k=odd-(2*blank);k>0;k--) { cout<<sign; } cout<<endl; if(temp_num-1==odd/2) { flag=true; odd=3; blank--; } else { blank++; } } else { for(int k=blank;k>0;k--) { cout<<" "; } for(int k=odd;k>0;k--) { cout<<sign; } cout<<endl; blank--; odd=odd+2; } } cout<<remain; }
这部分代码就开始打印沙漏了。打印时先打印上半部分,符号前的空格从0递增一直到符号只需打印一个时,这是打印了行数的一半(注意:此时空格数要减一,因为中间对称轴我是算做下半部分。),然后我们符号就要从3开始奇数递增打印,并且空格数递减即可。最后别忘了输出剩余符号的个数。
4.
if(n==0) { cout<<n<<endl; return 0; }
注意输入N=0时,这种情况也要考虑,此时不打印直接输出剩余0即可。
测试结果
-
PTA 打印沙漏 C++
2022-01-31 16:23:27本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印 ***** *** * *** ***** 所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数... -
PAT B1027 打印沙漏 (C++)
2021-07-05 10:38:10打印沙漏 本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个 “*” ,要求按下列格式打印 ***** *** * *** ***** 所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;... -
打印沙漏(C++实现)
2020-04-30 22:34:08#include <iostream> #include <cmath> using namespace std; int main(){ int n,x; char c; cin>>x>>c; n=floor(sqrt(double(x+1)/2));//强制转换,并用floor()函数向下取整 ...n-... -
(C++)1027 打印沙漏
2021-07-16 23:34:41笔记:星号右边的空格不用打印 #include<cstdio> #include<cmath> #include<cstring> #include<algorithm> using namespace std; int main(){ int n; char c; scanf("%d %c",&n... -
C++打印沙漏问题分析
2020-10-03 20:37:18刚看到这道题时,对于给...因此我们可以将输入的符号总数n与沙漏中的符号总数进行对比,找到n下的最大沙漏符号总数,此时行数i也就找到了。 int i=1,m=1,n,p; char x; cin>>n>>x; while(n>=m) { i=i+. -
PAT天梯赛L1-002. 打印沙漏 C++
2018-05-01 17:07:30本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印***** *** * *** ***** 所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从... -
1027 打印沙漏 c++
2021-09-18 19:28:07一级标题 1027 打印沙漏 c++ #include<iostream> using namespace std; #include<iomanip> int main() { int sum = 0; cin >> sum; char st; cin >> st; int count = 1; int line=0... -
L1-002 打印沙漏 c++
2020-04-04 16:07:12本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印 所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小... -
c++实现打印沙漏
2020-10-16 12:50:22本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印 所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小... -
团体程序设计天梯赛-练习集L1-002. 打印沙漏 C++
2018-02-23 13:41:17题目地址:https://www.patest.cn/contests/gplt/L1-002题目要求:本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印***** *** * *** ***** 所谓“沙漏形状”,是指每行... -
L1-002 打印沙漏 (20分) C++
2020-11-01 18:54:43本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印 所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1... -
PAT乙级真题 1027 打印沙漏 C++实现
2019-12-21 17:21:00本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印 所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再... -
天梯赛L1打印沙漏(c++)
2022-03-25 09:23:11本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印 ***** *** * ***** *** * 所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数... -
打印沙漏——c++
2021-03-14 10:33:44对应代码和图找规律 #include<bits/stdc++.h> using namespace std; int main() { int n; string op; cin >> n; cin >> op; int f = (int)sqrt((n+1)/2);//层数,公式自推 ... int x = -
L1-002 打印沙漏 (20 分)C++
2021-08-08 23:02:19L1-002 打印沙漏 (20 分)C++ 本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印 ***** *** * *** ***** 所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;... -
PTA 乙级——1027 打印沙漏 C++实现
2019-10-02 16:03:53题目 打印沙漏 本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印 所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序... -
L1-002 打印沙漏 (20分) (c++)
2020-10-10 21:15:54本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印 ***** *** * *** ***** 所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先... -
【C/C++】打印沙漏
2017-09-18 16:25:55自测-1 打印沙漏(20 分) 本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印 ***** *** * *** ***** 所谓“沙漏形状”,是指每行输出奇数个符号;各行符号...