
本教程详细阐述了在java中统计数字(包括电话号码等长数字)中奇偶位数的方法。文章首先探讨了基于整数运算的传统方法及其在处理大数字时的局限性(如整型溢出),并提出了使用`long`类型的改进方案。随后,重点介绍了处理电话号码等非标准数字字符串的最佳实践,通过java stream api实现高效、简洁的奇偶位数统计,同时规避了数值类型转换的潜在问题。
在Java中,统计一个数字中奇数或偶数位最直观的方法是利用取模和除法运算,逐位分离数字并检查其奇偶性。
以下是一个基于整数的计数函数示例:
public class DigitCounter {
static final int EVEN = 0; // 定义常量用于表示偶数
static final int ODD = 1; // 定义常量用于表示奇数
/**
* 统计给定数字中符合指定余数(奇数或偶数)的位数。
* @param n 要分析的数字。
* @param remainder 期望的余数 (0 for even, 1 for odd)。
* @return 符合条件的位数。
*/
static int count(int n, int remainder) {
int count = 0;
while (n > 0) {
int rem = n % 10; // 获取最低位
if (rem % 2 == remainder) {
count++;
}
n = n / 10; // 移除最低位
}
return count;
}
public static void main(String[] args) {
System.out.println("数字 12233 中偶数位的数量: " + count(12233, EVEN)); // 输出 2
System.out.println("数字 12233 中奇数位的数量: " + count(12233, ODD)); // 输出 3
}
}上述count函数使用int类型作为输入参数。然而,Java的int类型有其最大值限制(约21亿)。对于电话号码这类通常超过int最大值的数字(例如5143436111),直接使用int会导致数据溢出,从而产生不正确的结果或编译错误。
为了解决这个问题,可以使用long类型,它能表示更大的整数范围。
立即学习“Java免费学习笔记(深入)”;
public class DigitCounterLong {
static final int EVEN = 0;
static final int ODD = 1;
/**
* 统计给定长整型数字中符合指定余数(奇数或偶数)的位数。
* @param n 要分析的数字 (long 类型)。
* @param remainder 期望的余数 (0 for even, 1 for odd)。
* @return 符合条件的位数。
*/
static int count(long n, int remainder) { // 将参数类型改为 long
int count = 0;
while (n > 0) {
long rem = n % 10; // 确保rem也是long类型,尽管这里int也足够
if (rem % 2 == remainder) {
count++;
}
n = n / 10;
}
return count;
}
public static void main(String[] args) {
long telUDM = 5143436111L; // 使用 L 后缀表示 long 字面量
long telJean = 4501897654L;
System.out.println("telUDM 中奇数位的数量: " + count(telUDM, ODD));
System.out.println("telJean 中偶数位的数量: " + count(telJean, EVEN));
}
}注意事项:
本文档主要讲述的是Matlab语言的特点;Matlab具有用法简单、灵活、程式结构性强、延展性好等优点,已经逐渐成为科技计算、视图交互系统和程序中的首选语言工具。特别是它在线性代数、数理统计、自动控制、数字信号处理、动态系统仿真等方面表现突出,已经成为科研工作人员和工程技术人员进行科学研究和生产实践的有利武器。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
8
尽管long类型可以处理更大的数字,但对于电话号码这类可能包含非数字字符(如破折号、括号)或长度超过long范围,以及需要保留前导零(例如国际区号)的情况,将其视为纯数字进行处理并不总是最佳选择。
电话号码在实际应用中更常被视为字符串而非纯数字。将其作为字符串处理可以避免数值溢出、保留前导零,并能处理包含非数字字符的情况。Java 8引入的Stream API为处理字符串中的字符序列提供了强大而简洁的工具。
import java.util.function.IntPredicate;
public class PhoneNumberDigitCounter {
/**
* 检查一个数字是否为偶数。
* @param number 待检查的数字。
* @return 如果是偶数则返回 true,否则返回 false。
*/
private static boolean isEven(int number) {
return number % 2 == 0;
}
/**
* 检查一个数字是否为奇数。
* @param number 待检查的数字。
* @return 如果是奇数则返回 true,否则返回 false。
*/
private static boolean isOdd(int number) {
return number % 2 == 1;
}
/**
* 统计字符串中偶数数字的个数。
* @param str 包含数字的字符串。
* @return 偶数数字的个数。
*/
private static long countEvenDigits(String str) {
// 过滤掉非数字字符,然后将数字字符转换为数值,再筛选偶数并计数
return str.chars()
.filter(Character::isDigit) // 确保只处理数字字符
.map(Character::getNumericValue) // 将字符转换为对应的整数值
.filter(PhoneNumberDigitCounter::isEven) // 筛选偶数
.count(); // 统计数量
}
/**
* 统计字符串中奇数数字的个数。
* @param str 包含数字的字符串。
* @return 奇数数字的个数。
*/
private static long countOddDigits(String str) {
// 过滤掉非数字字符,然后将数字字符转换为数值,再筛选奇数并计数
return str.chars()
.filter(Character::isDigit) // 确保只处理数字字符
.map(Character::getNumericValue) // 将字符转换为对应的整数值
.filter(PhoneNumberDigitCounter::isOdd) // 筛选奇数
.count(); // 统计数量
}
public static void main(String[] args) {
String telUDM = "5143436111";
String telJean = "4501897654";
System.out.println("telUDM 中奇数位的数量: " + countOddDigits(telUDM));
System.out.println("telJean 中偶数位的数量: " + countEvenDigits(telJean));
// 预期输出:
// telUDM 中奇数位的数量: 7
// telJean 中偶数位的数量: 5
}
}代码解析:
在Java中统计数字的奇偶位数,应根据实际场景选择合适的方法:
通过采用基于字符串和Stream API的方法,代码不仅更具可读性,而且在处理复杂和多样化的数字格式时也更加灵活和强大。
以上就是Java中数字奇偶性统计与长数字处理教程的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号