用字母字符计数

时间:2014-03-08 16:00:57

标签: c# winforms math

问题

目前,下面的代码(IntToAZString)有点做,但不是100%,我从IRC(Heisenberg)的某个人那里得到了这段代码。

现在的问题是它以字符串长度1开始,然后移动到2直到它达到3,当它出现时,它从BAA开始......

它应该从AAA开始,但它对应于000,它不喜欢做,ZZ是99,BAA是100 ......

enter image description here

我希望它计数到Z,我希望能够定义字符串长度(我有点解决了..)

我想要实现的目标

字符串长度:3 所以,AAA。

首先,最后一个角色的A到Z,当它击中Z时,将中间角色向上移动一个字母(ABA) 重复最后一个字符,再次移动中间字符。 如果中间的一个到达Z,则将第一个移到字母表中的一个字母。

当生成的字符串与页面上的字符串匹配时结束(AOE) 或当它到达ZZZ时。

当前代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace CharCounter
{
    public partial class Form1 : Form
    {
        private bool ogFound = false;
        private int chars;
        static string IntToAZString(long number)
        {
            string result = "";

            do
            {
                long remainder = number % 26;

                char digit = (char)(remainder + 65);

                result = digit + result;

                number /= 26;
            }
            while (number > 0);

            return result;
        }
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            backgroundWorker1.RunWorkerAsync();
        }

        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            for (int i = 0; i < (Math.Pow(26, chars)); i++)
            {
                listBox1.Invoke((MethodInvoker)delegate
                {
                    listBox1.Items.Add(IntToAZString(i));
                });

            }
        }

        private void numericUpDown1_ValueChanged(object sender, EventArgs e)
        {
            chars = (int)numericUpDown1.Value;
        }
    }
}

2 个答案:

答案 0 :(得分:0)

你的代码很好,但你忘记了在你的代码中,'A'相当于0.所以“B”相当于“AB”,而“AAB”(就像1,相当于01和001)。

您的输出就像:

0,
1,
2,
3,
4,
5,
6,
7,
8,
9,
10, (there is no 00 before 10)
...

打印时,应使用'A's:

将输出字符串填充到所需的长度
listBox1.Items.Add(IntToAZString(i).PadLeft(chars, 'A');

如果您愿意,可以从1个字符输出打印,然后打印2个字符输出(填充'A'),然后输出3个字符(用'A'填充)等等......

另一个建议 - 在StringBuilder方法中使用string代替IntToAZString

static string IntToAZString(long number)
    {
        StringBuilder result = new StringBuilder(chars);

        do
        {
            long remainder = number % 26;

            char digit = (char)(remainder + 65);

            result.Insert(0, digit);

            number /= 26;
        }
        while (number > 0);

        return result.ToString();
    }

答案 1 :(得分:0)

我使用了递归方法来做同样的事情。

public class Main{
      static char s[]=new char[26];//Char array to store Set of alphabets

public static void main(String args[]){
      long size=1;
    char ch='a';

    for(int i=0;i<26;i++)       //Loop to add alphabets to Char array s[]
        {
        s[i]=(char)(ch+i);
    }

       while(true)          //infinite loop which increases size of the string.
       { recursion(size,"");
        System.out.println("");
        size++;
        }
}

public static void recursion(long size,String prefix)//Recursive method
    {   
    // Base case: size is 0, print prefix
    if(size==0)
    {   System.out.println(prefix);
        return;
    }
     // One by one add all characters from set and recursively 
    // call for size equals to size-1
    for(int i=0;i<26;i++)
    {
         // Next character of input added
        String newPrefix = prefix + s[i];
         // Size is decreased, because we have added a new character
        recursion(size-1,newPrefix);
    }

}
}

Check the Whole Program here..!