【算法】求教大家算法问题。

tiantian1980 2009-10-28 11:40:35
面试的所有程序员中没有一个人能做出这道题,有极小数人可能是因为时间限制(30分钟),算法题是这样的:
用户输入一四则运行的算式,得出结果,例如:1+6/3+{1*3+5+[(9-1)/3+3]}+2+(5+3)/2= 得出结果22.67。如果除不尽,四舍五入保留两位小数;如果为负则指出出错地方,不进行下一步计算;如果出0,当然不能进行下一次计算了。能很好考查程序员的的基本功。有兴趣的朋友可试试。
...全文
614 55 打赏 收藏 转发到动态 举报
写回复
用AI写文章
55 条回复
切换为时间正序
请发表友善的回复…
发表回复
我姓区不姓区 2009-10-29
  • 打赏
  • 举报
回复
就几句话搞定,3000块,情有可原~~~

string str = "1+6/3+{1*3+5+[(9-1)/3+3]}+2+(5+3)/2=";
object o = new DataTable().Compute(str.Replace("=", "").Replace("{", "(").Replace("}", ")").Replace("[", "(").Replace("]", ")"), "");
Console.WriteLine(Convert.ToDouble(o).ToString("F2"));

liherun 2009-10-29
  • 打赏
  • 举报
回复
private string size(string str)
{
string bz = "";
str = (((((str.Replace(" ", "")).Replace("{","(")).Replace("[","(")).Replace("}",")")).Replace("]",")")).Trim('=');
str1 = str.Split('(');
if (str1.Length == 1) return jisuan( str);
for (int i = 0; i < str1.Length; i++)
{
if (str1[i] != "")
{
for (int j = 0; j < str1[i].Length; j++)
{
if (str1[i].Substring(j, 1).Equals(")"))
{
bz = str1[i].Substring(0, j);
if (jisuan(bz) == "")
return "";
str1[i] = jisuan(bz) + str1[i].Substring(j+1);
str = "";
str = str1[0];
for (int k = 1; k < str1.Length; k++)
{
if (k == i)
str = str + str1[k];
else
str = str + "(" + str1[k];
}
return size(str);
}
}

}



}
return "";
}
private string jisuan(string str)
{
char[] c = str.ToCharArray();
int bz = 0;
string[] strsz=new string[c.Length];
for (int i = 0; i < c.Length; i++)
{
if (c[i].Equals('+') || c[i].Equals('-') || c[i].Equals('*') || c[i].Equals('/'))
{
bz++;
strsz[bz] = c[i].ToString();
bz++;
}
else
{
if (bz == c.Length)
return "";
strsz[bz] = strsz[bz] + c[i].ToString();
}

}
if (bz == 0) return str;
if (strsz.Length < bz + 1)
return "";
for (int i = 0; i < bz+1; i++)
{
if (strsz[i] == "*")
{
strsz[i] = (double.Parse(strsz[i - 1]) * double.Parse(strsz[i + 1])).ToString();
strsz[i - 1] = "";
strsz[i + 1] = "";
str = "";
for (int j = 0; j < bz + 1; j++)
{
str = str + strsz[j];
}
return jisuan(str);
}
}
for (int i = 0; i < bz + 1; i++)
{
if (strsz[i] == "/")
{
if (strsz[i + 1] == "0")
{
MessageBox.Show("除数不能为零!");
return "";
}
strsz[i] = (double.Parse(strsz[i - 1]) / double.Parse(strsz[i + 1])).ToString();
strsz[i - 1] = "";
strsz[i + 1] = "";
str = "";
for (int j = 0; j < bz + 1; j++)
{
str = str + strsz[j];
}
return jisuan(str);
}
}
for (int i = 0; i < bz + 1; i++)
{
if (strsz[i] == "+")
{
strsz[i] = (double.Parse(strsz[i - 1]) + double.Parse(strsz[i + 1])).ToString();
strsz[i - 1] = "";
strsz[i + 1] = "";
str = "";
for (int j = 0; j < bz + 1; j++)
{
str = str + strsz[j];
}
return jisuan(str);
}
}
for (int i = 0; i < bz + 1; i++)
{
if (strsz[i] == "-")
{
strsz[i] = (double.Parse(strsz[i - 1]) - double.Parse(strsz[i + 1])).ToString();
strsz[i - 1] = "";
strsz[i + 1] = "";
str = "";
for (int j = 0; j < bz + 1; j++)
{
str = str + strsz[j];
}
return jisuan(str);
}
}
return "";
}
SQL77 2009-10-28
  • 打赏
  • 举报
回复
[Quote=引用 37 楼 v68v6 的回复:]
晕,还真有人去做??

都是VMM口中的算法达人。。。

要清楚,算法达人这个价太贱了,8000+才是底线。。。。。

不过招算法达人,可能就不是这类型的题目了。


[/Quote]
哎,现在是没工作学习当中
hlizza 2009-10-28
  • 打赏
  • 举报
回复
做过了,用两个栈做,数据栈、操作符栈(操作符要事先定义优先级,如× 优先级大于+)
在压栈时,如果即将压入操作符栈的优先级低于操作符栈栈顶的就将栈顶取出计算再将结果压入(如栈顶为×,即将压入的为+,就先将数据栈栈顶两个数、操作符栈栈顶取出相乘算好结果压入数据栈,再压+)
llsen 2009-10-28
  • 打赏
  • 举报
回复
[Quote=引用 42 楼 v68v6 的回复:]
我还以为llsen准备推荐到前台。。。。
[/Quote]

那引起公愤的就是我了。。。
V68V6 2009-10-28
  • 打赏
  • 举报
回复
我还以为llsen准备推荐到前台。。。。
llsen 2009-10-28
  • 打赏
  • 举报
回复
[Quote=引用 40 楼 vrhero 的回复:]
lz被迫改标题...早知如此何必当初呢...呵呵
[/Quote]

标题是我改的,怕引起公愤,呵呵。
vrhero 2009-10-28
  • 打赏
  • 举报
回复
lz被迫改标题...早知如此何必当初呢...呵呵
wwwwwwking 2009-10-28
  • 打赏
  • 举报
回复
好吧,我承认半小时内我做不来。。
cooolchen 2009-10-28
  • 打赏
  • 举报
回复
这个就是个计算时精度丢失的问题。
把所有的数字都用一个double来替代,然后输入数字,计算。
应该就可以了。

ps:没测过,不知道对不对。

salary小于3000.
V68V6 2009-10-28
  • 打赏
  • 举报
回复
晕,还真有人去做??

都是VMM口中的算法达人。。。

要清楚,算法达人这个价太贱了,8000+才是底线。。。。。

不过招算法达人,可能就不是这类型的题目了。

SQL77 2009-10-28
  • 打赏
  • 举报
回复
DECLARE @STR VARCHAR(500)
SET @STR='1+6/3+{1*3+5+[(9-1)/3+3]}+2+(5+3)/2'
SELECT @STR=REPLACE(REPLACE(REPLACE(REPLACE(@STR,'{','('),'}',')'),'[','('),']',')')
EXEC('SELECT '+@STR+'')







-----------
22
SK_Aqi 2009-10-28
  • 打赏
  • 举报
回复
这帖子必火
SQL77 2009-10-28
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 tubo12382 的回复:]
算出来 了,不过。
    工资没有有3K.。汗。。。。
[/Quote]
不过程序中应该好弄点
caobob 2009-10-28
  • 打赏
  • 举报
回复
方法一:根据运算符优先级split字符串,然后拼成计算的代码。

方法二:直接调用office.excel里的一个函数即可。

很无聊的题目
SQL77 2009-10-28
  • 打赏
  • 举报
回复
DECLARE @STR VARCHAR(500)

DECLARE @STR1 VARCHAR(500)

DECLARE @STR2 VARCHAR(500)

SET @STR='1+6/3+{1*3+5+[(9-1)/3+3]}+2+(5+3)/2'
SET @STR1=SUBSTRING(@STR,1,CHARINDEX('[',@STR)-1)
SET @STR2=SUBSTRING(@STR,CHARINDEX(']',@STR)+1,LEN(@STR)-CHARINDEX(']',@STR))

SELECT @STR=SUBSTRING(@STR,CHARINDEX('[',@STR)+1,CHARINDEX(']',@STR)-CHARINDEX('[',@STR)-1)

--CREATE TABLE #T(COL VARCHAR(10))
INSERT #T EXEC('SELECT '+@STR+'')

SELECT @STR=@STR1+COL+@STR2 FROM #T

SELECT @STR=REPLACE(REPLACE(@STR,'{','('),'}',')')

EXEC('SELECT '+@STR+'')

(所影响的行数为 1 行)


-----------
22

SQL做的,不过精度很难控制
柳晛 2009-10-28
  • 打赏
  • 举报
回复
括号Replace成小括号,然后执行SQL语句行不?
mbh0210 2009-10-28
  • 打赏
  • 举报
回复
I quit
alan0128 2009-10-28
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 zzxap 的回复:]
楼主很喜欢钻牛角尖?
我认为一个会增删查改 会用sqlhelper 会百度 google会ctrl+c ctrl+v 的,基本算一个能做事的程序员了
[/Quote]就是,多实在
jiangshun 2009-10-28
  • 打赏
  • 举报
回复
[Quote=引用楼主 tiantian1980 的回复:]
面试的所有程序员中没有一个人能做出这道题,有极小数人可能是因为时间限制(30分钟),算法题是这样的:
用户输入一四则运行的算式,得出结果,例如:1+6/3+{1*3+5+[(9-1)/3+3]}+2+(5+3)/2= 得出结果22.67。如果除不尽,四舍五入保留两位小数;如果为负则指出出错地方,不进行下一步计算;如果出0,当然不能进行下一次计算了。能很好考查程序员的的基本功。有兴趣的朋友可试试。
[/Quote]

看了半天还不明白这个题的意思,不过楼主的确是在找BS
加载更多回复(35)

62,046

社区成员

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

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

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

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