解题思路:
利用字符数组来实现空格和X的的变换,其次找到打印规律。
注意事项:
注意一:题目输出的是X,而不是x,晃眼一看很容易写成小写,这样很不容易发现错误。
注意二:输入包含多组测试数据。第一个整数N(N<=15),N表示组数,每组数据包含两个整数a,b。这里说的多组数据并不是有多组N,a,b的意思,而是说多组数据是由N控制,它决定组数,没有多组的N,否则就会输出超限
注意三:单纯的输出一个完整的DNA形状较为简单,多个重复我们就需要找规律(这是题目的关键)我的发现如下图
通过图示我们可以知道,每一组数据需要一个循环(S1)来走重复打印的次数,在S1内部我们需要一个循环S2来实现每一个S1所打印的行数,在S2中我们需要一个循环S3来实现每一行字符数组的打印,就是3重循环。
代码部分我们做的是最后单独打印最后一行。
参考代码:
#include<stdio.h> int main() { int N,a,b,j,k,i; scanf("%d",&N); char ch[40];//将字符数组全部初始化为空格,在需要打印哪一行时将对应的部分改为X,打印完成,又换回空格 for(i=0;i<40;i++) ch[i]=' '; while(N--)//当全部组数打印完,跳出循环 { scanf("%d %d",&a,&b); for(i=0;i<b;i++)//循环S1 { for(k=0;k<a-1;k++)//循环S2 { ch[k]=ch[a-k-1]='X'; for(j=0;j<a;j++)循环S3 printf("%c",ch[j]); printf("\n"); ch[k]=ch[a-k-1]=' '; } } ch[0]=ch[a-1]='X';//单独打印剩的那一行 for(j=0;j<a;j++) printf("%c",ch[j]); printf("\n\n"); ch[0]=ch[a-1]=' '; } return 0; }
有问题的同学欢迎讨论,我们互相成长,一起变强!
0.0分
34 人评分
#include<stdio.h> int main() { char a[10][10]; int n, k[15]={0}, m[15]={0}; int i, j, w,q; scanf("%d",&n); for (i = 0; i <n; i++) scanf("%d%d",&k[i], &m[i]); for (q = 0; q < n; q++) { for (i = 0; i < k[0+q]; i++) { for (j = 0; j < k[0+q]; j++) { if (j == i || j == k[0+q] - 1 - i) a[i][j] = 'X'; else a[i][j] = ' '; } } for (w = 0; w < m[0+q]; w++) { for (i = 0; i < k[0+q]; i++) { for (j = 0; j < k[0+q]; j++) { printf("%c", a[i][j]); } printf("\n"); } } printf("\n"); } return 0; } 结果一样,为什么不对
小姜骑猪 2022-07-05 10:00:35 |
#include<stdio.h> int main() { char a[10][10]; int n, k[15]={0}, m[15]={0}; int i, j, w,q; scanf("%d",&n); for (i = 0; i <n; i++) scanf("%d%d",&k[i], &m[i]); for (q = 0; q < n; q++) { for (i = 0; i < k[0+q]; i++) { for (j = 0; j < k[0+q]; j++) { if (j == i || j == k[0+q] - 1 - i) a[i][j] = 'X'; else a[i][j] =' '; } } int l = 0; for (w = 0; w < m[0+q]; w++) { { for (i = 0 + l; i < k[0 + q]; i++) { for (j = 0; j < k[0 + q]; j++) { printf("%c", a[i][j]); } printf(" "); } } l = 1; } printf(" "); } return 0; }
为什么不能从头开始循环,需要单独打印第一行
1021王俊峰 2022-04-05 20:57:54 |
如果是循环打印的话,有一行是多余的,不是最后一行就是第一行
#include<bits/stdc++.h> using namespace std; void p(int a,int b)//打印 一组dna要求 =核心重复+增加一行 { for(int k=1;k<=b;k++)//多组打印 { int c=1,d=a; for(int j=1;j<=a-1;j++) { for(int i=1;i<=a;i++)//打印一行 { if(i==c||i==d) cout<<"X"; else cout<<" "; } cout<<endl;//打印完成一行后换行 c++; d--; } } //尾部附加 for(int i=1;i<=a;i++) if(i==1||i==a) cout<<"X"; else cout<<" "; cout<<endl;//写完一组完整数据后要换行! cout<<endl; }
#include<stdio.h> int main() { int i,j,n; int s,d; int a[20],b[20]; scanf("%d",&n); for(i=0;i<n;i++) { scanf("%d%d",&a[i],&b[i]); } for(i=0;i<n;i++) { //打印第一行 for(j=0;j<a[i];j++) { if(j==0||j==a[i]-1) printf("X"); else printf(" "); } printf("\n"); //打印每个DNA循环部分 for(j=0;j<b[i];j++) { for(d=1;d<=a[i]-1;d++)//行数 { for(s=1;s<=a[i];s++)//列数 { if(s==d+1||s==a[i]-d)
#include<stdio.h> #define N 100 void f(int a,int b) { int m=0; char P[N][N]; for(int i=0;i<a;i++) //1和b// { for(int j=0;j<a;j++) { if(i==j||i+j==a-1) { P[i][j]='X'; }else{ P[i][j]=' '; } } } int flag=b; while(flag--) { if(flag==b-1) { for(int k=0;k<a;k++) { puts(P[k]); } }else{ for(int l=1;l<a;l++) { puts(P[l]); } } } } int main() { int n,a,b; scanf("%d",&n); while(n--) { scanf("%d%d",&a,&b); f(a,b); printf("\n"); } return 0; }
大哥这不对吧,没判断a是不是奇数啊
#include<stdio.h> void output(int a,int b){ char str[39][39]={" "}; int c; c=(a+1)/2-1; str[c][c]='X'; for(int i=1;i<=c;i++){ str[c-i][c-i]='X'; str[c-i][c+i]='X'; str[c+i][c-i]='X'; str[c+i][c+i]='X'; } for(int i=0;i<a;i++){ for(int j=0;j<a;j++){ printf("%c",str[i][j]); }printf("\n"); } for(int l=1;l<b;l++){ for(int i=1;i<a;i++){ for(int j=0;j<a;j++){ printf("%c",str[i][j]); }printf("\n"); } } } int main(){ int n; while
2005年春浙江省计算机等级考试二级C 编程题(1) (C语言代码)浏览:822 |
【数组的距离】 (C语言代码)浏览:606 |
人见人爱A+B (C语言代码)浏览:780 |
C语言程序设计教程(第三版)课后习题7.5 (C语言代码)浏览:605 |
C语言程序设计教程(第三版)课后习题10.2 (C语言代码)浏览:669 |
K-进制数 (C++代码)浏览:850 |
2^k进制数 (C++代码)使用递归方法浏览:721 |
弟弟的作业 (C++代码)浏览:1295 |
2003年秋浙江省计算机等级考试二级C 编程题(2) (C语言代码)浏览:653 |
C语言训练-大、小写问题 (C语言代码)浏览:611 |