解题思路:首先,我解释一下我定义的变量的含义。n代表组数,a代表一个单位的DNA串的行数,b代表重复度。从题目可知,这三个量分别有限制条件,n必须小于15且大于0(n代表组数,所以不可能为0),a为奇数且 3<=a<=39。b表示(1<=b<=20)。我设置的是:一旦用户输入错误,出现提示信息(错误),并重新开始执行程序,用户因此需要重新赋值。接下来就是最重要的内容了,我设置了4个循环,i代表组数的循环,j代表重复数的循环,k代表输出的DNA阵的行,q代表输出的DNA的列,然后由题可知,它输出X的所有的位置相当于一个a*a矩阵的主对角线和副对角线,所以根据求主对角线和副对角线的算法,直接输出对应的a*a矩阵的图形。要注意的是,重复数b一旦大于2,再次输出的矩阵少了一行(假如说b为2,第二次输出的图形的第一行和第一次输出的图形的最后一行是相等的,所以要想办法让它少输出一行,才能符合题意要求),因此,我设置了限制条件:
k=1;
if(j!=1) k=2;
最后就是要注意图形的格式,比如每组图形之间有一个空格什么的。
本人是一名来自二本院校学生,学计算机科学与技术专业的,现在是准大一,C语言刚刚学到了字符数组,所以我的解法或许也不是最好的,最简洁的。因此大家如果看到代码哪里有问题,还请指出,谢谢大家,让我们共同进步!
参考代码:
#include <stdio.h>
int main(){
int n,a[1000],b[1000],i,j,k,q;
abc:scanf("%d",&n);
if(n<=15 && n>0){
for(i=1;i<=n;i++){
scanf("%d",&a[i]);
if(a[i]%2==0 || a[i]<3 || a[i]>39){
printf("出错!\n");
goto abc;
}
scanf("%d",&b[i]);
if(b[i]<1 || b[i]>20){
printf("出错!\n");
goto abc;
}
}
}
else{
printf("出错!\n");
goto abc;
}
for(i=1;i<=n;i++){
for(j=1;j<=b[i];j++){
k=1;
if(j!=1) k=2;
for(;k<=a[i];k++){
for(q=1;q<=5;q++){
if(k==q || k+q==a[i]+1){
printf("X");
}
else{
printf(" ");
}
}
printf("\n");
}
}
printf("\n");
}
return 0;
}
0.0分
2 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复