|
Posted on
2008-12-10 19:27
eaglet
阅读( 720)
评论()
编辑
收藏
举报
using System;
using System.Collections.Generic;
using System.Text;

namespace TestFactorial
  {
 /**//// <summary>
/// 10机制正整数类
/// </summary>
public class DecimalNumber
 {
List<byte> _Data;

public List<byte> Data
 {
get
 {
return _Data;
}
}

public int Length
 {
get
 {
return _Data.Count;
}
}

public DecimalNumber()
 {
_Data = new List<byte>();
}

public DecimalNumber(byte[] data)
 {
foreach (byte b in data)
 {
System.Diagnostics.Debug.Assert(b >= 0 && b <= 9);
}

_Data = new List<byte>(data);
}

public DecimalNumber(List<byte> data)
 {
foreach (byte b in data)
 {
System.Diagnostics.Debug.Assert(b >= 0 && b <= 9);
}

_Data = data;
}

 /**//// <summary>
/// 1位10机制数和10进制序列相乘
///
/// </summary>
/// <param name="s">10进制序列</param>
/// <param name="d">1位10机制数</param>
/// <param name="power">10的幂数</param>
/// <returns></returns>
private static List<byte> Multiply(List<byte> s, byte d, int power)
 {
System.Diagnostics.Debug.Assert(power >= 0);
System.Diagnostics.Debug.Assert(d >= 0 && d <= 9);

List<byte> result = new List<byte>();

for (int i = 0; i < power; i++)
 {
result.Add(0);
}

byte carry = 0; //进位

foreach (byte si in s)
 {
System.Diagnostics.Debug.Assert(si >= 0 && si <= 9);

byte r = (byte)(si* d + carry);
byte m = (byte)(r % 10);
carry = (byte)(r / 10);
result.Add(m);
}

if (carry > 0)
 {
result.Add(carry);
}


return result;
}

 /**//// <summary>
/// 两个10进制序列相加
/// </summary>
/// <param name="s1">序列1</param>
/// <param name="s2">序列2</param>
/// <returns>相加后的序列</returns>
private static List<byte> Plus(List<byte> s1, List<byte> s2)
 {
List<byte> result = new List<byte>();

int c1 = s1.Count;
int c2 = s2.Count;

if (c1 > c2)
 {
for (int i = 0; i < c1 - c2; i++)
 {
s2.Add(0);
}
}
else if (c1 < c2)
 {
for (int i = 0; i < c2 - c1; i++)
 {
s1.Add(0);
}
}

byte carry = 0; //进位

for (int i = 0; i < s1.Count; i++)
 {
System.Diagnostics.Debug.Assert(s1[i] >= 0 && s1[i] <= 9);
System.Diagnostics.Debug.Assert(s2[i] >= 0 && s2[i] <= 9);

byte r = (byte)(s1[i] + s2[i] + carry);
byte m = (byte)(r % 10);
carry = (byte)(r / 10);
result.Add(m);
}

if (carry > 0)
 {
result.Add(carry);
}

return result;
}

public static implicit operator DecimalNumber(string value)
 {
List<byte> data = new List<byte>();

for (int i = value.Length - 1; i >= 0; i--)
 {
data.Add(byte.Parse(value[i].ToString()));
}

return new DecimalNumber(data);
}

public static implicit operator DecimalNumber(int value)
 {
System.Diagnostics.Debug.Assert(value >= 0);
return value.ToString();
}

public static DecimalNumber operator ++(DecimalNumber d)
 {
 return d + new DecimalNumber(new byte[] {1});
}

public static DecimalNumber operator +(DecimalNumber d1, int d2)
 {
System.Diagnostics.Debug.Assert(d2 >= 0);

return d1 + d2.ToString();
}

public static DecimalNumber operator+(DecimalNumber d1, DecimalNumber d2)
 {
return new DecimalNumber(Plus(d1.Data, d2.Data));
}

public static DecimalNumber operator*(DecimalNumber d1, DecimalNumber d2)
 {
List<List<byte>> multiplicationSerial = new List<List<byte>>();

for (int i = 0; i < d1.Data.Count; i++)
 {
multiplicationSerial.Add(Multiply(d2.Data, d1.Data[i], i));
}

List<byte> result = new List<byte>();

foreach(List<byte> s in multiplicationSerial)
 {
result = Plus(s, result);
}
return new DecimalNumber(result);
}

public override string ToString()
 {
StringBuilder str = new StringBuilder();

for (int i = _Data.Count - 1; i >= 0 ; i--)
 {
str.Append(_Data[i].ToString());
}

return str.ToString();
}
}

class Program
 {
static void Main(string[] args)
 {
int d = 1;
DecimalNumber factorial = 1;

while (factorial.Length < 3)
 {
d++;
factorial = factorial * d;
//Console.WriteLine(factorial);
//Console.WriteLine(d);
}

Console.WriteLine(d);
}
}
}
 
|
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述