java - 如何将日期(即 1995 年 4 月 7 日)分解为:4 + 7+ 1+9+9+5 并在 java 中找到总和?
问题描述
如果用户从日历视图中选择一个日期,如 1995 年 4 月 7 日,我想计算给定日期的总和,如下所示:4+7+1+9+9+5 = 35,然后 3+5=8。其中 8 是将存储在变量中以供进一步计算的主要结果。我试图将日期存储在每个单个变量中,如下所示:
int a = 4;
int b = 7;
int c = 1;
int d = 9;
int e = 9;
int f = 5;
int result = a+b+c+d+e+f;
system.out.println(result);
但是这种方法不是一个好的做法,当然用户也不想一步一步地输入值。如何获得给定日期的总和,然后像我上面提到的那样将结果分成单个数字?
解决方案
模 9
数字的最后一位数字之和与除以9后的余数相同。除了当和为9时余数为0。由于您的所有数字都是非负数并且其中一些是正数,因此总和必然是严格正数,所以我们可以安全地假设余数 0 表示总和 9。
public static int sumOfDigits(LocalDate date) {
// I don’t know how to deal with dates from before the Gregorian calendar was introduced
if (date.isBefore(LocalDate.of(1582, Month.OCTOBER, 15))) {
throw new IllegalArgumentException("Too early");
}
int sum = date.getYear() + date.getMonthValue() + date.getDayOfMonth();
sum %= 9;
if (sum == 0) {
sum = 9;
}
return sum;
}
试试看:
System.out.println(sumOfDigits(LocalDate.of(1995, Month.APRIL, 7)));
输出是您所期望的:
8
如果你的日期选择器给你一个老式的java.util.Date
对象,像这样转换:
LocalDate date = oldfashionedDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
如果您的日期选择器将日期作为字符串提供给您,我认为在添加之前拆分没有意义。将其解析为 aLocalDate
以便您获得日期,然后按上述方式进行操作。或者简单地将数字相加,忽略不是数字的字符:
public static int sumOfDigits(String dateString) {
int sum = 0;
for (char ch : dateString.toCharArray()) {
if (Character.isDigit(ch)) {
sum += Character.getNumericValue(ch);
}
}
sum %= 9;
if (sum == 0) {
sum = 9;
}
return sum;
}
例如这样调用:
System.out.println(sumOfDigits("4/7/1995"));
这个例子和以前一样给出了输出 8。
推荐阅读
- c# - 如何使用 GetRolesForUser 使用 asp.net mvc 调用同一个表的两个字段
- android - 重新安装或卸载应用程序后如何不删除数据库 - sqllite,SugarOrm
- php - 在 WooCommerce 结账时在移动设备上将产品部分移至顶部
- amazon-cloudwatch - AWS CloudWatch 指标,带有指标的 AVG
- amazon-web-services - 如何在 cdk 堆栈之间传递变量而不会出现交叉引用错误?
- algorithm - 在范围内查找元素的高效查询
- apache-spark - 使用 pyspark 查找连接模式/adv 分区以获取最新值
- postgresql - Haskell 堆栈构建错误:构建包 postgresql-libpq-0.9.4.3 时
- apache-spark-sql - 火花作业 StackOverflowError
- angular - 如何以角度删除 SameSite 属性问题?