1029练习题 A
KONO题面哒!
问题描述
定义函数 f(x) 为组成 x 的各位数字之和,如 f(2018) = 2 + 0 + 1 + 8 = 11 . 给定一个正整数 n 求所有满足条件 f(x) + x = n 的 x .输入格式
共一行,一个正整数 n 。输出格式
第一行一个整数 ans 表示有多少个整数 x 满足条件。 下接 ans 行,每行一个整数表示满足条件的 x 。
样例输入 1
8
样例输出 1
1
4
样例输入 2
818
样例输出 2
2
796
805
爆 炸 数 据
969743458687311104
爆 炸 输 出
2
969743458687310998
969743458687311016
数据范围
$N \leq {10}^{18}$
我自己的方法是真的鬼才
暴力乱搞题。20min内搞定。
由于每位的和最大为$9*17=153$,所以可以从1开始枚举每位的和,然后再验证剩下的数的每位的和是不是枚举出来的数。
所以暴力才是正道啊
KONO代码哒!
已读
#include <stdio.h>
#include <bits/stdc++.h>
using namespace std;
#define ri register int
#define rll register long long
inline long long read()
{
long long f=1,x=0;
char s=getchar();
while(s<'0'||s>'9')
{
if(s=='-')
f=-1;
s=getchar();
}
while(s>='0'&&s<='9')
{
x=x*10+s-'0';
s=getchar();
}
return x*f;
}
long long N,Ans[182],Num,T,Res,cnt,Sum,tot;
int main()
{
N=read();
for(rll i=1LL;i<=181LL;i++)
{
Res=T=N-i;
Sum=0;
for(cnt=0;Res;cnt++)
{
Sum+=(Res%10);
Res=Res/10;
}
if(Sum==i)
{
Ans[++Num]=T;
}
}
printf("%lld\n",Num);
for(rll i=Num;i>0;i--)
{
printf("%lld\n",Ans[i]);
}
return 0;
}
这个是WZJ大佬的代码,不敢把自己的憨批代码放上来