给定一个数字编码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