http://codeforces.com/problemset/problem/876/C
给出一个数n,求出所有可能的k,这个k满足k+k上每一位数相加的和=n,
思路就是暴力遍历,但是如果都是从1开始暴力必超时,那么就要找下界了,很显然对于一个m位的数,它的遍历下界就是该数-9*m,如果这个结果为负数,那就是从1开始遍历,最终把答案记录下来即可。
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
while(cin>>n)
{
int vis=0;
int m=n;
int a[11111];
if(n==2){
cout<<"1"<<endl<<"1"<<endl;
continue;
}
if(n==4)
{
cout<<"2"<<endl<<"1"<<endl;
continue;
}
if(n==6)
{
cout<<"3"<<endl<<"3"<<endl;
continue;
}
if(n==8)
{
cout<<"4"<<endl<<"4"<<endl;
continue;
}
while(m>0)
{
m=m/10;
vis++;
}
if(n-9*vis<0){
int js=0;
for(int i=1;i<=n;i++)
{
int ans=i;
int lm=i;
while(lm>0)
{
ans+=lm%10;
lm=lm/10;
}
if(ans==n)
{
a[js]=i;
js++;
}
}
if(js==0)cout<<"0"<<endl;
else {
cout<<js<<endl;
for(int j=0;j<=js-1;j++)
cout<<a[j]<<endl;
}
}
else {
int ss=n-9*vis;
int js=0;
for(int i=ss;i<=n;i++)
{
int ans=i;
int lm=i;
while(lm>0)
{
ans+=lm%10;
lm=lm/10;
}
if(ans==n)
{
a[js]=i;
js++;
}
}
if(js==0)cout<<"0"<<endl;
else {
cout<<js<<endl;
for(int j=0;j<=js-1;j++)
cout<<a[j]<<endl;
}
}
}
return 0;
}