标签:图案 MOOC 自测题 符号 int 打印 个数 陈越 printf
本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印
***** *** * *** *****
所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;
相邻两行符号数差2;
符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。
给定任意N个符号,不一定能正好组成一个沙漏。
要求打印出的沙漏能用掉尽可能多的符号。
输入格式:
输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。
输出格式:
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。
解题思路
为了方便叙述,我先假设用户需要打印的符号的个数为N,需要打印的符号是*;
1,首先我们通过观察该图案,利用等差数列的求和公式可以得到一个规律:
第n个图案所包含*的个数为2n2-1个;
2,然后根据用户输入的N来判断最多可以打印第几个完整图案,例如,如果用户输入19,那么令2n2-1=19,n就约等于3,
也就是说最多可以打印出第三个图案的所有*;
3,将我们第二步得到的n代入到2n2-1中,计算出来刚好打印完图案所需要的*的个数,
也就是说如果用户输入19,那么最多可以打印出第三个图案的所有*,打印该图案所需符号的个数为2*32 - 1=17;
4,最后将用户输入的N减去第三步计算出的2n2-1,可以得到打印完后多出来*的个数,即最后多出符号的个数为:N-(2n2-1),
如果用户输入19,那么最多可以打印出第三个图案的所有*,打印该图案所需符号的个数为 2*32 - 1=17,
最后多出来的*个数为19-17=2;
5,至于打印出图案的具体代码就是通过三层循环嵌套来实现的,第一层控制打印行数,第二层控制打印控制打印空格数,第三层控制打印符号的个数。
#include <stdio.h>
int main()
{ int n;
char a;
scanf("%d %c",&n,&a);
int sum = 1; //所需*个数
int i = 1; //上半部分层数
while(sum<=n) //此处通过每行图形的规律计算出给定个数的*可以排几层
{ sum+=2*(2*(i+1)-1);
//第一层是一个*,初始化时已经给出。每行的个数的规律是:2n-1,但是上下两半部分,所以整体乘2
if(sum<=n) i++; }
//输出上半部分
int j,k;
for(j=0;j<i;j++) //j<i是上半部分层数,控制上半部分层数
{ for(k=0;k<j;k++) //输出空格,上半部分空格个数和行数有关,第一行0个;第二行1个。
{ printf(" "); } for(k=0;k<(2*(i-j)-1);k++) //输出*,上半部分总层数为i层,通过(i-j)控制3,5,7,9...反过来输出为9,7,5,3...
{ printf("%c",a); } printf("\n"); } //输出下半部分
for(j=2;j<=i;j++)
//下半部分少了第一层,直接从第二层开始。最大层数为上半部分层数
{ for(k=0;k<i-j;k++) //空格的个数依然和层数有关。总层数-目前层数即为空格个数
{ printf(" "); }
for(k=0;k<2*j-1;k++)
//*个数直接按规律输出:1,3,5,7...
{ printf("%c",a);
}
printf("\n");
}
printf("%d",(n-(sum-2*(2*(i+1)-1)))); //注意:计算层数的循环中sum+=2*(2*(i+1)-1)可能会多加一次,也就是多加两层的*的个数。
}
#include<stdio.h> #include<math.h> int main() { int number; char ch; int n; int i,j,k; scanf("%d %c",&number,&ch); //通过观察我们可以知道第n个图案,需要打印的符号个数为2*n*n-1; //2*n*n-1=number ==> n = sqrt((number+1)/2) n = sqrt((number+1)/2); //判断最后多出来的图案的个数 int res = number - (2*n*n-1); //打印倒三角图案 //控制打印行数 for (i = n; i >= 1; i--) { //控制每行前空格数 for (k = 1; k <= n-i; k++) { printf(" "); } //控制每图案的个数 for (j = 1; j <= 2*i-1; j++) { printf("%c",ch); } printf("n"); } //打印正三角图案 //控制打印行数 for (i = 2; i <= n; i++) { //控制每行前空格数 for (k = 1; k <= n-i; k++) { printf(" "); } //控制每图案的个数 for (j = 1; j <= 2*i-1; j++) { printf("%c",ch); } printf("n"); } printf("%dn",res); // system("pause"); // getch(); return 0; }
标签:图案,MOOC,自测题,符号,int,打印,个数,陈越,printf 来源: https://www.cnblogs.com/realyuan2022/p/16452104.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。