标志法通常用来检查或者进行过程中一些状态变化。
有一些是为了观察变化,举出一些以往代码的例子:
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就被赋值为变化后的值。