-
(一)输出梯形
题目描述:
-
输入一个高度h,输出一个高为h,上底边为h的梯形。
-
输入:
-
一个整数h(1<=h<=1000)。
-
输出:
-
h所对应的梯形。
-
样例输入:
-
4
-
样例输出:
-
**** ****** ******** **********
-
提示:
-
梯形每行都是右对齐的。
#include<stdio.h> int main(){ int h,i; while(scanf("%d",&h)!=EOF){ int max=h+2*(h-1); for(i=0;i<h;i++){ int j=1; while(j<=max-h-i*2){ printf(" "); j++; } while(j<=max){ printf("*"); j++; } printf("\n"); } } return 0; }
(二)叠筐题目描述
需要的时候,就把一个个大小差一圈的筐叠上去,使得从上往下看时,边筐花色交错。这个工作现在要让计算机来完成,得看你的了。输入描述:
输入是一个个的三元组,分别是,外筐尺寸n(n为满足0<n<80的奇整数),中心花色字符,外筐花色字符,后二者都为ASCII可见字符;
输出描述:
输出叠在一起的筐图案,中心花色与外筐花色字符从内层起交错相叠,多筐相叠时,最外筐的角总是被打磨掉。叠筐与叠筐之间应有一行间隔。
示例1输入
11 B A 5 @ W
输出
AAAAAAAAA ABBBBBBBBBA ABAAAAAAABA ABABBBBBABA ABABAAABABA ABABABABABA ABABAAABABA ABABBBBBABA ABAAAAAAABA ABBBBBBBBBA AAAAAAAAA @@@ @WWW@ @W@W@ @WWW@ @@@
#include<stdio.h> int main(){ int n,i,j; char nei,wai; while(scanf("%d %c %c",&n,&nei,&wai)!=EOF){ char buf[80][80]; for(i=0;i<n/2;i++){ if(i==0||i==n-1){ for(j=0;j<n;j++){ if(j==0||j==n-1){ buf[i][j]=' '; } else buf[i][j]=wai; } }//首行与末行 else{ if(i%2==1){//奇数行 int m=i/2+1; int k=m; j=0; while(j<n-m*2){ while(k>=1){ k--; buf[i][j++]=wai; buf[i][j++]=nei; } buf[i][j++]=nei; } k=m; while(j<n){ while(k>=1){ k--; buf[i][j++]=nei; buf[i][j++]=wai; } } } else{//偶数行 int m=i/2; int k=m; j=0; while(j<n-m*2){ while(k>=1){ k--; buf[i][j++]=wai; buf[i][j++]=nei; } buf[i][j++]=wai; } k=m; while(j<n){ while(k>=1){ k--; buf[i][j++]=nei; buf[i][j++]=wai; } } } } }//对称图形的上半部分 j=0; while(j<n){ buf[n/2][j++]=wai; buf[n/2][j++]=nei; }//对称轴 for(i=0;i<=n/2;i++){ for(j=0;j<n;j++){ printf("%c",buf[i][j]); } printf("\n"); }//对称轴及以上部分 for(i=n/2-1;i>=0;i--){ for(j=0;j<n;j++){ printf("%c",buf[i][j]); } printf("\n"); }//对称轴以下部分 printf("\n"); } return 0; }
注:以上错误的,没有理解题目的意思,“中心花色”是指在整个图形的中心,“外筐花色”是相对“中心花色”而言的,而不一定是整个图形的外筐,修改如下:#include<stdio.h> int main(){ int n,i,j; char nei,wai; while(scanf("%d %c %c",&n,&nei,&wai)!=EOF){ char buf[80][80]; if(n/2%2==0){ char tmp=wai; wai=nei;nei=tmp; } for(i=0;i<n/2;i++){ if(i==0||i==n-1){ for(j=0;j<n;j++){ if(j==0||j==n-1){ buf[i][j]=' '; } else buf[i][j]=wai; } }//首行与末行 else{ if(i%2==1){//奇数行 int m=i/2+1; int k=m; j=0; while(j<n-m*2){ while(k>=1){ k--; buf[i][j++]=wai; buf[i][j++]=nei; } buf[i][j++]=nei; } k=m; while(j<n){ while(k>=1){ k--; buf[i][j++]=nei; buf[i][j++]=wai; } } } else{//偶数行 int m=i/2; int k=m; j=0; while(j<n-m*2){ while(k>=1){ k--; buf[i][j++]=wai; buf[i][j++]=nei; } buf[i][j++]=wai; } k=m; while(j<n){ while(k>=1){ k--; buf[i][j++]=nei; buf[i][j++]=wai; } } } } }//对称图形的上半部分 j=0; while(j<n){ buf[n/2][j++]=wai; buf[n/2][j++]=nei; }//对称轴 for(i=0;i<=n/2;i++){ for(j=0;j<n;j++){ printf("%c",buf[i][j]); } printf("\n"); }//对称轴及以上部分 for(i=n/2-1;i>=0;i--){ for(j=0;j<n;j++){ printf("%c",buf[i][j]); } printf("\n"); }//对称轴以下部分 printf("\n"); } return 0; }
注:以上格式仍没有满足题目要求,正确的截图应是这样的,意指“叠筐之间有一行间隔”:#include<stdio.h> int main(){ int n,i,j,k,x,y; char a,b,c; int output[81][81]; bool firstcase=true; //第一组数据 while(scanf("%d %c %c",&n,&a,&b)!=EOF){ if(firstcase) firstcase=false; else printf("\n");//若不是第一组数据,输入数据后,当叠筐输出前要有一空行 for(i=1,j=1;i<=n;j++,i+=2){//从里至外输出每个圈 x=n/2+1;y=x; x-=j-1;y-=j-1;//每个圈右上角坐标 c=j%2==1?a:b;//确定当前圈是哪个字符 for(k=1;k<=i;k++){ output[x+k-1][y]=c;//左 output[x][y+k-1]=c;//上 output[x+k-1][y+i-1]=c;//右 output[x+i-1][y+k-1]=c;//下 } } if(n!=1){//n=1时不需磨角 output[1][1]=' '; output[1][n]=' '; output[n][1]=' '; output[n][n]=' '; } for(i=1;i<=n;i++){ for(j=1;j<=n;j++) printf("%c",output[i][j]); printf("\n"); } } return 0; }
(三)打印沙漏
本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印
***** *** * *** *****
所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。
给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。
输入格式:
输入在一行给出1个正整数N(<=1000)和一个符号,中间以空格分隔。
输出格式:
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。
输入样例:19 *输出样例:
***** *** * *** ***** 2
#include<stdio.h>
int main(){
int n,c,i,j,k,p,m,sum,num;
scanf("%d %c",&n,&c);
sum=1;i=3;
while(sum<=n){
sum=sum+i*2;
i=i+2;
}
m=i-4;//首排m个,共m排
sum=sum-(i-2)*2;//共sum个
num=n-sum;//多num个
k=m;//设每排k个
for(j=1;j<=m/2;j++){//上半部分
int kg=m-k;
for(p=1;p<=kg/2;p++){
printf(" ");
}
for(i=1;i<=k;i++){
printf("%c",c);
}
printf("\n");
k=k-2;
}
for(p=1;p<=(m-1)/2;p++){
printf(" ");
}
printf("%c",c);
printf("\n");
k=3;
for(j=1;j<=m/2;j++){
int kg=m-k;
for(p=1;p<=kg/2;p++){
printf(" ");
}
for(i=1;i<=k;i++){
printf("%c",c);
}
printf("\n");
k=k+2;
}
printf("%d\n",num);
return 0;
}
注:本题的陷阱在于,每行符号之前用空格代替,符号打印完毕后,无须再输出空格。