public abstract class Expression { protected Dictionary<string, int> table = new Dictionary<string, int>( 9 ); public Expression() { table.Add( "一", 1 ); table.Add( "二", 2 ); table.Add( "三", 3 ); table.Add( "四", 4 ); table.Add( "五", 5 ); table.Add( "六", 6 ); table.Add( "七", 7 ); table.Add( "八", 8 ); table.Add( "九", 9 ); } public virtual void Interpret( Context context ) { if( context.Statement.Length == 0 ) { return; } foreach( string key in table.Keys ) { int value = table[ key ]; if( context.Statement.EndsWith( key + GetPostfix() ) ) { context.Data += value * this.Mutiplier(); context.Statement = context.Statement.Substring( 0, context.Statement.Length - this.GetLenght() ); } if( context.Statement.EndsWith( "零" ) ) { context.Statement = context.Statement.Substring( 0, context.Statement.Length - 1 ); } } } public virtual int GetLenght() { return this.GetPostfix().Length + 1; } public abstract int Mutiplier(); public abstract string GetPostfix(); }
public class GeExpression:Expression { public override int Mutiplier() { return 1; } public override string GetPostfix() { return ""; } public override int GetLenght() { return 1; } }
public class ShiExpression:Expression { public override int Mutiplier() { return 10; } public override string GetPostfix() { return "十"; } }
public class BaiExpression:Expression { public override int Mutiplier() { return 100; } public override string GetPostfix() { return "百"; } }
public class QianExpression:Expression { public override int Mutiplier() { return 1000; } public override string GetPostfix() { return "千"; } }
public class WanExpression:Expression { public override int Mutiplier() { return 10000; } public override string GetPostfix() { return "万"; } public override void Interpret( Context context ) { if( context.Statement.Length == 0 ) { return; } ArrayList tree = new ArrayList(); tree.Add( new GeExpression() ); tree.Add( new ShiExpression() ); tree.Add( new BaiExpression() ); tree.Add( new QianExpression() ); foreach( string key in table.Keys ) { if( context.Statement.EndsWith( this.GetPostfix() ) ) { int temp = context.Data; context.Data = 0; context.Statement = context.Statement.Substring( 0, context.Statement.Length - 1 ); foreach( Expression exp in tree ) { exp.Interpret( context ); } context.Data = temp + this.Mutiplier() * context.Data; } } } }
static void Main( string[] args ) { string roman = "六千四百五十二"; Context context = new Context( roman ); ArrayList tree = new ArrayList(); tree.Add( new GeExpression() ); tree.Add( new ShiExpression() ); tree.Add( new BaiExpression() ); tree.Add( new QianExpression() ); tree.Add( new WanExpression() ); foreach( Expression exp in tree ) { exp.Interpret( context ); } Console.WriteLine( "{0} = {1}", roman, context.Data ); }
public class Context { public Context( string roman ) { this.Statement = roman; } public int Data; public string Statement; }
有点难,只是不断递归循环处理,用一个解释器不断的去处理