如何生成一个N'数字自描述数字

时间:2016-04-12 05:28:53

标签: java c# python random

如何构建N 位数,其遵循以下特定条件......

A)第1位数等于0'

的数字

B)2位数等于1'

C)第3位数等于2的数字

D)4等于4的数量,直到第N个数字等于(N-1)的数量。

我知道这个号码被称为自我描述号码

eg- 6210001000是这种数字的10位数。

但我需要知道C#Java程序才能生成这样的数字。

有一个类似的问题here包含python程序来查找这个数字,但我对python`并不熟悉,从该问题及其评论判断,那里的程序面临严重表现问题。

编辑:这是构建此类号码的python版本

def to_the_number(n):
digits=list(map(int,n))
assert(len(digits))==10
done = False
while not done:
    done = True
    for i in range(10):
        if digits[i]!=digits.count(i):
            digits[i]=digits.count(i)
            print(digits)
            done = False
return ''.join(map(str, digits))

仅适用于N = 10

1 个答案:

答案 0 :(得分:-1)

以下代码生成10位自描述数字

class NumberConstructor
{
    uint inds_sum = 0;
    uint inds_val = 0;
    private uint noOfDigits;
    private uint inds_max;
    uint[] inds = new uint[10];
    uint[] nums = new uint[10];
    private uint[] digs = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};

    public void SelfDesc()
    {
        noOfDigits = 10;

        inds_max = noOfDigits - 1;

        GenerateSelfDescribingNumber(noOfDigits);

        Console.ReadLine();
    }
    private void GenerateSelfDescribingNumber(uint i)
    {
        uint j;

        if (i != 0)
        {
            var diff_sum = noOfDigits - inds_sum;
            var upper_min = inds_sum != 0 ? diff_sum : inds_max;

            j = i - 1;

            uint lower;
            uint upper;

            if (j != 0)
            {
                lower = 0;
                upper = (noOfDigits - inds_val)/j;
            }
            else
            {
                lower = diff_sum;
                upper = diff_sum;
            }

            if (upper < upper_min)
                upper_min = upper;

            for (inds[j] = lower; inds[j] <= upper_min; inds[j]++)
            {
                if (inds[j] < i || nums[inds[j]] < inds[inds[j]])
                {
                    nums[inds[j]]++;
                    inds_sum += inds[j];
                    inds_val += inds[j]*j;
                    uint k;

                    for (k = inds_max; k > j && inds[k] - nums[k] <= i; k--) ;

                    if (k == j)
                        GenerateSelfDescribingNumber(i - 1);

                    inds_val -= inds[j]*j;
                    inds_sum -= inds[j];
                    nums[inds[j]]--;
                }
            }
        }
        else
        {
            for (j = 0; j < noOfDigits; j++)
                Console.Write(digs[inds[j]]);

            Console.WriteLine();
        }
    }
}

我从here

获得了一些帮助