原题链接:DNA
解题思路:1.第一步先思考如何输出一个DNA,我的想法是上下分两半,先输出上部分再输出下部分
2.输出一个完整DNA后,判断重复度,再输出重复的DNA
注意事项:1.题目要求输入的数据都是一次性输入
2.输出的是X,不是x(这里我想了半天太难了)
参考代码:
#include<stdio.h> main() { int i,j,count,n[100],a,e,k,t,b[100],l,y,p,z=0,x=0,q; scanf("%d",&p);//输入组数 q=p;//将组数储存 do { scanf("%d %d",&n[z++],&b[x++]); p--; }while(p>0);//输入的组数的次数 z=0; x=0; do { k=1; e=n[z]; for(i=0;i<n[z]/2+1;i++)//首先是上半部分,算中间那一个X,上半部分的次数是n/2+1 { j=i; for(;j>0;j--) { printf(" ");//输出空格,上半部分空格依次是0……n/2 } printf("X"); if(i<n[z]/2)//当行数=n/2时,后面那个X不要 { e=e-2; a=e; for(;a>0;a--)//后面 X之前的空格依次是n-2,n-4……,1 { printf(" "); } printf("X"); } printf("\n"); } t=n[z]/2; t=--t; for(i=0;i<n[z]/2;i++)//这里开始下半部分 { j=t;//下半部分第一个X前的空格数量 for(;j>0;j--) { printf(" "); } printf("X"); a=k;//第二个X之前的空格 for(;a>0;a--) { printf(" "); } printf("X"); printf("\n"); k=k+2;//跟上面-2差不多 t--; } l=n[z]; k=1; b[x]--; while(b[x]>0)//这里开始输出重复DNA { k=1;//每次循环重置一下,保证空格数,其他同理 l=n[z]; for(i=0;i<n[z]/2+1;i++) { l=l-2; a=l; if(i==0) continue;//因为重复的DNA我都看作没有第一行,所以跳过第一次,直接下一次循环 j=i; for(;j>0;j--)//还是上半部分 { printf(" "); } printf("X"); if(i<n[z]/2) { for(;a>0;a--) { printf(" "); } printf("X"); } printf("\n"); } y=n[z]/2; y=--y; for(i=0;i<n[z]/2;i++)//跟上面同理,下半部分 { j=y; for(;j>0;j--) { printf(" "); } printf("X"); a=k; for(;a>0;a--) { printf(" "); } printf("X"); printf("\n"); k=k+2; y--; } b[x]--; } z++;//下一循环就开始下一组数据 x++; if(z==q)//去掉最后一组后面的换行 break; printf("\n"); }while(z<q); }
0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复