热门标签 | HotTags
当前位置:  开发笔记 > 人工智能 > 正文

求一个Delphi算法:实现N位数(N<10)的任意排列组合

小弟昨天帮人问问题,可能发了个类似考题的东东,结果被老大给扣了,心想这道题用Delphi怎么来写,输入一个数,比如输入3,那么就是求3位数的任意排列组合,应该是10*10*101000个数,怎么写
小弟昨天帮人问问题,可能发了个类似考题的东东,结果被老大给扣了,心想这道题用 Delphi怎么来写,输入一个数,比如输入3,那么就是求3位数的任意排列组合,应该是10*10*10=1000个数,怎么写这个算法,并且把所有的结果显示出来,再说了N是变量

12 个解决方案

#1


列出从0-10^n-1的所有自然数

这也叫算法么?

#2


一个取巧的办法
uses math;
procedure TForm1.Button1Click(Sender: TObject);
var n,i:integer;
    m:string;
begin
  n:=3;
  m:=IntToStr(n);
  for i:=0 to Trunc(Power(10,n))-1 do
   Memo1.Lines.Add(Format('%'+m+'.'+m+'d',[i]));
end;

#3


liangqingzhi(老之) 
能给小弟解释一下吗?看不太懂,谢谢

#4


#5


没有环境,大概写了个思路,可以参考参考

const
  BasicNumber :Array [0..9] of Integer = [0,1,2,3,4,5,6,7,8,9];

procedure Parade(num :Integer; list :var TStringList);
var
  index, sindex :Integer;
  slist :TStringList;
begin
  slist := TStringList.Create();
  try
    if (num < 1) then
    begin
      //do nothing
    end else
    begin
      for index := 0 to 9 do
      begin
        for sindex := 0 to list.Count-1 do
        begin
          slist.add(list.Strings[sindex]+IntToStr(BasicNumer[index]));
        end;
      end;
      Parade(num-1, slist);
    end;

    if (slist.Count > 0) begin
      list.Clear();
      list.Text := slist.Text;
    end;

  finally
    slist.FreeAndNil();
  end;
end;

//test
procedure TForm1.Button1Click(Sender: TObject);
var
  num, index :Integer;
  list       :TStringList;
begin
  list := TStringList.Create();
  try
    //get input number
   try
      num := StrToInt(Exit1.Text);
   except
      num := 3; //default value
   end;

    //parade
    Parade(num, list);

    //show result
    for index := 0 to list.Count-1 do
    begin
      Memo1.Lines.Add(list.Strings[index]);
    end;

  finally
    list.FreeAndNil();
  end;

end;

#6


疏忽了个地方

procedure Parade(num :Integer; list :var TStringList);
var
  index, sindex :Integer;
  slist :TStringList;
begin
  slist := TStringList.Create();
  try
    if (num < 1) then
    begin
      //do nothing
    end else
    begin
      if (list.Count > 0) then
      begin
        for index := 0 to 9 do
        begin
          slist.add(IntToStr(BasicNumer[index]));
        end;
      end else
      begin
        for index := 0 to 9 do
        begin
          for sindex := 0 to list.Count-1 do
          begin
            slist.add(list.Strings[sindex]+IntToStr(BasicNumer[index]));
          end;
        end;
      end;
      Parade(num-1, slist);
    end;

    if (slist.Count > 0) begin
      list.Clear();
      list.Text := slist.Text;
    end;

  finally
    slist.FreeAndNil();
  end;
end;

#7


有点长,不过可以读读,先谢谢,在等等其他的方法

#8


感觉不就是一个N位随机数嘛,呵呵

#9


如果是全部枚举的话不就是。。。。
for i:=0 to 999 do
.....

#10


前面用case k of
   1: ..../9
   2:...../99
......

#11


找了台有delphi的机器测试了一下,把排列和组合都做了
关键是Parade和Combine函数,不是很复杂
以下是我测试的source

unit main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TMainForm = class(TForm)
    Label1: TLabel;
    Edit1: TEdit;
    Button1: TButton;
    Memo1: TMemo;
    RadioGroup1: TRadioGroup;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

const
  BASIC_NUM :Array [0..9] of String = ('0','1','2','3','4','5','6','7','8','9');
  //BASIC_OBJ :Array [0..4] of String = ('Red', 'Green', 'Blue', 'White', 'Black');
  AMOUNT_NUM :Integer = 10;
  //AMOUNT_OBJ :Integer = 5;
  PARADE_TYPE :Integer = 0;
  COMBINE_TYPE :Integer = 1;

  //排列(可以出现重复元素)
  procedure Parade(nBase :Integer; Var sList :TStringList); //关键处理
  //组合(不出现重复元素)
  procedure Combine(nBase :Integer; Var sList :TStringList); //关键处理

var
  MainForm: TMainForm;
  nProcessType :Integer;

implementation

{$R *.dfm}

procedure Parade(nBase :Integer; Var sList :TStringList);
var
  ssList :TStringList;
  nIdx, nSidx :Integer;
begin
  ssList := TStringList.Create;
  try
    if (nBase < 1) then
    begin
      //do nothing
    end else
    begin
      if (sList.Count = 0) then
      begin
        for nIdx := 0 to AMOUNT_NUM-1 do
          ssList.Add(BASIC_NUM[nIdx]);
      end else
      begin
        for nIdx := 0 to AMOUNT_NUM-1 do
          for nSidx := 0 to sList.Count-1 do
              ssList.Add(BASIC_NUM[nIdx]+sList.Strings[nSidx]);
      end;
      Parade(nBase-1, ssList);
    end;

    if ssList.Count > 0 then
    begin
      sList.Clear;
      sList.Text := ssList.Text;
    end;

  finally
    ssList.Free;
  end;
end;

procedure Combine(nBase :Integer; Var sList :TStringList);
var
  ssList :TStringList;
  nIdx, nSidx :Integer;
begin
  ssList := TStringList.Create;
  try
    if (nBase < 1) then
    begin
      //do nothing
    end else
    begin
      if (sList.Count = 0) then
      begin
        //for nIdx := 0 to AMOUNT_OBJ-1 do
        for nIdx := 0 to AMOUNT_NUM-1 do
          //ssList.Add(BASIC_OBJ[nIdx]);
          ssList.Add(BASIC_NUM[nIdx]);
      end else
      begin
        //for nIdx := 0 to AMOUNT_OBJ-1 do
        for nIdx := 0 to AMOUNT_NUM-1 do
          for nSidx := 0 to sList.Count-1 do
            //if (Pos(BASIC_OBJ[nIdx], sList.Strings[nSidx]) = 0) then
            if (Pos(BASIC_NUM[nIdx], sList.Strings[nSidx]) = 0) then
              //ssList.Add(BASIC_OBJ[nIdx]+','+sList.Strings[nSidx]);
              ssList.Add(BASIC_NUM[nIdx]+sList.Strings[nSidx]);
      end;
      Combine(nBase-1, ssList);
    end;

    if ssList.Count > 0 then
    begin
      sList.Clear;
      sList.Text := ssList.Text;
    end;

  finally
    ssList.Free;
  end;
end;

procedure TMainForm.FormCreate(Sender: TObject);
begin
  Edit1.Text := '3';
  Memo1.Lines.Clear;
  RadioGroup1.ItemIndex := 0;
  nProcessType := 0;
end;

procedure TMainForm.Button1Click(Sender: TObject);
var
  sBase :String;
  nBase :Integer;
  sList :TStringList;
begin
  sBase := Trim(Edit1.Text);
  if sBase = '' then
  begin
    ShowMessage('Please input a basic number');
    Edit1.SetFocus;
    exit;
  end;
  try
    nBase := StrToInt(sBase);
  except
    nBase := 0;
  end;

  Memo1.Lines.Clear;
  nProcessType := RadioGroup1.ItemIndex;
  sList := TStringList.Create;
  try
    if nProcessType = PARADE_TYPE then
      Parade(nBase, sList)
    else
      Combine(nBase, sList);
    Memo1.Lines.Text := sList.Text;
    Memo1.Lines.Add('Total: '+FloatToStr(Memo1.Lines.Count));
  finally
    sList.Free;
  end;

end;

end.

#12


qybao(阿宝) 
谢谢你,你真的很棒

推荐阅读
  • 使用Numpy实现无外部库依赖的双线性插值图像缩放
    本文介绍如何仅使用Numpy库,通过双线性插值方法实现图像的高效缩放,避免了对OpenCV等图像处理库的依赖。文中详细解释了算法原理,并提供了完整的代码示例。 ... [详细]
  • 非公版RTX 3080显卡的革新与亮点
    本文深入探讨了图形显卡的进化历程,重点介绍了非公版RTX 3080显卡的技术特点和创新设计。 ... [详细]
  • 线性Kalman滤波器在多自由度车辆悬架主动控制中的应用研究
    本文探讨了线性Kalman滤波器(LKF)在不同自由度(2、4、7)的车辆悬架系统中进行主动控制的应用。通过详细的仿真分析,展示了LKF在提升悬架性能方面的潜力,并总结了调参过程中的关键要点。 ... [详细]
  • 本文探讨了Hive中内部表和外部表的区别及其在HDFS上的路径映射,详细解释了两者的创建、加载及删除操作,并提供了查看表详细信息的方法。通过对比这两种表类型,帮助读者理解如何更好地管理和保护数据。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • C++实现经典排序算法
    本文详细介绍了七种经典的排序算法及其性能分析。每种算法的平均、最坏和最好情况的时间复杂度、辅助空间需求以及稳定性都被列出,帮助读者全面了解这些排序方法的特点。 ... [详细]
  • 本文介绍如何利用动态规划算法解决经典的0-1背包问题。通过具体实例和代码实现,详细解释了在给定容量的背包中选择若干物品以最大化总价值的过程。 ... [详细]
  • 本文详细探讨了Java中的24种设计模式及其应用,并介绍了七大面向对象设计原则。通过创建型、结构型和行为型模式的分类,帮助开发者更好地理解和应用这些模式,提升代码质量和可维护性。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 题目描述:给定n个半开区间[a, b),要求使用两个互不重叠的记录器,求最多可以记录多少个区间。解决方案采用贪心算法,通过排序和遍历实现最优解。 ... [详细]
  • 深入理解C++中的KMP算法:高效字符串匹配的利器
    本文详细介绍C++中实现KMP算法的方法,探讨其在字符串匹配问题上的优势。通过对比暴力匹配(BF)算法,展示KMP算法如何利用前缀表优化匹配过程,显著提升效率。 ... [详细]
  • 探讨一个显示数字的故障计算器,它支持两种操作:将当前数字乘以2或减去1。本文将详细介绍如何用最少的操作次数将初始值X转换为目标值Y。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 本文探讨如何设计一个安全的加密和验证算法,确保生成的密码具有高随机性和低重复率,并提供相应的验证机制。 ... [详细]
  • 深入解析:手把手教你构建决策树算法
    本文详细介绍了机器学习中广泛应用的决策树算法,通过天气数据集的实例演示了ID3和CART算法的手动推导过程。文章长度约2000字,建议阅读时间5分钟。 ... [详细]
author-avatar
双鱼獒主
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有