标志法通常用来检查或者进行过程中一些状态变化。
有一些是为了观察变化,举出一些以往代码的例子:
1.找出一串数字中没有重复出现过的数字
#include <stdio.h>
int main()
{
int arr[1000] = { 0 };
int n = 0;
scanf("%d", &n);
int i = 0;
for (i = 0; i < n; i++)
{
scanf("%d", &arr[i]);
}
int j = 0;
for (i = 0; i < n; i++)
{
int flag = 1;
for (j = 0; j < n; j++)
{
if (i != j)
{
if (arr[i] == arr[j])
{
flag = 0;
}
}
}
if (flag)
{
printf("%d ",arr[i]);
}
}
return 0;
}
这里的flag就是用来检查是否有相同数字的,如果有相同的数字,就将检查结果判为0,如果没有相同的数字,检查结果就为1。这里便是用flag来观察是否有相同数字的。
2.判断素数
这里的flag用来检测i是否被某个数整除,如果被整除,flag就变成0,一直不被整除,说明i是素数。这里的flag就是用来观察并判断i是否被整除。
有时候标志法还可以进行一些中途的变化,建立一个标志,有时候能完成一些变量的指定变化,省略很多分支。
比如,洛谷题压缩技术2.0
#include <stdio.h>
#include <string.h>
int main()
{
char str[200] = { 0 };
char arr[200] = { 0 };
scanf("%s", arr);
int n = strlen(arr);
strcat(str, arr);
int i = 0;
for (i = 2; i <= n; i++)
{
scanf("%s", arr);
strcat(str, arr);
}
printf("%d ", n);
char* p = str;
char ch = *p;
int count = 0;
while (*p != '\0')
{
if (*p == ch)
{
count++;
}
if (*p != ch)
{
printf("%d ", count);
count = 1;
ch = *p;
}
p++;
}
printf("%d ", count);
return 0;
}
这里的ch在起初被赋值为数组的首元素,当连续的元素的值发生变化时,ch就被赋值为变化后的值。