1027 打印沙漏(C语言)
1027 打印沙漏(C语言)
【题目描述】
本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印
所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。
给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。
输入格式:
输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。
输出格式:
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。
【代码实现】
可以分为上下两部分分别打印!
#include
int main(){int n,i,s=0,j,k;char ch;scanf("%d %c",&n,&ch);for(i=1;;i+=2){s+=2*i;//i表示不重复的情况下行数的最大值,s-1表示需要的字符数 if(s-1==n) break;//正好用完所有的字符 if(s-1>n) {s-=2*i;i-=2;break;}}//字符有多余 //printf("i=%d,s=%d\n",i,s-1);for(j=i;j>1;j-=2)//打印上半部分(不包括只有1个字符的所在行) {for(k=0;k<(i-j)/2;k++) printf(" ");for(k=0;k<j;k++) printf("%c",ch);//for(k=0;k<(i-j)/2;k++) printf(" ");//每一行最后一个字符的右侧无空格printf("\n");}for(j=1;j<=i;j+=2)//打印下半部分 {for(k=0;k<(i-j)/2;k++) printf(" ");for(k=0;k<j;k++) printf("%c",ch);//for(k=0;k<(i-j)/2;k++) printf(" ");//每一行最后一个字符的右侧无空格printf("\n");}printf("%d",n-s+1);//打印剩余的字符数 return 0;}
也可以写在一个循环里面!
// 如下代码也可以
#include
int main()
{// 输入一个正整数和一个符号int n; char ch;scanf("%d %c", &n, &ch);// 计算打印沙漏所需的最大字符int sum = 1;int i = 1;while (sum <= n){i += 2;sum += 2 * i;}sum -= 2 * i;i -= 2;
// printf("sum = %d\n", sum);// 打印出由给定符号组成的最大的沙漏形状int k;for (k=0; k<i; k++){if (k <= i / 2){for (int j=0; j<k; j++)printf(" ");for (int j=0; j<i-2*k; j++)printf("%c", ch);}else{for (int j=0; j<k-2*(k-i/2); j++)printf(" ");for (int j=0; j<2*k-i+2; j++)printf("%c", ch);}printf("\n");}// 输出剩下没有用掉的符号数printf("%d\n", n - sum);return 0;
}
也可以这样来解决这个问题。
首先计算出每一行需要打印的字符数量,之后在确定空格的数量。
#include
int main(){int n, i = 1, s = 1, j, ret, k;char ch;scanf("%d %c", &n, &ch); //输入数据while (1){ //处理数据if (s == n){ //ret存放一行中最大的符号个数ret = i;break;}if (s > n){s -= 2 * i;ret = i - 2;break;}i += 2;s += 2 * i;}for (i=0; i<ret; i++){//计算每一行的字符个数kk = ret - 2 * i;if (k < 1){k += 4 * (i - ret/2);}//打印空格for (j=0; j<(ret-k)/2; j++){putchar(' ');}//打印字符for (j=0; j<k; j++){putchar(ch);}putchar('\n');}printf("%d", n - s); //输出数据return 0;
}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
