问题:一共有n位整数,一位能被1整除,二位能被2整除,三位能被3整除,...,n位能被n整除。
求最大的满足这个条件的数字。
*/
/**
1)从小到大开始回溯;
从第一位开始枚举,枚举到第i位,当第i位不满足时,就改变i-1位的值,i-1位不满足,
就改变i-2位的值,依次类推,
/**
问题:一共有n位整数,一位能被1整除,二位能被2整除,三位能被3整除,...,n位能被n整除。
求最大的满足这个条件的数字。
*/
/**
1)从小到大开始回溯;
从第一位开始枚举,枚举到第i位,当第i位不满足时,就改变i-1位的值,i-1位不满足,
就改变i-2位的值,依次类推,
*/
/**
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
void find_back(int index);
const int maxn=50;
int data[2*maxn],temp[2*maxn];
int max_index=0;
int ans=0;
int main()
{
//cout << sizeof(data)/sizeof(data[0]) << endl;
memset(temp,0,sizeof(temp));
temp[1]=1; //从1开始搜索
find_back(1);
for(int i=1;i<=max_index;++i)
cout << data[i];
cout << endl;
cout << "Hello world!" << endl;
cout << "ans:" << ans << endl;
cout << "max_index:" << max_index << endl;
return 0;
}
void find_back(int index)
{
while(temp[1]<=9)
{
if(index>=max_index)
{
max_index=index;
for(int j=1;j<=max_index;++j)
data[j]=temp[j];
}
++index;
ans=max(ans,index);
int r=0;
for(int j=1;j<=index;++j)
{
r=r*10+temp[j];
r%=index;
}
if(r!=0) //当此时的数字不能被r整除时,要减去余数
{
temp[index]=temp[index]-r+index;//避免出现负数
while(temp[index]>9&&index>1)
{
temp[index]=0; //如果第index号位的数字大于9并且不是第1号位,就将index号重新从0开始搜索
--index; //枚举index号位的上一位
temp[index]+=index;
}
}
}
}
*/
2)从大到小开始回溯
/**
2)从大到小开始回溯
*/
#include <iostream>
#include <algorithm>
#include <iterator>
#include <cstring>
using namespace std;
void find_back(int index);
const int maxn=50;
int data[2*maxn],temp[2*maxn];
int max_index=0;
int ans=0;
int main()
{
fill(begin(temp),end(temp),9);
for(int i=1;i<=maxn;++i)
cout << temp[i];
cout << endl;
find_back(1);
for(int i=1;i<=max_index;++i)
cout << data[i];
cout << endl;
cout << "Hello world!" << endl;
cout << "ans:" << ans << endl;
cout << "max_index:" << max_index << endl;
return 0;
}
void find_back(int index)
{
while(temp[1]>0)
{
if(index>max_index)
{
max_index=index;
for(int j=1;j<=max_index;++j)
data[j]=temp[j];
}
++index;
ans=max(ans,index);
int r=0;
for(int j=1;j<=index;++j)
{
r=r*10+temp[j];
r%=index;
}
if(r!=0)
{
temp[index]=temp[index]-r; //因为时是从最大值开始枚举的,所以只需要减去r即可
while(temp[index]<0&&index>1)
{
temp[index]=9;
--index;
temp[index]-=index;
}
}
}
}