【考一考】汇率算法,号称算法强的可以来挑战一下^_^
汇率信息中有不同币种之间的汇率,要求从已知信息中求出给定币种直接的汇率。
将汇率信息存放在sql server数据库中,结构如下:
SourceCurrency TargetCurrency Rate
A B 1.0000
G H 2.4454
H C 8.0000
M N 4.0000
J H 10.0000
……//任意多的汇率信息
B M 7.2222
X Y 8.9999
求货币A对货币N的汇率(任意两种币种之间的汇率默认为1.0000),用sql作答,用c#亦可。
[解决办法]
1. 首先,这数据设计的啊……欸……
2. A B有 找B相关, B x有 找X相关,如果是X B,就用汇率倒数……直到找到 X N相关。
[解决办法]
A B
A C
A D
A E
A F
...
A Z
这样会死么…………这样省事儿很多啊少年……
[解决办法]
我只能想到1楼类似的办法了。
[解决办法]
SELECT MIN(COUNT(DISTINCT([SourceCurrency])), COUNT(DISTINCT([TargetCurrency]))) AS [N]FROM [数据表]
[解决办法]
感觉这个题目有些地方不明确:
假如:
A->B, B->C,....X->D可以推出A->D
,但是同时存在
A->M, M->N,....X->D也可以推出A->D
那么那一条路径是正确的呢?
[解决办法]
public class process { public static void get() { List<rate> lst = new List<rate>(); lst.Add(new rate() { From = "A", To = "B", ratio = 1.5, tag = false }); lst.Add(new rate() { From = "G", To = "H", ratio = 1.5, tag = false }); lst.Add(new rate() { From = "H", To = "C", ratio = 1.5, tag = false }); lst.Add(new rate() { From = "M", To = "N", ratio = 1.5, tag = false }); lst.Add(new rate() { From = "J", To = "H", ratio = 1.5, tag = false }); lst.Add(new rate() { From = "B", To = "M", ratio = 1.5, tag = false }); lst.Add(new rate() { From = "B", To = "A", ratio = 1.5, tag = false }); string strFrom = "B"; string strTo = "G"; if (!Search(strFrom, strTo, lst, 1.0)) { Console.WriteLine("Match not founded"); } } public static bool Search(string strFrom, string strTo, List<rate> lst, double dTemp) { var lst1 = lst.Where(rat => rat.From.Equals(strFrom) && !rat.tag).ToList(); foreach (rate ratItem in lst1) { ratItem.tag = true; if (ratItem.To.Equals(strTo)) { double dBl = dTemp * ratItem.ratio; Console.WriteLine("rate:{0}", dBl); return true; } else { if (Search(ratItem.To, strTo, lst, dTemp * ratItem.ratio)) return true; } } var lst2 = lst.Where(rat => rat.To.Equals(strFrom) && !rat.tag).ToList(); foreach (rate ratItem in lst2) { ratItem.tag = true; if (ratItem.From.Equals(strTo)) { double dBl = dTemp / ratItem.ratio; Console.WriteLine("rate:{0}", dBl); return true; } else { if (Search(ratItem.From, strTo, lst, dTemp * ratItem.ratio)) return true; } } return false; } } public class rate { public string From { get; set; } public string To { get; set; } public double ratio { get; set; } public bool tag { get; set; }//标识是否搜索过 }
[解决办法]
如果有多种兑换方法,应该找出如何兑换换得最多才行。所以还是个最短路径问题,将兑换比例取log,转为路径的权值。因为存在负权,所以Dijkstra不能用了,需要用Floyd或SPFA之类的算法。抱歉,我也只能说思路,代码写不了。
[解决办法]
啊哦,前几个月,刚做了一个WP7上的小应用,就是单位转换的。其实很简单,就是找个基准变量,然后所有单位都参照基准变量来设置……
[解决办法]
模拟退火?
[解决办法]
这个是时间与空间之间的取舍。如果要省时间,就把计算的结果保存在一个链表中,每一次需要计算的时候先从链表中扫一遍,如果有就不用计算了,否则计算一下,然后再把这个结果填到这个链表中。