【问题标题】:How to find the numbers in the thousands, hundreds, tens, and ones place in DELPHI for an input number? For example: 155 has 5 ones, 5 tens, etc如何在DELPHI中查找输入数字的千位、百位、十位和个位中的数字?例如:155有5个1,5个10等
【发布时间】:2021-05-08 10:52:34
【问题描述】:
var 
  iNum, iNumHun, iNumTens, iNumOnes : Integer;

begin

iNum := StrToInt(edtInput.Text);

iNumHun := iNum DIV 100;

iNumTens := iNum DIV 10;

iNumOnes = iNum DIV 1;

【问题讨论】:

  • 显然这行不通,因为例如 155 DIV 10= 15,那么我应该怎么做才能让它工作呢?
  • 使用文本操作实际上可能更有效
  • @DavidHeffernan:是的,那么也许您每秒可以执行 20000000 次,而不仅仅是 10000000 次! (好吧,不打算使用阶乘。)
  • 只需使用MOD 和DIV 的组合。例如,对于数百个,您可以使用iNumHun := iNum MOD 1000 DIV 100; 或iNumHun := iNum DIV 100 MOD 10;。

标签: delphi math digits


【解决方案1】:

您非常接近解决方案。实际上,您需要在每次迭代时迭代并将数字除以 10。唯一缺少的是您需要提取最低有效数字。为此,您可以使用mod 运算符:

program Digits;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils;

var
  x, p: Integer;

begin
  while True do
  begin
    Writeln('Enter a non-negative integer:');
    Readln(x);
    p := 1;
    while x <> 0 do
    begin
      Writeln('position ', p, ': ', x mod 10);
      x := x div 10;
      Inc(p);
    end;
    Writeln('---');
  end;
end.

Enter a non-negative integer:
155
position 1: 5
position 2: 5
position 3: 1
---
Enter a non-negative integer:
653281205
position 1: 5
position 2: 0
position 3: 2
position 4: 1
position 5: 8
position 6: 2
position 7: 3
position 8: 5
position 9: 6
---

【讨论】:

  • 为什么不直接使用文本操作呢?特别是如果我们从十进制表示开始。为什么先转换成二进制再转换成十进制?
  • @DavidHeffernan:我不太喜欢在不需要时使用文本表示。此外,在 OP 的示例中,输入是十进制字符串,但我敢打赌人们会从 Google 找到这个 SO Q&A 并将其应用于他们的(非文本)整数值。最后,我发现指出 OP 非常接近(通常非常体面的)解决方案具有教学价值。
  • 另外,如果输入是523 362 102 或523 362 102 怎么办?将其实际解析为整数更安全。 (尝试双击每个数字中的 362。)
【解决方案2】:
program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils;

type
  TSplitNumber=record
  type
    TDigits = -1..9;
  private
    data: integer;
    function GetDigit(Idx: word): TDigits;
  public
    property digit[Idx: word] : TDigits read GetDigit;
    class operator Implicit(const nr: integer): TSplitNumber;
    class operator Implicit(const snr: TSplitNumber): integer;
  end;

{ TSplitNumber }

function TSplitNumber.GetDigit(Idx: word): TDigits;
var
  Pow :integer;
begin

  Result := Low(TDigits);
  Pow    := round(Power10(10, Idx-2));
  // position 0, impossible 
  //              Value -1 or 0, that is the question
  if (Idx = 0) or (Pow > ABS(data)) then
    Exit;
  Result := (data div Pow) mod 10;
  Result := ABS(Result);
end;

class operator TSplitNumber.Implicit(const snr: TSplitNumber): integer;
begin
  Result := snr.data;
end;

class operator TSplitNumber.Implicit(const nr: integer): TSplitNumber;
begin
  Result.data := nr;
end;

var
  i: integer;
  q: TSplitNumber;

begin
  try
    i := -123;
    q := i;
    i := q.digit[0]; //-1
    i := q.digit[1]; //3
    i := q.digit[2]; //2
    i := q.digit[3]; //1
    i := q.digit[4]; //-1
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.

【讨论】:

    猜你喜欢
    • 2015-12-21
    • 2015-10-26
    • 1970-01-01
    • 2016-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-13
    • 1970-01-01
    相关资源
    最近更新 更多