具体思想应该跟二分查找法差不多吧。给出n个已经排好序的数,在n/3和2n/3处各取一个数,跟待查的数比较,确定待查数所在的范围。编程复杂度应该比二分法大一些,因为需要考虑的情况很多,所以我就不写了。时间复杂度上,应该是一样大,系数在理想情况下三分法的平均值可能略好一些些(1和0.95的区别),但实际上,由于三分法需要考虑的情况很多,很难写出一个简洁的代码,很可能比二分法差。
#include <stdlib.h>#include <string.h>
#include <stdio.h>
int Three_Parties(char* data, int data_length)
{
typedef unsigned char UCHAR
int i, index
char* dict
UCHAR* polybius_index
//检查讯息的合法性
for(i = 0 i < data_length i++)
{
if(data[i] >= 'a' && data[i] <= 'z')
{
data[i] &= 0xDF //小写字母第5位置为0即变为大写
//data[i] -= 'a' - 'A' //这种写法也可以,但没有上一种效率高
}
else if(data[i] < 'A' || data[i] > 'Z')
{
//包含非字母的字符
return 1
}
}
dict = "LEOCBFQSTNARGHJUWXDVIKMPYZ/"
polybius_index = (UCHAR*)malloc(3 * data_length)
for(i = 0 i < data_length i++)
{
index = strchr(dict, data[i]) - dict
polybius_index[i] = index / 9
index %= 9
polybius_index[i + data_length] = index / 3
polybius_index[i + 2 * data_length] = index % 3
}
for(i = 0 i < 3 * data_length i += 3)
{
index = polybius_index[i]*9 + polybius_index[i+1]*3 + polybius_index[i+2]
data[i/3] = dict[index]
}
free(polybius_index)
return 0
}
int main(int argc, char* argv[])
{
char data[] = "helloworld"
if(Three_Parties(data, strlen(data)) == 0)
{
printf("%s", data)
}
else
{
printf("input error")
}
return 0
}
//加密部分还可以改成建索引表,那样效率会更高,但代码稍微复杂些。