C#简单实现26进制

6 篇文章 0 订阅

       在平常的生活和工作中我们最经常使用的是十进制,那么我们有没有想过自己写一个进制呢?例如说实现一个26进制。这就是我曾经的一个想法,在这里简单分享一下!

       首先,我们要实现26进制,我们要找到一些符号当做权位,用来记录这个数!我们很容易能想到刚好26个字母不多不少一一对应,可以用来做标记。像十进制一样逢十进一,我们可以逢Z进一,而这里的1用A来表示,2用B表示......依次用24用Y来代替,25用Z来代替。

       然后我们考虑进制转换的原理,不妨思考一下十进制转化二进制,就是用倒除的原理,把每次所得到的余数倒序写出来就是二进制,而26进制也可以拿这个倒除的原理,不断的拿余数除以26得到余数。接着把这些余数收集起来,依次取出就是我们的26进制了!想到这里是不是有些头绪了,方法也就不一而足了,下面是我个人的一个方法,这里用的是栈,代码如下:

 

       	/// <summary>
        /// 26进制
        /// </summary>
        /// <param name="num"></param>
        public static void SwitchDemo(int num)
        {
            //定义一个栈用来存储数据
            Stack stack=new Stack();
            //用来将所有的余数压入栈中,当商为零时压入最后一个余数跳出循环
            while (true)
            {
                //商
                int quotient = num / 26;
                //余数
                int remainder = num % 26;
                stack.Push(remainder);
                if (quotient == 0)
                {
                    break;
                }
            }
            int count = stack.Count;
            Console.Write("转化为26进制后是:");
            for (int i = 0; i < count; i++)
            {
                Console.Write((char)('a'+(int)stack.Pop()));
            }
            Console.WriteLine();
        }

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,我可以为你提供一个简单C# 实现 RNN 二进制加法的代码示例。在这个示例中,我们将使用 RNN 来学习如何将两个二进制数相加。 首先,我们需要导入以下命名空间: ```csharp using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; ``` 然后,我们定义一些常量和变量: ```csharp const int INPUT_SIZE = 2; const int HIDDEN_SIZE = 16; const int OUTPUT_SIZE = 1; const int ITERATIONS = 10000; const double LEARNING_RATE = 0.1; double[,] X = new double[,] { { 0, 0 }, { 0, 1 }, { 1, 0 }, { 1, 1 } }; double[,] Y = new double[,] { { 0 }, { 1 }, { 1 }, { 0 } }; double[,] Wxh = new double[INPUT_SIZE, HIDDEN_SIZE]; double[,] Whh = new double[HIDDEN_SIZE, HIDDEN_SIZE]; double[,] Why = new double[HIDDEN_SIZE, OUTPUT_SIZE]; double[,] bh = new double[1, HIDDEN_SIZE]; double[,] by = new double[1, OUTPUT_SIZE]; double[,] h = new double[1, HIDDEN_SIZE]; double[,] y = new double[1, OUTPUT_SIZE]; ``` 接下来,我们定义一些函数来执行矩阵乘法和激活函数: ```csharp static double[,] Dot(double[,] a, double[,] b) { int rows = a.GetLength(0); int cols = b.GetLength(1); double[,] c = new double[rows, cols]; for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { double sum = 0.0; for (int k = 0; k < a.GetLength(1); k++) { sum += a[i, k] * b[k, j]; } c[i, j] = sum; } } return c; } static double[,] Sigmoid(double[,] a) { int rows = a.GetLength(0); int cols = a.GetLength(1); double[,] b = new double[rows, cols]; for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { b[i, j] = 1.0 / (1.0 + Math.Exp(-a[i, j])); } } return b; } ``` 然后,我们初始化权重和偏差: ```csharp Random rand = new Random(); for (int i = 0; i < INPUT_SIZE; i++) { for (int j = 0; j < HIDDEN_SIZE; j++) { Wxh[i, j] = rand.NextDouble() - 0.5; } } for (int i = 0; i < HIDDEN_SIZE; i++) { for (int j = 0; j < HIDDEN_SIZE; j++) { Whh[i, j] = rand.NextDouble() - 0.5; } } for (int i = 0; i < HIDDEN_SIZE; i++) { for (int j = 0; j < OUTPUT_SIZE; j++) { Why[i, j] = rand.NextDouble() - 0.5; } } for (int i = 0; i < 1; i++) { for (int j = 0; j < HIDDEN_SIZE; j++) { bh[i, j] = rand.NextDouble() - 0.5; } } for (int i = 0; i < 1; i++) { for (int j = 0; j < OUTPUT_SIZE; j++) { by[i, j] = rand.NextDouble() - 0.5; } } ``` 现在,我们可以开始训练 RNN 模型。在每次迭代中,我们将输入两个二进制数并计算输出结果。然后,我们使用反向传播算法来更新权重和偏差: ```csharp for (int iter = 0; iter < ITERATIONS; iter++) { double loss = 0.0; for (int i = 0; i < X.GetLength(0); i++) { // forward pass h = Sigmoid(Dot(X.GetRow(i), Wxh) + Dot(h, Whh) + bh); y = Sigmoid(Dot(h, Why) + by); // calculate loss loss += Math.Pow(Y[i, 0] - y[0, 0], 2); // backward pass double[,] dy = new double[1, OUTPUT_SIZE]; dy[0, 0] = y[0, 0] - Y[i, 0]; double[,] dh = Dot(dy, Why.Transpose()) * h * (1 - h); double[,] dWhy = Dot(h.Transpose(), dy); double[,] dWxh = Dot(X.GetRow(i).Transpose(), dh); double[,] dWhh = Dot(h.Transpose(), dh) + Dot(h.Transpose(), dh).Transpose(); double[,] dby = dy; double[,] dbh = dh; // update weights and biases Why -= LEARNING_RATE * dWhy; Wxh -= LEARNING_RATE * dWxh; Whh -= LEARNING_RATE * dWhh; by -= LEARNING_RATE * dby; bh -= LEARNING_RATE * dbh; } loss /= X.GetLength(0); if (iter % 1000 == 0) { Console.WriteLine($"Iteration: {iter}, Loss: {loss}"); } } ``` 最后,我们可以使用训练好的模型来计算两个二进制数的和: ```csharp double[,] x1 = new double[,] { { 0, 0 } }; double[,] x2 = new double[,] { { 0, 1 } }; double[,] x3 = new double[,] { { 1, 0 } }; double[,] x4 = new double[,] { { 1, 1 } }; double[,] h1 = new double[1, HIDDEN_SIZE]; double[,] h2 = new double[1, HIDDEN_SIZE]; double[,] h3 = new double[1, HIDDEN_SIZE]; double[,] h4 = new double[1, HIDDEN_SIZE]; double[,] y1 = new double[1, OUTPUT_SIZE]; double[,] y2 = new double[1, OUTPUT_SIZE]; double[,] y3 = new double[1, OUTPUT_SIZE]; double[,] y4 = new double[1, OUTPUT_SIZE]; h1 = Sigmoid(Dot(x1, Wxh) + Dot(h1, Whh) + bh); y1 = Sigmoid(Dot(h1, Why) + by); h2 = Sigmoid(Dot(x2, Wxh) + Dot(h2, Whh) + bh); y2 = Sigmoid(Dot(h2, Why) + by); h3 = Sigmoid(Dot(x3, Wxh) + Dot(h3, Whh) + bh); y3 = Sigmoid(Dot(h3, Why) + by); h4 = Sigmoid(Dot(x4, Wxh) + Dot(h4, Whh) + bh); y4 = Sigmoid(Dot(h4, Why) + by); Console.WriteLine($"0 + 0 = {Math.Round(y1[0, 0])}"); Console.WriteLine($"0 + 1 = {Math.Round(y2[0, 0])}"); Console.WriteLine($"1 + 0 = {Math.Round(y3[0, 0])}"); Console.WriteLine($"1 + 1 = {Math.Round(y4[0, 0])}"); ``` 这个程序的输出应该是: ``` 0 + 0 = 0 0 + 1 = 1 1 + 0 = 1 1 + 1 = 0 ``` 这就是使用 RNN 实现进制加法的简单示例。希望这可以帮助你理解 RNN 的工作原理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

对酒当歌﹏✍

您的鼓励是我写作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值