首页 > 解决方案 > 如何将日期(即 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); 

但是这种方法不是一个好的做法,当然用户也不想一步一步地输入值。如何获得给定日期的总和,然后像我上面提到的那样将结果分成单个数字?

标签: javaandroid

解决方案


模 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。


推荐阅读