汇率信息中有不同币种之间的汇率,要求从已知信息中求出给定币种直接的汇率。
将汇率信息存放在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#亦可。
将汇率信息存放在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#亦可。
2. A B有 找B相关, B x有 找X相关,如果是X B,就用汇率倒数……直到找到 X N相关。
A C
A D
A E
A F
...
A Z
这样会死么…………这样省事儿很多啊少年……
如果感觉这种随时找太难且汇率不会总变化,可以看8楼那个。想找到X到Y的汇率 只需要将X设置为基本值1.0000,根据矢量方向计算汇率。
一个是有可能有多条路径,源到目标得到一个汇率,目标到源有个汇率的倒数,每次查询都能得到两个汇率值。每次都要二叉树了。
二是还要考虑死循环,a-b,b-a,还要考虑推出机制,要记录下查询路径。
A:B B:C C:D -> A:D
你说算法不难,实现一下咯???
A-C:3没有D,现在换,到底是A-D是默认的1? 还是A-B-D的2×1? 还是A-C-D的3×1?
首先,求出数据表中不同的SourceCurrency和不同的TargetCurrency之间的最小值NSELECT MIN(COUNT(DISTINCT([SourceCurrency])), COUNT(DISTINCT([TargetCurrency]))) AS [N]
FROM [数据表]然后,从0到N,逐渐增加条件查询:
第1次SELECT
T0.[SourceCurrency] AS C0
, T0.[TargetCurrency] AS C1, T0.[Rate] AS R1
FROM [数据表] T0
WHERE T0.[SourceCurrency]='A' AND T0.[TargetCurrency]='N'/* 0 row(s) affected */第2次SELECT
T0.[SourceCurrency] AS C0
, T0.[TargetCurrency] AS C1, T0.[Rate] AS R1
, T1.[TargetCurrency] AS C2, T1.[Rate] AS R2
FROM [数据表] T0
INNER JOIN [数据表] T1 ON T1.[SourceCurrency]=T0.[TargetCurrency]
WHERE T0.[SourceCurrency]='A' AND T1.[TargetCurrency]='N'/* 0 row(s) affected */第3次SELECT
T0.[SourceCurrency] AS C0
, T0.[TargetCurrency] AS C1, T0.[Rate] AS R1
, T1.[TargetCurrency] AS C2, T1.[Rate] AS R2
, T2.[TargetCurrency] AS C3, T2.[Rate] AS R3
FROM [Rate] T0
INNER JOIN [Rate] T1 ON T1.[SourceCurrency]=T0.[TargetCurrency]
INNER JOIN [Rate] T2 ON T2.[SourceCurrency]=T1.[TargetCurrency]
WHERE T0.[SourceCurrency]='A' AND T2.[TargetCurrency]='N'/* 1 row(s) affected */根据结果
A-B:1.0000
B-M:7.2222
M-N:4.0000
就可以得到A-N。如果到第N次还得不到结果,说明从这张表中查不到了。
假如:
A->B, B->C,....X->D可以推出A->D
,但是同时存在
A->M, M->N,....X->D也可以推出A->D
那么那一条路径是正确的呢?
那你说的默认为1,不是无意义的条件吗,就是误导,直接说找不到提示不就可以了
而且
A-D 是默认 1
C-D 也是默认 1
但A-C 确是明确的3
这不是很明显的矛盾吗?
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; }//标识是否搜索过
}
本店新开张: <a href="http://lovezeng520.taobao.com">http://lovezeng520.taobao.com</a>
2. B->A 倒數
3. A->C->B
4. B->C->A 倒數