解题思路: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语言训练-尼科彻斯定理 (C语言代码)。。。内含证明定理浏览:2141 |
C语言训练-斐波纳契数列 (C语言代码)浏览:826 |
C语言训练-求矩阵的两对角线上的元素之和 (C语言代码)浏览:765 |
C语言程序设计教程(第三版)课后习题11.1 (C语言代码)浏览:724 |
C语言程序设计教程(第三版)课后习题5.7 (C语言代码)浏览:606 |
C语言训练-计算t=1+1/2+1/3+...+1/n (C语言代码)浏览:942 |
A+B for Input-Output Practice (C语言代码)浏览:505 |
矩形面积交 (C++代码)浏览:1204 |
复数求和 (C语言代码)浏览:994 |
输出九九乘法表 (C语言代码)浏览:1172 |