描述
如果x加上x的各个数字之和得到y,就说x是y的生成元。给出n(1小于等于n小于等于100000),求最小生成元。无解输出0.例如,n=216,121,2005时的解分别为198,0,1979.
分析
1.计算n的位数
2.从n-n的位数*9开始循环,到n
解法一
分析
1.计算n的位数
2.从n-n的位数*9开始循环,到n
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int T=sc.nextInt();
while(T>0){
T--;
int n=sc.nextInt();
int num=1;//得到n的位数
int t1=n;//临时临时变量t1,如果直接用n,n的值会被改变,后面就会出错
while(t1/10!=0) {//如果t1/10不等于0,就位数+1
t1/=10;
num++;
}
int flag=0;//标志是否有解
for (int i = n-num*9; i <= n; i++) {//循环,直接从n-位数*9开始,生成元不可能小于这个数
int sum=0;//存放生成元各个数字之和
int t2=i;//临时变量
while(t2!=0) {//计算每一位数字,然后加在sum里
sum+=t2%10;
t2/=10;
}
if(sum+i==n) {//有解直接输出,然后break;
System.out.println(i);
flag=1;//标志是否有解,flag=1有解
break;
}
}
if(flag==0) {//无解输出0
System.out.println(0);
}
}
}
}
解法二
分析
假设所求生成元为m。不难发现m<n。即只需枚举所有的m<n,看看有没有哪个数是n的生成元。
但是,这样做效率较低。因为每一次计算一个n的生成元都需要枚举n-1个数。
更好的方法;我们可以一次枚举100000内的所有正整数m,标记“m加上m的各个数字之和得到的数有一个生成元是m”,最后查表即可。
import java.util.Scanner;
public class Main {
static int[] ans=new int[100005];
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int T=sc.nextInt();
for (int i = 1; i < ans.length; i++) {
int x=i;
int y=i;
while(x>0) {
y+=(x%10);
x/=10;
}
if(y<ans.length) {
if(ans[y]==0 || i<ans[y]) {
ans[y]=i;
}
}
}
while(T>0) {
T--;
int n=sc.nextInt();
System.out.println(ans[n]);
}
}
}