病毒DNA可以表示成由一些字母组成的字符串序列,且病毒的DNA序列是环状的。例如,假设病毒的DNA序列为baa,则该病毒的DNA序列有三种变种:baa,aab,aba。试编写一程序,对给定的病毒DNA序列,输出该病毒所有可能的DNA序列(假设变种不会重复)。
输入格式:
输入第一行中给出1个整数i(1≤i≤11),表示待检测的病毒DNA。 输入i行串序列,每行一个字符串,代表病毒的DNA序列,病毒的DNA序列长度不超过500。
输出格式:
依次逐行输出每个病毒DNA所有变种,各变种之间用空格分隔。
输入样例1:
1
baa
结尾无空行
输出样例1:
baa aab aba
结尾无空行
输入样例2:
2
abc
baac
结尾无空行
输出样例2:
abc bca cab
baac aacb acba cbaa
结尾无空行
这道题的基本思想就是通过循环语句将数组里的后一位复制给前一位,但首先要设定一个空的字符变量(比如设为tmp),将最前面的一位赋值给这个设定好的空的字符变量,然后当循环语句结束的时候就会出现最后一位和倒数第二位是相同,这时就可以再将tmp赋值给最后一位,那么就实现将第一位移动到最后一位的计算,然后通过最外一层的循环,来循环每一位,就能实现将数组里的每一位字符都循环到不同的位置上这一功能。
代码如下:
#include<stdio.h>
#include<string.h>
#define N 501
int main()
{
char a[N],tmp;
int n,i,j,len,k;
scanf("%d ",&n);//要有一个空格,如果没有空格就只能一次性输完
for(k=0;k<n;k++)//每层的循环变量要不一样 ,也可以重新令int ....
{
gets(a);
len=strlen(a); //求字符串的长度
printf("%s ",a);//这里不能使用puts,不然会换行
for(j=0;j<len-1;j++)
{
tmp=a[0];
/*for(i=0;i<len-1;i++)//用最基本的循环语句来实现
{
a[i]=a[i+1];
}*/
strcpy(&a[0],&a[1]);//也可以用strcpy函数来实现,但前提是要有sting.h这一头文件
a[len-1]=tmp;
printf("%s ",a);
}
printf("\n");
}
return 0;
}