例如n=7 取{1,10,100,1000,10000,100000} 他们对7的余数{1,3,2,6,4,5},只要从这个集合里面找出前几个数字相加可以等于7就可以了,那几个余数对应的原来的数相加,就是符合要求的最小的数。比如说7是1+6对应原来的数字1+1000=1001。用这种方法应该可以。
#include <iostream>
#include <windows.h>
using namespace std;
#define T INT64
T search(int a)
{
T *p=new T[a];
for(int i=0;i!=a;++i)
p[i]=-1; //初始化为-1
T work=1;
while(p[0]==-1){
int temp=work%a;
if(p[temp]==-1)
p[temp]=work; //将该值保存至下标为其余数的单元中
for(int i=0;i!=a;++i){ //组合目前的所有余数,将其放置至相应单元中
if(p[i]!=-1&&p[i]<work){
int t=(temp+i)%a; //组合后的余数
if(p[t]==-1)
p[t]=work+p[i]; //余数对应的其原始值
}
}
work*=10;
}
T result=p[0];
delete []p;
return result;
}
void main()
{
int test;
while(1){
cin>>test;
T result=search(test);
cout<<result/test<<"*"<<test<<"="<<result<<endl;
}
}