给定一个数组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位数。
下面是粗略的实现,欢迎指正:
#include "stdio.h" 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); } }