又一道外企面试题,大家给看看.从CSDN看来的,大家看看能不能实现用DELPHI,(0分)

  • 主题发起人 主题发起人 fengfan
  • 开始时间 开始时间
F

fengfan

Unregistered / Unconfirmed
GUEST, unregistred user!
昨天去面试人家出了这样一道题,觉得挺简单的,但就是编不出来,只好麻烦各位高手了。~v~
给定两个正整数m,n(m>=n!),将m拆成n个数相加:m=a(1)+a(2)+...+a(n),使之满足:
a(1)<a(2)<...<a(n);
编成列出所有的拆法.
例如:若m=7,n=3则只有一种拆法:
7=1+2+4

是在CSDN看到的,他们用C++实现,可是我看不懂,因此发过来,看看在这里有没有能
 
不知他们用C是怎样实现的,我是这样实现的:
#include<iostream.h>
const int M=20;
const int N=4;
static int Num[N];
void GetNum(int SumNum,const int m,const int n,int l)
{
int i,j;
for(i=l;i<=m-n;i++)
{
if ((l>1) &&
(i<=Num[l-2]))
continue;
Num[l-1]=i;
if (l!=n)
GetNum(SumNum+i,m,n,l+1);
else
if (SumNum+i==m)
{
for(j=0;j<n;j++)
cout<<Num[j]<<" ";
cout<<"/n";
}
}
}
void main()
{
GetNum(0,M,N,1);
}
用Delphi只要转换一下
program Project2;
{$APPTYPE CONSOLE}
uses SysUtils;
const
M=20;
N=4;
var
Num:Array[0..N-1] of Integer;
Procedure GetNum(SumNum:Integer;
m:Integer;n:Integer;l:Integer);
var
i,j:Integer;
begin
for i:=l to m-n do
begin
if ((l>1) and (i<=Num[l-2])) then
continue;
Num[l-1]:=i;
if (l<>n) then
GetNum(SumNum+i,m,n,l+1)
else
if (m=(SumNum+i)) then
begin
for j:=0 to n-1 do
begin
write(Num[j]);
write(' ');
end;
writeln('');
end;
end;
end;
begin

// Insert user code here
GetNum(0,M,N,1);
readln;
end.
更大的数我就没测试了。
 
unit unit1;
interface;
uses
……
……
a: array of integer;
//a 是一个动态的整型数组,全局
procedure GetNum(M, N: integer);
//求 数组a;
……
……
implement
……
procedure TForm1.GetNum( M, N: integer);
var sum, i: integer;
function JC( N: integer): integer;
begin
……
//写一个阶乘函数
end;
begin
if Int1 >= JC( N ) then
begin
SetLength(a, N );
for i := Low(a) to High(a) do
begin
a := i+1;
sum := sum + a;
end;
if M > 1 then
a[N-1] := a[N-1] + M - sum;
end;
end;

//自己随便用个什么把 a 显示出来就行了。
end;
 
很明显百钱买百鸡的问题嘛,只不过变了一下形式而已。
编程教科书上应该有例子。
 
终于搞定了,花了两个小时[:D]
Aking:求出来的数似乎不全啊
program Project3;
{$APPTYPE CONSOLE}
uses
SysUtils;
var
m,n,p:integer;
num:array of integer;
procedure display();
var
i:integer;
begin
for i:=0 to n-1 do
begin
write(num);
write(' ');
end;
writeln(' ');
end;

procedure getnum(const j,k,MinNum:integer);
var
i:integer;
begin
if k=2 then
begin
for i:=MinNum to j do
begin
if i<j-i then
begin
num[n-1]:=j-i;
num[n-2]:=i;
display();
end;
end;
end
else
begin
for i:=MinNum to j do
begin
num[n-k]:=i;
getnum(j-i,k-1,i+1);
end;
end;
end;

begin
write('please input m:');
readln(m);
write('please input n:');
readln(n);
//检查输入合法性
setlength(num,n);
for p:=0 to n-1 do
num[p]:=p+1;
getnum(m,n,1);
readln;
end.
 
to Aking:sorry,是我弄错了[:)][:)][:)]
 
接受答案了.
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
836
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
后退
顶部