2

我正在编写一个将八进制数转换为十进制和十六进制的程序。我写了一个函数,叫做OctToInt.

function OctToInt(Value: string): Longint;
var
  i: Integer;
  int: Integer;
begin
  int := 0;
  for i := 0 to Length(Value) do
  begin
    int := int * 8 + StrToInt(Copy(Value, i, 1));
  end;
  Result := int;
end; 

我以这种方式调用此函数:

var oct:integer;
begin
 oct:=OctToInt(Edit13.Text);
 Edit15.Text:=IntToStr(oct);
end;

当我输入34(八进制)时,十进制数应该是 28,但程序给了我 220。你知道为什么吗?

另外,您对转换器 OctToHex 有任何想法吗?

4

3 回答 3

7

此代码接受一个以 8 为基数的整数表示形式的字符串,并返回相应的整数:

function IntPower(const N, k: integer): integer;
var
  i: Integer;
begin
  result := 1;
  for i := 1 to k do
    result := result * N;
end;

function OctToInt(const Value: string): integer;
var
  i: integer;
begin
  result := 0;
  for i := 1 to Length(Value) do
    inc(result, StrToInt(Value[i]) * IntPower(8, Length(Value) - i));
end;

在将整数转换为十六进制字符串表示时,您已经拥有IntToHex.

于 2013-08-19T22:53:30.010 回答
7

您必须用 1 更改“your”的开头for

function OctToInt(Value: string): Longint;
var
  i: Integer;
  int: Integer;
begin
  int := 0;
  for i := 1 to Length(Value) do  //here you need 1, not 0
  begin
    int := int * 8 + StrToInt(Copy(Value, i, 1));
  end;
  Result := int;
end;

八进制-十六进制的转换可能很难做到,所以我建议你用另一种方式:

EditHexadecimal.Text:=(IntToHex(StrToInt(EditInteger.Text),8));  

正如您在此处看到的,使用此代码EditHexadecimal是您放置十六进制数字的编辑。使用该行,我将数字从十进制转换为十六进制。

您已经有了十进制数,因为您使用 function 获得了它OctToInt,因此您不需要更多代码。

于 2013-08-19T22:53:43.363 回答
0

我制作了这个公式,这样您就可以一次处理 3 位数的八进制数 - 它已经过从 000 到 777 的测试,可以完美地从八进制数生成十进制整数:

如果您的八进制数在变量oct 和临时占位符中o2

然后

(37 < oct % 100)*8 + int(0.08*(oct-(o2=oct%10))+0.7017)*8 + o2

如果您想在没有占位符的情况下进一步简化它,那么它

(37 < oct%100)*8 + int(0.7017+0.08*(oct-(oct%=10)))*8 + oct

  • “0.7017”可能是 sin(-10*π/8)or 1/sqrt(2),或者 just 2^(1/-2),但由于我通过回归找到了公式,我对此不是 100% 确定的。

另一个快速技巧是,如果所有 3 位数字都是相同的数字 - 222 333 555 等,只需取第一个数字,然后乘以 73(因为八进制中的 73 是 111)。2-6 个连续匹配数字的乘法器序列链是

9、73、585、4681、37449

(也发生在这个列表中,对于每个 x,其中一个{x-2,x+0,x+2}是素数

于 2021-08-25T10:30:24.003 回答