给定一个数组A,里面只出现0-9这10个数字,但不一定全部出现,然后给定一个K的值,求A中大于K的整数当中最小的一个,并输出。例如A={0,1}, k =12,则结果为100. 请编程实现。
我的思路如下,设输入为M(各位依次为 M(n-1) M(n-2) ..... M1 M0),输出为N。
(1).如果在A数组中存在数字M(n-1) ,则问题可转化成,求大于数字M‘(各位依次为 M(n-2) ..... M1 M0)的最小整数;
(2).在(1)情况不成立的情况下,如果A中存在大于M(n-1) 的数字A[x],则问题可简化为,求解以A[x]为最高位的、由A中数字组成的最小n位数。
(3).在(3)情况不成立的情况下,问题可简化为,求由A中数字组成的,以A[0](A[0]为0,则取A[1])为最高位的最小n位数。
下面是粗略的实现,欢迎指正:
int szA[] = {0, 1}; //递增排序
#define A_NUM_COUNT (sizeof(szA)/sizeof(int))
//根据十进制数组获得对应数字
unsigned int getNumByDecArray(int * szDec, int nLen)
{
int nNum = 0;
for (int i = 0, power = 1; i < nLen; i ++, power *= 10)
{
nNum += szDec[i] * power;
}
return nNum;
}
//获得指定数字的十进制数组
int getDecNumArray(int nNum, int * szDec)
{
int i = 0;
while(nNum > 0)
{
szDec[i] = nNum % 10;
nNum = nNum / 10;
i ++;
}
if (0 == i)
{
szDec[0] = 0;
return 1;
}
else
{
return i;
}
}
//获得由A中数字组成的N位、且指定最高位的最小数
int getMinNum_NDigit_SpeTopDig(int digit, int top_digit)
{
int nNum = 0;
int power = 1;
for (int i = 0; i < digit - 1; i ++)
{
nNum += szA[0] * power;
power *= 10;
}
nNum += top_digit * power;
return nNum;
}
//获得由A中数字组成的最小N位数
int getMinNum_NDigit(int digit)
{
int nNum = 0;
int power = 1;
for (int i = 0; i < digit - 1; i ++)
{
nNum += szA[0] * power;
power *= 10;
}
nNum += ((szA[0] != 0) ? (szA[0]) : (szA[1])) * power;
return nNum;
}
//power的n次方
int pow(int power, int n)
{
int num = 1;
for (int i = 0; i < n; i ++)
{
num *= power;
}
return num;
}
//求解最小的Bigger Num。
//对于M和M'(M的子串,例如23为123的字串)有不同的处理
int calcNum_MinB(int nInput, int begin_flag = 1)
{
int szInput[20] = {0};
int nInputLen = getDecNumArray(nInput, szInput);
//获得大于等于nInput最高位的数字
int nDigit = -1;
int pos = 0;
for(; pos < A_NUM_COUNT; pos ++)
{
if (szA[pos] >= szInput[nInputLen - 1])
{
nDigit = szA[pos];
break;
}
}
if (-1 == nDigit)
{
return (1 == begin_flag) ? (getMinNum_NDigit(nInputLen + 1)) : (-1);
}
else if(nDigit > szInput[nInputLen - 1])
{
return getMinNum_NDigit_SpeTopDig(nInputLen, nDigit);
}
else if (nDigit == szInput[nInputLen - 1])
{
if (1 == nInputLen) //最后一位
{
return (pos + 1 < A_NUM_COUNT) ? (szA[pos + 1]) : (-1);
}
else
{
int subnum = getNumByDecArray(szInput, nInputLen - 1);
subnum = calcNum_MinB(subnum, 0);
if (subnum != -1)
{
return (nDigit * pow(10, nInputLen - 1)) + subnum;
}
else
{
return (pos + 1 < A_NUM_COUNT) ?
(getMinNum_NDigit_SpeTopDig(nInputLen, szA[pos + 1])):
((1 == begin_flag) ? (getMinNum_NDigit(nInputLen + 1)) : (-1));
}
}
}
}
int main()
{
int nInput = 0;
while(1)
{
printf("please intput the number/r/n");
scanf("%d", &nInput);
if (nInput == 0)
{
break;
}
int nOutput = calcNum_MinB(nInput);
printf("/r/nOutput: %d/r/n", nOutput);
}
}