二次平均法的算法问题,高分.好算法补充加分!!!!!!!!!!!!!!!!

ddvboy 2009-06-15 11:22:34
报名的有可能3到十几家不等,他们的报价要和标底比,每百分之一为一档次,同在百分之一内的几家取个平均值,然后在计算机不同百分区域的平均值.举例说:系统取出data.ADOQuery_jl.RecordCount个单位报名.分别报价为1000,1002,1005,1300,1301,970,971而标底是999那么前面三个报价(1000,1002,1005)和标底比在一个百分之一的区域,把他们三个取出来做个平均值,中间两个(1300,1301)同标底也在同一百分之一内的区域取出来做个平均直,后两个(970,971)再做个平均值.然后再把得出的三个平均值再平均.
高分请教哦.把投标报价按data.ADOQuery_kbjl.fieldbyname('tbbj').asfloat的形式写出来.代码写的越清楚分越高哦.
...全文
383 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
yuyuhaso 2009-06-16
  • 打赏
  • 举报
回复
这个帖子发到数据库版会更加迅速的被解决
水如烟 2009-06-15
  • 打赏
  • 举报
回复
1、排序
2、取最大数与基数对比,看看要分配几个抽屉
3、将这些数放进相应的抽屉
4、算各抽屉的平均值
5、算总平均值

总平均值跟直接算平均值一个样
majianan 2009-06-15
  • 打赏
  • 举报
回复
这个帖子为什么被推荐?
bdmh 2009-06-15
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 dinoalex 的回复:]
SQL code
select value from dbo.TBJG
/*
970.0
971.0
1000.0
1002.0
1005.0
1300.0
1301.0
*/

select avg(value) from dbo.TBJG group by substring(cast((value/999) as varchar),1,4)

/*
970.5
1002.3333333333334
1300.5
*/

select avg(t.value) from
(select avg(value) as value,1 as thelevel
from dbo.TBJG
group by substring(cast((value/999) as varchar),1,4)) t group by thelevel

[/Quote]

,楼主,这样的sql你总该会写吧
dinoalex 2009-06-15
  • 打赏
  • 举报
回复
[Code=SQL]
select value from dbo.TBJG
/*
970.0
971.0
1000.0
1002.0
1005.0
1300.0
1301.0
*/

select avg(value) from dbo.TBJG group by substring(cast((value/999) as varchar),1,4)

/*
970.5
1002.3333333333334
1300.5
*/

select avg(t.value) from
(select avg(value) as value,1 as thelevel
from dbo.TBJG
group by substring(cast((value/999) as varchar),1,4)) t group by thelevel

-- 1091.1111111111111

[/Code]
bdmh 2009-06-15
  • 打赏
  • 举报
回复
楼主同志,象你这样最多才十几条记录的情况,一个循环判断足可以满足你的需要了,要知道算法及效率不是绝对的,一个好的算法,对于不同的情况未必就能提高你效率,可能恰恰相反

比如对于查找算法(你这里应该也会用到),你能肯定的说顺序查找和二分法查找,谁的效率高吗?这要根据你查找的值来决定
一个上千万条记录的列表,如果你查找的数值正好在中间,那你是中了彩票了,二分法效率齐高无比,如果你找的数值是列表中的第一个,那么二分法和顺序查找法相比还有效率可言吗

你的这个问题完全可以通过sql和存储过程解决,没必要放到delphi里,来找一个所谓的高效率算法,看你是DB2板块的,想必对sql和存储过程应该很熟悉了
gleen 2009-06-15
  • 打赏
  • 举报
回复
学习 学习
dinoalex 2009-06-15
  • 打赏
  • 举报
回复
[Code=SQL]
select value from dbo.TBJG
/*
970.0
971.0
1000.0
1002.0
1005.0
1300.0
1301.0
*/

select avg(value) from dbo.TBJG group by substring(cast((value/999) as varchar),1,4)

/*
970.5
1002.3333333333334
1300.5
*/
[/Code]
陌上花花 2009-06-15
  • 打赏
  • 举报
回复
帮顶
constantine 2009-06-15
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 ddvboy 的回复:]
我就是让你们写出来怎么做循环把这算法写出来.你们不懂就别乱回答!
[/Quote]
lz很牛!

[Quote=引用 2 楼 xinxinshou2009 的回复:]
(1000+1002+1005+1300+1301+970+971)/7=?

如果楼主需要中间结果,另当别论,如果只是需要最终结果,还是这个算法最简单,何必玩那么多花样?
[/Quote]
并不一样。
ddvboy 2009-06-15
  • 打赏
  • 举报
回复
也就是用代码写出来,TBBJ.是没个单位的投标报价
xinxinshou2009 2009-06-15
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 ddvboy 的回复:]
我就是让你们写出来怎么做循环把这算法写出来.你们不懂就别乱回答!
[/Quote]


这年头,提问的比回答的还牛!这么简单的问题都要问,而且是这么牛的提问,真不知道你那么多技术分是怎么得来的。鄙视
bdmh 2009-06-15
  • 打赏
  • 举报
回复
不明白'把投标报价按data.ADOQuery_kbjl.fieldbyname('tbbj').asfloat的形式写出来'这句话什么意思
xinxinshou2009 2009-06-15
  • 打赏
  • 举报
回复
(1000+1002+1005+1300+1301+970+971)/7=?

如果楼主需要中间结果,另当别论,如果只是需要最终结果,还是这个算法最简单,何必玩那么多花样?
xinxinshou2009 2009-06-15
  • 打赏
  • 举报
回复
楼主的这个题目,很有意思。不知道那么麻烦的算法,和把所有数值加起来求平均,有什么差别?结果都是一样的
骑牛上铂金 2009-06-15
  • 打赏
  • 举报
回复
学习!
dinoalex 2009-06-15
  • 打赏
  • 举报
回复
用程序写,可以用树型来处理吖,如

0.97 -| // 前四位是级别,后四位是平均数 都是用 Double和string互转
|_970
|_971


如 970 /999 得出后到父节点,没有即新建父节点,再把970插入子节点.

最后...
亮剑_ 2009-06-15
  • 打赏
  • 举报
回复
最下面mmo2一段是测试时显示用的,去掉吧
到ShowMessage就行了

补充一下,其中RightNum就是“标底”了,定义如下:

const
RightNum = 99;
亮剑_ 2009-06-15
  • 打赏
  • 举报
回复
参考代码,不过报价是按整数来的,呵

procedure TForm1.btn2Click(Sender: TObject);
var
i, j, nSum, nCount: Integer;
fSum: Double;
GroupList: array [0..99] of TStringList; //报价分区间
AvgList: array [0..99] of Double; //每个区间的报价平均值
begin
//分组
for i := Low(GroupList) to High(GroupList) do
GroupList[i] := TStringList.Create;
for i := 0 to data.ADOQuery_jl.RecordCount - 1 do
begin
j := Trunc(Abs((StrToInt(NumList[i]) / RightNum) * 100 - 100)) - 1;
GroupList[j].Add(data.ADOQuery_jl.FieldByName('tbbj').AsString);
end;


//计算
for i := Low(GroupList) to High(GroupList) do
begin
AvgList[i] := 0;
if GroupList[i].Count > 0 then
begin
nSum := 0;
for j := 0 to GroupList[i].Count - 1 do
nSum := nSum + StrToInt(GroupList[i][j]);
AvgList[i] := nSum / GroupList[i].Count;
end;
end;

fSum := 0;
nCount := 0;
for i := Low(AvgList) to High(AvgList) do
if AvgList[i] > 0 then
begin
nCount := nCount + 1;
fSum := fSum + AvgList[i];
end;
ShowMessage(FloatToStr(fSum / nCount));

mmo2.Lines.Clear;
for i := Low(GroupList) to High(GroupList) do
if GroupList[i].Count > 0 then
mmo2.Lines.Add(GroupList[i].CommaText)
else
mmo2.Lines.Add('...');
end;
mathsfan 2009-06-15
  • 打赏
  • 举报
回复
呵呵:)
加载更多回复(1)

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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