计算机采用补码运算的目的是

1.题目描述 假定一种编码的编码范围是a~y的25个字母,从1位到4位的编码,如果我们把该编码按字典序排序,形成一个数组如下: a,aa,aaa,aaaa,aaab,aaac,…,…,b,ba,

1.题目描述

假定一种编码的编码范围是a~y的25个字母,从1位到4位的编码,如果我们把该编码按字典序排序,形成一个数组如下:
a,aa,aaa,aaaa,aaab,aaac,…,…,b,ba,baa,baaa,baab,baac,… …,yyyw,yyyx,yyyy。其中a的Index为0,aa的Index为1,aaa的Index为2,以此类推。

编写一个函数,输入是任意一个编码,输出这个编码对应的index,如:

输入:baca

输出:16331

2.题目分析

例如:我们来分析一下以字母a开头的排列组合

{
    {a,aa,aaa,aaaa,aaab,aaac,...,aaay}
    {aab,aaba,aabb,aabc,...,aaby}
    {...}
    {aay,aaya,aayb,...,aayy}
    {ab,aba,abaa,abab,...,abay}
    {...}
    {ay,aya,ayaa,ayab,...,ayay}
    {...}
    {ayyy}
}

若首字母为a共有多少种组合:
①a 1种
②a _ 25种
③a _ _ 25x25种
④a _ _ _25x25x25种
若第二个字母为a共有多少种组合:
① _a_ 1种
②_a _ 25种
③_a _ _ 25x25种
若第三个字母为a共有多少种组合:
①_ _a 1种
② _ _a _ 25种
若第四个字母为a共有多少种组合:
① _ _ _a 1种

所以当baca时以b开头时,前面有a开头(b-a)*(1+25+25*25+25*25825),第二位是a,(a-a)*(1+25+25*25)+1(但不能为空),第三位为c,(c-a)*(1+25)+1,第四位为a,(a-a)*(1)+1
baca=(1+25+2525+252525)+1+2x(1+25)+1=16331

3.code

#include<stdio.h>

int CreateIndex(const char* str)
{
	if (str == NULL)	return -1;

	int carry[4] = {
		1 + 25 + 25 * 25 + 25 * 25 * 25,
		1 + 25 + 25 * 25,
		1 + 25,
		1
	};
	int Index = 0;

	for (int i = 0; i < 4;++i)
	{
		if (str[i] >= 'a' && str[i] <= 'y')
		{
			Index = Index + (str[i] - 'a') * carry[i];
			if (i != 0)	++Index;
		}
	}
	return Index;
}
int main()
{
	const char* arr = "baca";
	int res = CreateIndex(arr);
	printf("%d\n", res);
	return 0;
}

知秋君
上一篇 2024-08-27 15:48
下一篇 2024-08-27 15:12

相关推荐