蓝桥杯算法提高vip试题P0404
程序员文章站
2022-06-12 13:49:59
...
**
首先我们先看下今天这道题
计算一个无符号整数的阿尔法乘积。对于一个无符号整数x来说,它的阿尔法乘积是这样来计算的:如果x是一个个位数,那么它的阿尔法乘积就是它本身;否则的话,x的阿尔法乘积就等于它的各位非0的数字相乘所得到的那个整数的阿尔法乘积。例如,4018224312的阿尔法乘积等于8,它是经过以下的几个步骤计算出来的:
4018224312à418224312à3072
3072à372à42
42à4*2à8
输入:
4018224312
输出:
8
**
看到这题当时我心里第一时间想到用数组来解决,不过在审题的时候我就把这个想法否决了因为这个很简单不需要用复杂的数组来解决,直接用一个变量储存每次这个数%10后的值的乘积不就好了么。于是乎开始写代码
第一次`
`import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
System.out.println(arefa(sc.nextInt()));
}
static int arefa(int a) {
int temp=1;
while(a>0) {
temp*=a%10==0?1:a%10;//这里有个坑就是如果这个数中如果有0怎么办,我这里直接用三元表达式将0变成1
a=a/10;
}
//上面实现了该数的一次运算,但是我们的输出结果必须是一位数所以我们需要一个判断如下:
if (temp>9) {
return arefa(temp);//当这个数被操作一次后还不是一位数就再次递归这个函数
}
return temp;
}
}
ok?在本地测试了几次发现没问题于是提交了
然后居然看到只有80分
原来是我没考虑周全在等于0的时候没有做处理然后就是当该数为4018224312时居然越界了不能用int来保存了
算了,????谁让咱没动脑子呢
改好代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
System.out.println(arefa(sc.nextLong()));
}
static long arefa(long a) {
if (a==0) {
return a;
}
int temp=1;
while(a>0) {
temp*=a%10==0?1:a%10;
a=a/10;
}
if (temp>9) {
return arefa(temp);
}
return temp;
}
}
这次就是满分了,唉,下次做题可不能乱来喽
下一篇: 从零开始搭建一个博客网站--项目环境搭建