原题链接: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、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复