当前位置: 首页 > 知识库问答 >
问题:

使用Java查找Kaprekars常数

范彭亮
2023-03-14

所以我尝试了这个在线挑战,但得到了运行时错误。请帮忙。我是编程新手。我附上了问题陈述和我的解决方案。

挑战使用Java语言,让函数KaprekarsConstant(num)取一个四位数的整数(至少有两位是不同的),并对该数字执行以下例程:

  1. 按降序和升序排列数字

注:在6174上表演例行公事总是会给你6174 (7641 - 1467 = 6174)。

例如:如果num3524则程序应返回3:(通过1)5432-2345=3087,(通过2)8730-0378=8352,(通过3)8532-2358=6174。

以下是我的解决方案:

import java.util.*;
import java.io.*;

class Main {
    public static int KaprekarsConstant(int num) {
        int diff = 0, count = 0;
        while (diff != 6174) {
            String s1 = String.valueOf(num);
            int[] ch1 = new int[s1.length()];
            for (int i = 0; i < ch1.length; i++) {
                ch1[i] = s1.charAt(i);
            }
            Arrays.sort(ch1);
            String s2 = String.valueOf(ch1);
            String s3 = "";
            for (int j = s2.length() - 1; j >= 0; j++) {
                s3 += s2.charAt(j);
            }
            int a = Integer.parseInt(s2);
            int b = Integer.parseInt(s3);
            if (a > b) {
                diff = a - b;
            } else if (b > a) {
                diff = b - a;
            } else {
                System.out.println("goal cant be reached");
                break;

            }
            count++;
            num = diff;

        }
        return num;

    }

    public static void main(String[] args) {

        Scanner s = new Scanner(System.in);
        System.out.print(KaprekarsConstant(s.nextLine()));
    }

}

共有3个答案

那弘
2023-03-14

此解决方案的代码行较少:

import static java.lang.System.out;
import java.util.Arrays;

/**
 * @see https://en.wikipedia.org/wiki/6174_%28number%29
 */
public class KaprekarConstant {

    public static void main(String[] args) {
        assert(count(3524) == 3);
        assert(count(3087) == 2);
        assert(count(8352) == 1);
        assert(count(6174) == 1);
        out.println("All passed.");
    }

    public static int count(int start) {
        int ct = 0;

        do {
            start = calc(start); 
            ct++;
        } while (start != 6174);

        return ct;
    }

    static int calc(int n) {

        String n1s = String.format("%04d", n);

        char[] chs = n1s.toCharArray();
        Arrays.sort(chs);
        n1s = new String(chs);

        String n2s = new StringBuilder(new String(n1s)).reverse().toString();
        int n1 = Integer.parseInt(n1s);
        int n2 = Integer.parseInt(n2s);

        return Math.max(n1, n2) - Math.min(n1, n2);
    }
}

下面是一个Python实现:

def kc_count(start_int):

    def kc_calc(n):
        ns1 = ''.join(sorted("%04d" % n))
        ns2 = ns1[::-1]
        return max(int(ns1), int(ns2)) - min(int(ns1), int(ns2))

    ct = 0;
    while True:
        start_int = kc_calc(start_int)
        ct += 1
        if start_int == 6174:
            break
    return ct

assert(kc_count(3524) == 3)
assert(kc_count(3087) == 2)
assert(kc_count(8352) == 1)
assert(kc_count(6174) == 1)
秦宏硕
2023-03-14

有一些基本的语法

import java.util.*;
import java.io.*;

public class Main {
    public static int KaprekarsConstant(int num) {
        int diff = 0, count = 0;
        while (diff != 6174) {
            String s1 = String.valueOf(num);

            char[] ch1 = new char[s1.length()];
            for (int i = 0; i < ch1.length; i++) {
                ch1[i] = s1.charAt(i);
            }
            Arrays.sort(ch1);
            String s2 = new String(ch1);

            String s3 = "";
            for (int j = s2.length() - 1; j >= 0; j--) {
                s3 += s2.charAt(j);
            }

            int a = Integer.parseInt(s2);
            int b = Integer.parseInt(s3);
            if (a > b) {
                diff = a - b;
            } else if (b > a) {
                diff = b - a;
            } else {
                System.out.println("goal cant be reached");
                break;

            }
            count++;
            num = diff;

        }
        return count;

    }

   public static void main(String[] args) {

        Scanner s = new Scanner(System.in);
        System.out.print(KaprekarsConstant(s.nextInt()));
    }

}
苏边浩
2023-03-14

请尝试以下代码:

/**
 * KaprekarConstant
 */
import java.util.InputMismatchException;
import java.util.Scanner;
import java.util.Arrays;
import java.util.Collections;

public class KaprekarConstant {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int inputNumber;
        char[] digits;

        System.out.print("Enter four digit number: ");
        try {
            inputNumber = scan.nextInt();
            if (checkLength(inputNumber))
                throw new Exception();

            Kaprekar(inputNumber);

        } catch (InputMismatchException e) {
            System.out.println("Not a number");
        } catch (Exception ex) {
            System.out.println("Number must have four digits");
        } finally {
            scan.close();
        }
    }

    public static void Kaprekar(int target) {
        int maximum = 0, minimum = 0, result = 0;
        Integer[] digits = new Integer[4];

        if (target == 6174)
            return;

        int i = 0;
        while (i < 4) {
            digits[i] = target % 10;
            target /= 10;
            i++;
        }

        Arrays.sort(digits);
        minimum = toInt(digits);

        Arrays.sort(digits, Collections.reverseOrder());
        maximum = toInt(digits);

        result = maximum - minimum;

        System.out.println(String.format("%d - %d = %d", maximum, minimum, result));
        Kaprekar(result);
    }

    public static boolean checkLength(int number) {
        if (String.valueOf(number).length() < 5 && String.valueOf(number).length() > 3)
            return false;
        return true;
    }

    public static int toInt(Integer[] digits) {
        int number = 0;
        for (int digit : digits) {
            number *= 10;
            number += digit;
        }
        return number;
    }
}

我认为这是找到卡佩卡常数的最好方法。

 类似资料:
  • 我已经花了几个小时试图找到使用Selenium WebDriver查找元素的方法。我假设我需要使用driver.find元素(By.xpath ("")), 但我不太确定如何使用。 我需要找到并单击“clickon”元素。问题是该元素的一部分正在更改(请参见屏幕截图),我需要从文件中提取并放入xpath。 我将感谢任何帮助。

  • 我是这个MapReduce的新手,不知道如何做到这一点。 这也是我的文本文件的样子: tab/hdhd/hip/home.slkj.skjdh.dgsyququ/djkdjj.****文本不是创建的**我必须搜索出现的特定文本。

  • 问题内容: 我有一个具有以下结构的行表,其中每一行都有每个人喜欢的颜色和该人所属组的列表。我如何返回每个组中最常见的颜色的列表? 您可以组合设置重叠,获取交点然后进行其他计数和排名吗? 问题答案: 快速而肮脏: 一个更好 [`LATERAL JOIN`](http://www.postgresql.org/docs/current/interactive/sql-select.html) 在Pos

  • 问题内容: 假设有一个名为Type的简单枚举定义如下: 找到具有给定值的正确枚举通常是通过带for循环的静态方法(假设该方法在枚举内部定义)完成的,例如: 我认为用Stream API表示的功能等效如下: 我们怎么能写得更好,更简单?这段代码让人感觉很强迫,而且不太清楚。该特别是似乎笨重和滥用,因为它不累积什么,不进行计算,并始终直接返回(提供过滤器返回一个值- 如果不说的显然是个灾难),更何况是

  • 问题内容: 我们正在做一个用Java编码的项目(针对JRE 1.6编译),并且需要一些小但显然复杂的功能的帮助:我们想在连接特定的无线网络时执行某些操作,例如,当连接的SSID ==“ myNetworkAtHome时”或类似内容。 在浏览了该站点,谷歌和Java文档之后,我们更加接近了。在此处查看代码后:http : //download.oracle.com/javase/tutorial/n

  • 问题内容: 我有以下内容…我不会说问题,而是情况。 我有一些带有标签和其他内容的HTML。我想搜索每个URL的HTML。我现在正在通过检查它说“ h”,“ t”,“ t”然后“ p”的位置来做到这一点,但是我认为这不是一个很好的解决方案 有什么好主意吗? 补充:我正在寻找某种伪代码,但是,以防万一,我正在为此项目使用Java 问题答案: 尝试使用HTML解析库,然后在HTML文档中搜索标签。 并非