如何构建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
答案 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
获得了一些帮助