星之轩儿


私信TA

用户名:starxuan

访问量:2873

签 名:

输入理想生活,输出精彩人生!

等  级
排  名 2344
经  验 2349
参赛次数 1
文章发表 3
年  龄 21
在职情况 学生
学  校 廊坊师范学院
专  业 计算机科学与技术

  自我简介:

一名热爱程序的大学生

解题思路:首先,我解释一下我定义的变量的含义。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 人评分

  评论区

  • «
  • »