求C++程序设计消除冗余序列算法

来源:百度知道 编辑:UC知道 时间:2024/05/29 09:34:13
1. 课题功能描述
在0、1组成的字符串序列中,如果存在连续n个(n>=3)“1”构成的子序列则将该子序列改为10…02,其中0的个数为n-1个。
例如:
原始序列为: 111110011110111011;
修改后的序列为: 1000020100021002011。
2. 问题的解决方案:
定义一个比较大的字符数组;
从键盘读入数据;检查数据的合法性(如果有非字符“0”或字符“1”就认为非法),如果非法重新读入;
确定字符串的长度。
从字符串的尾部开始判断字符“1”的个数,如果数目超过3个,则最后一位改为“2”,而将中间n-1位改为“0”,而将前面原始是“0”的位置改为“1”。
如果是最低位0位开始有超过3个“1”,还需要将数据整体后移一位,然后再将最后一位改为“2”,而将中间n-1位改为“0”,而将第0位放置为“1”。
例如上面例子中,原始序列是18位,而修改后序列为19位,原因就是最低5位为“1”,因此需要将数据整体后移一位,并且第0位放置为“1”。

main()
{
int a[100];
int i, t,b,c;
printf("please enter 100 number.");
do
{
for(i=0;i<100;i++)
{scanf("%d",a[i]);
if(a[i]!=0||a[i]!=1)
{
break;printf("error,please enter again!");
}
else
t=0;
}
} while (t=0) ;

b=strlen(a);

for(i=b,c=1;i>0;i--)
{if (a[i]==a[i-1]==1)
c+=1;
else
break;
}
if(c>=3)
{
a[b]=2;
for(i=1;i<=c;i++)
a[b-i]=0;
a[b-c]=1;
}

for(i=0,c=0;i<b;i++)
{if(a[i]==a[i+1]==1)
c+=1;
else
break;
}
if(c>=3)
{for(i=0;i<=c;i++)
{a[i+1]=a[i];a[i+1]=0;}
a[i]=1;
a[c+1]=2;