• 不限位数的十进制正整数类,可进行加和乘操作


    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);
            }

        }

    }

  • 相关阅读:
    FindBugs详解
    Java杂项
    Ubuntu 16.04安装DB2 Express C v11.1
    h5搜索功能
    与安卓交互的上传图片 与 上传语音、视频
    获取后台轮播图图片,让其自动播放
    点赞和关注功能
    split、replace、indexof、substr 用法 (获取后台富文本框内容,截取图片)
    ttyu平台进页面获取阅读量
    图片放大预览功能
  • 原文地址:https://www.cnblogs.com/eaglet/p/1352199.html
Copyright © 2020-2023  润新知