对于一个给定的规则,如AABAB (该规则表示字符串的第1,2,4为必须相等,第3,5为必须相等),当然这是规则之一!现在将从00000 - 99999中将符合规则(“AABAB”)的数字列出:
则她可能是:
00101
00202
...
44606
...
88909
...当规则为“AAABB”的话,则这些数字可能为
00011
00022
00033
...
44488
...
66699
...请问,这样的算法应该怎么实现?不管采用何种语言来实现!
则她可能是:
00101
00202
...
44606
...
88909
...当规则为“AAABB”的话,则这些数字可能为
00011
00022
00033
...
44488
...
66699
...请问,这样的算法应该怎么实现?不管采用何种语言来实现!
for(int j=0;j<10;j++)
if(i!=j)
printf("%d%d%d%d%d\n",i,i,,j,i,j);这就是你那个AAABAB的算法。其它的依葫芦画瓢
比如说取个位就是nNum-(int(nNum/10))*10,不知道是不是符合你的要求
for(int j=0;j<10;j++)
if(i!=j)
printf("%d%d%d%d%d\n",i,i,j,i,j);这就是你那个AABAB的算法。其它的依葫芦画瓢
char rule[5];//规则字符串
int answer[5];//结果
int flag[5];
void Test( char *ptr)
{ int i=0;
while(ptr!='\0')
{
swith(*ptr)
case: "A" flag[i++]=0;continue;
case: "B" flag[i++]=1; continue;
}
}
main()
{
Test(rule);
for(int j=0;j<9;j++)
for(int i=0;i<9;i++)
{if(i==j) countinue;
for(int k=0;k<5;k++)
{ if(flag[k])
answer[k]=j;
else answer[k]=i;
cout<<........ ; //输出answer
}
}
}
写个思路, 没有调式的哦
你根本不知道用户所输入的是什么规则,怎么能按上面的方式去做?
思路:不妨称00000~99999为目标码,称AAABB为特征码,其中有两个不同的码字A和B。
首先找出特征码中所有不同的码字,并为其分配码值,码值取目标码中相应位的数值。
判断方法:当不同特征码存在相同码值时,目标码不符;当目标码与对应位的特征码值不同时,不符。
*/
//附源码——可以优化:一次性取得所有不同特征码字,循环处理时分配码值
#define MAXLEN 5
void CTestDlg::OnDo()
{
char standard[MAXLEN+1]="ABABA";//注意限定长度
char source[MAXLEN+1];
char record[MAXLEN];
char value[MAXLEN];
int total,count;
//总循环:处理每一个数值
for(int i=0;i<19999;i++)
{
//转成字符,便于处理
sprintf(source,"%05d",i);//注意限定长度
total=0;//是否提前终止判断
count=0;//判断标准中的不同特征码记数
//循环处理判断标准中每一位特征码
for(int j=0;j<strlen(standard)&&total==0;j++)
{
//判断当前特征码是否重复
for(int k=0;k<count;k++)
{
if(record[k]==standard[j])
break;
}
if(k==count)//不重复则添加
{
record[k]=standard[j];
value[k]=source[j];
//判断当前特征码的码值是否重复,不同特征码的码值不能重复,否则判断失败
for(k=0;k<count;k++)
if(value[k]==source[j])
{
j=strlen(standard);//结束外层循环
total=-1;
break;//退出当前循环
}
count++;
}
else//重复则判断
{
//如果total不为0,表示当前位不符合判断标准
total=source[j]-value[k];
}
}
if(total==0)
AfxMessageBox(source);
else SetWindowText(source);
}
}
代码实在没空写,因为字符串可以判断长度,根据组合数计算,可以算
出比较循环和次数和位置。所以可以做到,如果只是用 AABAA这样的类似定义规则,判断字符串的长度,
使任意两个字符比较结果跟对应数字位置比较结果一致,不一致则剔除。
{
for(int i=0;i<10;i++)
for(int j=0;j<10;j++)
if(i!=j)
printf("%d%d%d%d%d\n",flag[0]?i:j,flag[1]?i:j,flag[2]?i:j,flag[3]?i:j,flag[4]?i:j);
}
printAB(BOOL flag[MAX],int len) //A: true, B: false
{
for(int i=0;i<10;i++)
for(int j=0;j<10;j++)
{
for(int k=0;k<len;k++)
if(i!=j) printf("%d",flag[k]?i:j);
printf("\n");
}
}
{
for(int i=0;i<10;i++)
for(int j=0;j<10;j++)
{
for(int k=0;(k<len)&&(AB[k] != '\0');k++)
if(i!=j) printf("%d",(AB[k]=='A')?i:j);
printf("\n");
}
}
然后根据给定的规则,在相应的位置填充字符