判断一个的尾数 判断一个数所包含某数字
1.求尾数的情况相对简单 直接用所求的数与10取余(n%10),再进行判断即可。
2.求数中是否包含某数字的话,在求余判断的情况下还要判断是否已经到达数字的末位了。
下面用蓝桥杯的题目进行讲解
1.特别数的和小明对数位中含有 2、0、1、9 的数字很感兴趣,在 1 到 40 中这样的数包括 1、2、9、10 至 32、39 和 40,共 28 个,他们的和是 574
请问,在1到n中,所有这样的数的和是多少
【输入格式】
输入一行包含两个整数 n。
【输出格式】
输出一行,包含一个整数,表示满足条件的数的和。
【样例输入】
40
【样例输出】
574
【评测用例规模与约定】
对于 20% 的评测用例, 1 ≤ n ≤ 10。
对于 50% 的评测用例, 1 ≤ n ≤ 100。
对于 80% 的评测用例, 1 ≤ n ≤ 1000。
对于所有评测用例, 1 ≤ n ≤ 10000。
解题思路:这是一道典型的求一个数是否包含某数字的问题,它的解法与上面2中所说的解法类似。我们应该先从尾数的情况开始考虑,对所求的数进行求模,看是否包含这个尾数。接着不断地与10相除,让它不断地取出上一位,这时再进行相应的判断(例如223%10的结果并不会满足尾数的情况,这时可以通过与10相除得到22,这时再与10求模,便可得知它是满足情况的解)。
核心代码
//判断尾数是否含有1,2,9,0
public static boolean check(int n) {
if(n%10==0||n%10==1||n%10==2||n%10==9) {
return true;
}
if((n/10==0)&&(n%10!=1||n%10!=2||n%10!=9)) { // 这里的n/10 是为了检测是否已经到达末位
return false;
}
else
return check(n/10); // 检测数字的上1位
}
全部代码
public class 特别的数 {
//判断尾数是否含有1,2,9,0
public static boolean check(int n) {
if(n%10==0||n%10==1||n%10==2||n%10==9) {
return true;
}
if((n/10==0)&&(n%10!=1||n%10!=2||n%10!=9)) {
return false;
}
else
return check(n/10);
}
public static void main(String[] args) {
int sum=0;
Scanner s=new Scanner(System.in);
int n=s.nextInt();
for(int i=1;i<=n;i++) {
if(check(i)) {
//System.out.print(i+" ");
sum+=i;
}
}
s.close();
System.out.println(sum);
}
}
2. 数的分解
【问题描述】把 2019 分解成 3 个各不相同的正整数之和,并且要求每个正整数都不包含数字 2 和 4,一共有多少种不同的分解方法?注意交换 3 个整数的顺序被视为同一种方法,例如 1000+1001+18 和1001+1000+18 被视为同一种。
解题思路:同上(注意为了没有重复的分解方法应该确保分解出来的3个数a,b,c的大小为 a<b<c)
核心代码:
/**
* 检查每个正整数是否包含数字2 和4
* @param a
* @return
*/
public static boolean check(int a) {
if(a/10==0&&a!=2&&a!=4) {// a/10检查是否已经是最后一位
return true;
}
if(a%10==2||a%10==4) {
return false;
}
else
return check(a/10);
}
全部代码
public class 数的分解 {
public static void main(String[] args) {
int count=0;
for(int i=1;i<2019;i++) {
if(check(i)) {
for(int j=i+1;j<2019;j++) {
if(check(j)) {
int k=2019-i-j;
if(k>j&&check(k)) {
count++;
}
}
}
}
}
System.out.println(count);
}
/**
* 检查每个正整数是否包含数字2 和4
* @param a
* @return
*/
public static boolean check(int a) {
if(a/10==0&&a!=2&&a!=4) {// a/10检查是否已经是最后一位
return true;
}
if(a%10==2||a%10==4) {
return false;
}
else
return check(a/10);
}
}