思路
这是一道构造题。
输入 x x x!!!
我们想,加数必须由 0 0 0 和 1 1 1 构成,也就是说, x x x 每一位都必须用 0 0 0 和 1 1 1 来合成。显然, x x x 中最大的一位就是我们输出的第一行。
如 1145
,最高位是
5
5
5,它至少要
5
5
5 个数来合成。
第二行是输出加数,显然, x x x 每一位上是几,就是几个 1 1 1。
若数组 a a a 是放输出数的数组,可推得:
$a_j=\displaystyle \sum_{i=1}^{v} 10^{i} $
j j j : 1 1 1 —— —— —— d d d
其中, v v v 为 x x x 的位数, d d d 为 x x x 的第 i i i 位。
如1145
:
当
i
=
1
i=1
i=1时,
v
=
5
v=5
v=5,
d
=
1
d=1
d=1。
则
a
1
+
=
1
a_1+=1
a1+=1,
a
2
+
=
1
a_2+=1
a2+=1,
a
3
+
=
1
a_3+=1
a3+=1,
a
4
+
=
1
a_4+=1
a4+=1,
a
5
+
=
1
a_5+=1
a5+=1。
当
i
=
2
i=2
i=2时,
v
=
4
v=4
v=4,
d
=
10
d=10
d=10。
则
a
1
+
=
10
a_1+=10
a1+=10,
a
2
+
=
10
a_2+=10
a2+=10,
a
3
+
=
10
a_3+=10
a3+=10,
a
4
+
=
10
a_4+=10
a4+=10。
当
i
=
3
i=3
i=3时,
v
=
1
v=1
v=1,
d
=
100
d=100
d=100。
则
a
1
+
=
100
a_1+=100
a1+=100。
当
i
=
4
i=4
i=4时,
v
=
1
v=1
v=1,
d
=
1000
d=1000
d=1000。
则
a
1
+
=
1000
a_1+=1000
a1+=1000。
此时的 a a a 数组是
1111 11 11 11 1
代码
#include<iostream>
using namespace std;
#define int long long
const int N=1e5+5;
int a[N];
signed main(){
int n;
cin>>n;
int ci=1;
int D=n;
while(D/10!=0){
D/=10;
ci++;
}//算位数
cerr<<ci<<endl;
int d=1,cnt=0;
for(int i=1;i<=ci;i++){
int x=(n/d)%10;//把数字的第i位提出来
cnt=max(cnt,x);
for(int j=1;j<=x;j++){
a[j]+=d;
}
d*=10;
}
cout<<cnt<<endl;
for(int i=1;i<=cnt;i++){
cout<<a[i]<<" ";
}
return 0;
}