关于非等差数列的问题

kayoo 2012-02-10 05:02:56
假设当X=1 2 3 4 5 6 7 8 9 10的时候
Y分别等于10 25 35 40 52 68 78 82 90 100
现在要求,当X为小数时,Y则平均分其中的差量。
举个例子,当X=4.5时,因为4和5之间相差了12,所以Y此时等于46。当X=9.5时,因为9和10之间相差了10,所以Y=95
依此类堆。请给出最合理最简洁的代码,因为数据有很多。
顺便要求对Y值四舍五入取整。谢谢,不胜感激!
...全文
126 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
lzg827 2012-02-13
  • 打赏
  • 举报
回复
发了,好牛X的QQ号
kayoo 2012-02-13
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 lzg827 的回复:]
不好意思,今天才想起来,让你坐等一天。。。。
下面是代码,要运行程序可以留个邮箱,我全部发你。
输入的有效性判断没怎么做,功能问题应该差不多了
有问题再联系,记得多给点分我哈,最好全部,嘿嘿


Delphi(Pascal) code


unit UMain;

interface

uses
Windows, Messages, SysUtils, Varian……
[/Quote]
谢谢,不胜感激,我邮箱一零九九七三#qq.com 帮我发一份吧,拜托了。大写数字换成阿拉伯数字即可。
kayoo 2012-02-12
  • 打赏
  • 举报
回复
4楼大哥,坐等你的代码啊。。
lzg827 2012-02-12
  • 打赏
  • 举报
回复
不好意思,今天才想起来,让你坐等一天。。。。
下面是代码,要运行程序可以留个邮箱,我全部发你。
输入的有效性判断没怎么做,功能问题应该差不多了
有问题再联系,记得多给点分我哈,最好全部,嘿嘿


unit UMain;

interface

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

type
TFrmMain = class(TForm)
Label1: TLabel;
Edt_Num: TEdit;
Label2: TLabel;
Edt_SeqShow: TEdit;
Btn_CreatSeq: TButton;
Label3: TLabel;
Edt_X: TEdit;
Label4: TLabel;
Edt_Y: TEdit;
Btn_GetY: TButton;
procedure Btn_CreatSeqClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Btn_GetYClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
FrmMain: TFrmMain;
Seq: array of Integer;

const
EmptyStr = '';
BlankStr = ' ';
ErrInput = '输入X不合法';


implementation

{$R *.dfm}

procedure TFrmMain.Btn_CreatSeqClick(Sender: TObject);
var
n,i,m: integer;
TemStr: string;
begin
n := StrToInt(Trim(Edt_Num.Text));
SetLength(Seq,n);

m := n*20; //构造随机数的范围,暂时将个数乘20,尽量避免重复。
for i := 0 to n - 1 do
begin
Seq[i] := random(m);
end;

TemStr := EmptyStr;
for i := 0 to n - 1 do
begin
TemStr := IntToStr(Seq[n - 1-i]) + BlankStr +TemStr;
end;

Edt_SeqShow.Text := TemStr;
end;

procedure TFrmMain.Btn_GetYClick(Sender: TObject);
var
TemStr: String;
TemZS: string; //整数部分
IntTemZS: integer;
IntX,IntY: integer;
i: Integer;
SeqNum: Integer;
TemY: Double;
begin
TemStr := Trim(Edt_X.Text);
SeqNum := length(Seq);
i := Pos('.',TemStr);

if i > 0 then
begin //有小数的情况
TemZS := Copy(TemStr,1,i-1);
IntTemZS := StrToInt(TemZS);

if SeqNum > IntTemZS then
begin
TemY := (Seq[IntTemZS-1] + Seq[IntTemZS])/2;
IntY := Trunc(TemY + 0.5);
Edt_Y.Text := IntToStr(IntY);
end
else
ShowMessage(ErrInput);
end
else
begin //没有小数的情况
IntX := StrToInt(TemStr);
if SeqNum >= IntX then
begin
IntY := Seq[IntX-1];
Edt_Y.Text := IntToStr(IntY);
end
else
ShowMessage(ErrInput);
end;
end;

procedure TFrmMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Finalize(Seq);
end;

end.
lzg827 2012-02-11
  • 打赏
  • 举报
回复
楼上的不对吧。
应该用二维数组或者两个数组
分整数和小数的情况计算Y的值。

整数时,Y等于下标相同的X数组中的值
小数时,Y等于对应两个相邻下标的平均值

代码明天写,太困了。周末愉快。
notebook800 2012-02-10
  • 打赏
  • 举报
回复
const
a: array[1..10] of Real = (10, 25, 35, 40, 52, 68, 78, 82, 90, 100);
var
x, y: Real;
index: Integer;
begin
x := 4.5;
index := trunc(x); //取出下标
y := a[index] + (a[index + 1] - a[index]) * (x - index);
y := Round(y); //对Y值四舍五入取整
ShowMessage(FloatToStr(y));
end;
我看见佛 2012-02-10
  • 打赏
  • 举报
回复
顶一下
山东蓝鸟贵薪 2012-02-10
  • 打赏
  • 举报
回复
应该是个算法的问题吧

5,939

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧