对于算法,我真的没头脑,继续开贴,继续等待!

我说我行就是行 2011-04-01 10:10:32
上一篇帖子的第四个问题的算法始终没思路搞!继续发帖,继续征求思路,继续征求代码



问题:这些是各个用户所选的号码,根据期数来判断用户是否得分
期数进行比较,
如果是:0+1,1+1,2+1,得5分,
如果是:4+0,3+1 得20分
如果是:4+1,5+0 得100分
如果是:5+1 得300分
如果是:6+0 得500分
如果是:6+1 得1000分


求代码,求思路



ps:祝大家愚人节快乐!
...全文
274 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
xxoo2007 2011-04-08
  • 打赏
  • 举报
回复
建立中间表转换一下。
R1 R2 R3 R4 R5 R6 B1 qishu UserName
1 0 1 0 0 0 1 1003526 张三
1表示中了,0表示不中。 简单的理解就是把结果转换判定一下。

转换过程用存储过程,数据库函数,net脚本都能做到。

然后的语法就好写了。
select R1+R2+...R6 as A1, B1,qishu,UserName from table

或者

select case
when R1+R2+...R6 = 0 and B1 = 1 then 5
when R1+R2+...R6 = 1 and B1 = 1 then 5
。。。
when R1+R2+...R6 = 6 and B1 = 1 then 1000
else 0
end ,
qishu,UserName from table
  • 打赏
  • 举报
回复
啊。我已经没救了,代码都不会写了,头脑晕的一米

只好再次请教各位大侠,希望能把三层的源码(或者直接在aspx的后台写sql语句都可以)发一下,我真的是不会写,而且我不喜欢使用存储过程,主外键也不喜欢使用,所以我建立了三张表,楼上的几位给出的sql语句,我也测试了,但是不会在c#代码中使用,给c#代码的几位大侠,我使用了一下还是没搞出来!啊,谁要给出我源码,我在给他200分了,这已经是第400分了!




当点击比较得分的时候,下面的用户名和分数就会显示了!
  • 打赏
  • 举报
回复
判断的时候主要针对所中红球的数量来switch

int winRedCount = userNums.Where(u => winNums.Contains(u)).Count();
switch (winRedCount)
{
case 4:
score = isWinBlue ? 100 : 20;
break;
case 5:
score = isWinBlue ? 300 : 100;
break;
case 6:
score = isWinBlue ? 600 : 500;
break;
default:
score = isWinBlue ? 20 : 0;
break;
}
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 dingzongyinnihao 的回复:]
谢谢各位,我先来搞一下!


模糊问题:一个中奖号码和很多用户选的号码来比较,然后根据用户名给用户加分(一个用户可以选择多组号码),对于这个问题,我还没有明白怎么做!
[/Quote]

上面5楼用SQL写的很牛掰啊,呵呵
对于LZ的问题,一个用户可以选很多组号码,但是每次选的号码都是6个红的加一个蓝的
每一次选的号,把它放在选号表里,作为一条记录,主键自增
然后加上两个外键字段:用户ID,期数,外加一个得分字段
上面的用户ID来自用户表,并且是主键,里面还有放一些其他的信息
然后是一个以开奖期数为主键的表,可以把每次开奖号码放在里面

最后的业务逻辑,你可以像楼上那样写成存储过程,也可以入放在你的业务逻辑里处理
比较的时候最好转换成int类型,这样效率比较高
truecoffeefox 2011-04-02
  • 打赏
  • 举报
回复
也懒得去写,感觉红蓝分开,红球就是求两个序列几个相同的,数据结构书里就有相关算法
然后根据篮球是否中,分开switch
xrongzhen 2011-04-02
  • 打赏
  • 举报
回复
上面期数我写死了,楼主可以根据具体的期数 重新组合
xrongzhen 2011-04-02
  • 打赏
  • 举报
回复
问题:这些是各个用户所选的号码,根据期数来判断用户是否得分
期数进行比较,
如果是:0+1,1+1,2+1,得5分,
如果是:4+0,3+1 得20分
如果是:4+1,5+0 得100分
如果是:5+1 得300分
如果是:6+0 得500分
如果是:6+1 得1000分

得分单有一个记录表

use test

if object_id('tb') is not null drop table tb
GO
create table tb([id] int identity(1,1),Hong1 int,Hong2 int,Hong3 int ,Hong4 int, Hong5 int,Hong6 int ,Lan int, Qishu varchar(8),userName nvarchar(20))
Insert into tb
select 3,5,8,15,16,18,10,'2011036','zhangsan' union all
select 5,9,13,18,22,24,6,'2011036','lisi' union all
select 2,7,11,20,24,28,9,'2011036','lisi' union all
select 2,6,11,19,23,25,12,'2011036','王五' union all
select 6,11,16,19,22,26,4,'2011036','王五' union all
select 8,11,20,22,24,30,5,'2011036','王五'
--2,11,20,22,24,31 5

--得分记录表
--如果是:0+1,1+1,2+1,得5分,
--如果是:4+0,3+1 得20分
--如果是:4+1,5+0 得100分
--如果是:5+1 得300分
--如果是:6+0 得500分
--如果是:6+1 得1000分
if object_id('tb1') is not null drop table tb1
GO
create table tb1(sumHong int,sumLan int,score int)
insert into tb1
select 0,1,5 union all
select 1,1,5 union all
select 2,1,5 union all
select 3,1,20 union all
select 4,0,20 union all
select 4,1,100 union all
select 5,0,100 union all
select 6,0,500 union all
select 6,1,1000

;with cte as
(
select [id] ,userName, [球类型] , [号码] from tb unpivot ([号码] for [球类型] in(Hong1,Hong2,Hong3,Hong4,Hong5,Hong6,Lan)) t
)
,cte2 as
(
select distinct [id],userName,
'红球中奖数量'=(select count(*) from cte where [号码]in(2,11,20,22,24,31) and c.[id]=[id]),
'篮球中奖数量'=(select count(*) from cte where [号码]in(5) and c.[id]=[id])
from cte c
)
select a.*,[分数]=isnull(b.score,0) from cte2 a left join tb1 b on a.[红球中奖数量]=b.sumHong and a.[篮球中奖数量]=b.sumLan


--查询结果
--(6 行受影响)
--
--(9 行受影响)
--id userName 红球中奖数量 篮球中奖数量 分数
------------- -------------------- ----------- ----------- -----------
--1 zhangsan 0 1 5
--4 王五 2 0 0
--5 王五 2 0 0
--2 lisi 2 1 5
--3 lisi 4 0 20
--6 王五 4 1 100
--
--(6 行受影响)
  • 打赏
  • 举报
回复
谢谢各位,我先来搞一下!


模糊问题:一个中奖号码和很多用户选的号码来比较,然后根据用户名给用户加分(一个用户可以选择多组号码),对于这个问题,我还没有明白怎么做!
小童 2011-04-01
  • 打赏
  • 举报
回复
ID          Hong1 Hong2 Hong3 Hong4 Hong5 Hong6 Lanqiu qishu    UserName                                           res
----------- ----- ----- ----- ----- ----- ----- ------ -------- -------------------------------------------------- --------------------------------------------------
1 03 05 08 15 16 18 08 2011036 Zhangsan 0 +0积分:0
2 05 09 03 18 22 24 06 2011036 Lisi 1 +0积分:0
3 02 07 11 20 24 28 09 2011036 Lisi 4 +0积分:0
4 06 06 11 19 23 25 12 2011036 王五 1 +0积分:0
5 06 11 16 19 22 26 04 2011036 王五 2 +0积分:0
6 08 11 20 22 24 30 05 2011036 王五 4 +1积分:0
小童 2011-04-01
  • 打赏
  • 举报
回复


Create function getResult(@ID int,@honghao varchar(50),@lanhao varchar(5))
Returns nvarchar(50)
As
Begin
declare @res varchar(20)
declare @H int
declare @L int
declare @jifen int
declare @UserName varchar(20)

select @UserName=UserName,
@H=
case when charindex(Hong1,@honghao)>0 then 1 else 0 end +
case when charindex(Hong2,@honghao)>0 then 1 else 0 end +
case when charindex(Hong3,@honghao)>0 then 1 else 0 end +
case when charindex(Hong4,@honghao)>0 then 1 else 0 end +
case when charindex(Hong5,@honghao)>0 then 1 else 0 end,
@L=case when Lanqiu=@lanhao then 1 else 0 end from TableName
where ID=@ID
set @res=Convert(nvarchar(2),@H)+'+'+Convert(nvarchar(2),@L)

if(@res='0+1' or @res='1+1' or @res='2+1')
set @jifen=5;
if(@res='4+0' or @res='3+1')
set @jifen=20
if(@res='4+1' or @res='5+0')
set @jifen=100
if(@res='5+1')
set @jifen=300
if(@res='6+0')
set @jifen=500
if(@res='6+1')
set @jifen=1000

Return @res+'积分:'+isNull(convert(varchar(5),@jifen),0)
End


select *,dbo.getResult(ID,'02,11,20,22,24,30','05') as res from tableName
大笨蛋 2011-04-01
  • 打赏
  • 举报
回复
就是楼上的思路。
ycproc 2011-04-01
  • 打赏
  • 举报
回复
所有的情况 放在 swich case 的case条件里面

写上不同的调节算法。这连算不上 。。
子夜__ 2011-04-01
  • 打赏
  • 举报
回复
拿一条数据来说

找到这一条数据

findcontrol..

把6个红球和1个篮球存入list中。。

然后与开奖号码比较

如果红球相等
IntRedCount+=1;

如果篮球相等
intblueCount=1;

最后就好判断了啊。

一个swich case
把你所有的情况算出来 然后再绑上。
Airch 2011-04-01
  • 打赏
  • 举报
回复
你得分的情况就只有这6种么,还是说这只是个代表性的
  • 打赏
  • 举报
回复
if (winBlue == userBlue)
{
}
这个判断是多余的,三目判断蓝球就行了,对于红球只需要以<4, 4,5,6来判断
  • 打赏
  • 举报
回复

//using System.Linq;
static void Main(string[] args)
{
List<int> winNums = new List<int> { 3, 5, 8, 15, 16, 18 };
Console.Write("本期中奖号码:");
winNums.ForEach(w => Console.Write(w + " "));
List<int> userNums = new List<int> { 3, 5, 8, 15, 35 };
Console.Write("\r\n用户投注号码:");
userNums.ForEach(u => Console.Write(u + " "));
int winBlue = 8, userBlue = 8, score = 0;
bool isWinBlue = winBlue == userBlue;
int winRedCount = userNums.Where(u => winNums.Contains(u)).Count();
if (winBlue == userBlue)
{
switch (winRedCount)
{
case 4:
score = isWinBlue ? 100 : 20;
break;
case 5:
score = isWinBlue ? 300 : 100;
break;
case 6:
score = isWinBlue ? 600 : 500;
break;
default:
score = isWinBlue ? 20 : 0;
break;
}
}
Console.WriteLine("\r\n用户得分:{0}", score);
Console.ReadLine();
}


输出:
本期中奖号码:3 5 8 15 16 18
用户投注号码:3 5 8 15 35
用户得分:100
beckfun 2011-04-01
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 beckfun 的回复:]

上面的代码搞错一个地方C# code

//购买的红球列表
List<string> a = new List<string>();
//开奖好吗
List<string>……
[/Quote]仔细看了下还是有错..晕了..

//购买的红球列表
List<string> a = new List<string>();
//开奖好吗
List<string> b = new List<string>();
//购买的篮球
string c;
//开奖篮球
string d;
int cnt = a.FindAll(new Predicate<string>(delegate(string v) { return b.Contains(v); })).Count;
string flag = cnt.ToString() + "+" + d.Equals(c) ? "1" : "0";
int f = 0;//分数

switch (flag)
{
case "0+1":
case "1+1":
case "2+1":
f = 5;
break;
case "4+0":
case "3+1":
f = 20;
break;
case "4+1":
case "5+0":
f = 100;
break;
case "5+1":
f = 300;
break;
case "6+0":
f = 500;
break;
case "6+1":
f = 1000;
break;
default:
f = 0;
break;
}

现在应该没有了
笑道江湖情 2011-04-01
  • 打赏
  • 举报
回复
如果真的就这几种情况的话,判断一下应该就可以了。

诶 ~~ 我是来帮顶的。
cfvgodot 2011-04-01
  • 打赏
  • 举报
回复
。。。不是用泛型 是用LINQ
cfvgodot 2011-04-01
  • 打赏
  • 举报
回复
如果要求效率的话你就排序查找。。。用泛型 会快一些
加载更多回复(5)

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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