地址:https://vjudge.net/contest/207600#problem/I
题意:题面英文就不复制了,大概意思是要输入一个数,然后第一行输出有k种结果,下面k行分别有一个数,这个数加上它各个位的数之和是等于用户输入的那个数。
分析:首先计算用户输入的数是几位数,然后从某个值开始查看这个值是否符合所要的条件,不符合就加1看下一个数,(这里是重点,思考这个某个值如何取),暴力求解,将符合条件的数存入另外一个数组中。最后遍历这个数组看有几个符合条件的数,并输出
wa点和注意点:1.主要是格式,注意输出的元素之间的空格,和最后一个元素结束后要换行
2.
int i=n-9*dig;i<n;++i
最重要的点就是这里i的初始值范围,用极限思想,考虑让i最小,极限情况就是假设这个数的每一位都是9,
题解:
//暴力求解法 (加上点极限思想?)
#include <iostream>
#include <algorithm>
#define N 100000
using namespace std;
int main()
{
int n,an[N]={0},num=0,dig=0;
//n为要得到的数,k为可能的结果,num为符合的数字个数,k存在数组中,dig为n的位数
cin>>n;
int t=n;
while(t!=0)//计算n是几位数
{
t/=10;
dig++;
}
//cout<<dig<<endl<<endl;
for(int i=n-9*dig;i<n;++i)//调出符合要求的数字,这里i的初始值用极限思想,
{
int sum=i;
int j=i;
while(j!=0)
{
sum+=j%10;
j/=10;
//cout<<sum<<endl;
}
if(sum==n)//找到符合条件的数字,记录下来
{
an[num]=i;
//cout<<an[num]<<endl;
num++;
}
}
for(int i=0;i<num;++i)//输出
{
if(i==0&&num!=0)
{
cout<<num<<endl;
cout<<an[i];
}
if(num!=0&&num!=1&&i!=0)
cout<<" "<<an[i];
}
if(num==0)
cout<<num;
return 0;
}