百度笔试题
给定一个数字编码N,大多数情况下可以找到一个数字编码M,其位数与N相同,各位数字之和与N的各位数字之和相同。并且M是大于N的数值中最小的一个,也可能M不存在。
如:N=134,则M=143.如N=020,则M=101。形式化表述为F(N)=M。如果M不存在,则F(N)=-1。
如:N=134,则M=143.如N=020,则M=101。形式化表述为F(N)=M。如果M不存在,则F(N)=-1。
要求给定算法计算F(N)序列
#include<iostream> #include<cstring> using namespace std; #define MAXNUM 100 char *fun(char m[],int len) { int i=len-2,j=len-1;//要想得到的数字比较小,最好从最低的两位开始, static char n[MAXNUM]; strcpy(n,m); while(i>=0) { // cout<<n<<endl; while(n[i]<'9'&&n[j]>'0') { n[i]++;//每次增减1, n[j]--; if(strcmp(n,m)) { int k=len-1; while(j<k)//n大于m是因为n[i]比m[i]大,所以可以将高位的数值移到低位上去 { while(n[j]>'0'&&n[k]<'9') { n[j]--;//每次增减1 n[k]++; } j++;k--;//只要j<k继续进行 } return n; } } i--,j--;//寻找合适的数字 } strcpy(n,"-1");//找不到,则返回-1 return n; } int main(int argc,char **argv) { if(argc!=2) { cout<<"Usage:"<<argv[0]<<" num"<<endl; return 1; } char *n=fun(argv[1],strlen(argv[1])); cout<<"the smallest of the bigger than m is "<<n<<endl; }
进行了四组测试:
1.输入134,输出143
2.输入020,输出101
3.输入999,输出-1
4。输入1098,输出1179