无法生成

时间:2015-04-24 10:34:26

标签: java algorithm

虽然问题看似简单,但这里是: -

Kaprekar数字是一个带有d位数的正整数n,这样当我们将它的正方形分成两部分时 - 一个带有d个数字的右手棋子r和一个包含剩余d或d-1的左手棋子l数字,各部分的总和等于原始数字(即l + r = n)。 任务 给出两个正整数p和q,其中p小于q。编写一个程序来确定p和q(包括两者)之间的范围内有多少Kaprekar数,并将它们全部显示出来。

输入格式

将有两行输入:p,最低值q,最高值

约束:

0<p<q<100000

输出格式

输出给定范围内的每个Kaprekar数,在一行上以空格分隔。如果给定范围内不存在Kaprekar数字,则打印INVALID RANGE。

我无法清除

范围内的测试用例
22223
99999

在上述范围内,应该生成以下数字: -

77778 82656 95121 99999

这是我的代码: -

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

public class Solution {

    public static void main(String[] args) {
        /* Enter your code here. Read input from STDIN. Print output to STDOUT. Your class should be named Solution. */
        Scanner scan = new Scanner(System.in);
        int p = scan.nextInt();
        int q = scan.nextInt();
        boolean exist = false;
        if(q <= p){
            System.out.println("INVALID RANGE");
        }
        int m = 0,n = 0;
        long sqr = 0;
        String numb = "";
        String[] digits = new String[2];
        for(int i = p; i <= q; i++){
            if(i == 1)System.out.print(1 + " ");
            else{
            sqr = i*i;
            numb = String.valueOf(sqr);// Changing it into a string.
            if(numb.length() % 2 == 0){
                digits[0] = numb.substring(0, numb.length()/2);//Splitting it into two parts
                digits[1] = numb.substring(numb.length()/2);
            }else{
                digits[0] = numb.substring(0, (numb.length() - 1)/2);
                digits[1] = numb.substring((numb.length() -1)/2);
            }
              if(digits[0] == "" )
                  m = 0;
              if(digits[1] == "")
                  n = 0;
              if(!digits[1].equals("") && !digits[0].equals("")){
              m = Integer.parseInt(digits[0]);
              n = Integer.parseInt(digits[1]);
              }  
            if(i == (m + n) ){ //Testing for equality
                System.out.print(i + " ");
                exist = true;
            }
        }
      }
        if(exist == false){// If exist is never modified print Invalid Range.
            System.out.println("INVALID RANGE");
        }
    }
}

3 个答案:

答案 0 :(得分:2)

import java.util.*;
public class Kaprekar
{
public static void main(String args[])
{
Scanner sc=new Scanner(System.in);
System.out.println("Enter a number");
int num=sc.nextInt(); 
int sq=num*num; String sq1=Integer.toString(sq);
int mid=(Integer.toString(sq).length())/2;
int rem=sq%((int)Math.pow(10,sq1.length()-mid));
int quo=sq/((int)Math.pow(10,sq1.length()-mid));
int sum=rem+quo;
if(sum==num)
{System.out.println("Kaprekar");}else{System.out.println("Not Kaprecar");}

}    }

答案 1 :(得分:0)

将循环索引i的类型从int更改为long修复了问题。

i * i的平方计算溢出了int的上限,因此通过将其更改为long我们能够完成所需的计算。

感谢Rup指出这一点。

清除所有测试用例的代码在这里: -

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

public class Solution {

    public static void main(String[] args) {
        /* Enter your code here. Read input from STDIN. Print output to STDOUT. Your class should be named Solution. */
        Scanner scan = new Scanner(System.in);
        int p = scan.nextInt();
        int q = scan.nextInt();
        boolean exist = false;
        if(q <= p){
            System.out.println("INVALID RANGE");
            return;
        }
        int m = 0,n = 0;
        long sqr = 0;
        String numb = "";
        String[] digits = new String[2];
        for(long i = p; i <= q; i++){
            if(i == 1)System.out.print(1 + " ");
            else{
            sqr = i*i;
            numb = String.valueOf(sqr);
            if(numb.length() % 2 == 0){
                digits[0] = numb.substring(0, numb.length()/2);
                digits[1] = numb.substring(numb.length()/2);
            }else{
                digits[0] = numb.substring(0, (numb.length() - 1)/2);
                digits[1] = numb.substring((numb.length() -1)/2);
            }
              if(digits[0] == "" )
                  m = 0;
              if(digits[1] == "")
                  n = 0;
              if(!digits[1].equals("") && !digits[0].equals("")){
              m = Integer.parseInt(digits[0]);
              n = Integer.parseInt(digits[1]);
              }  
            if(i == (m + n) ){ 
                System.out.print(i + " ");
                exist = true;
            }
        }
      }
        if(exist == false){
            System.out.println("INVALID RANGE");
        }
    }
}

答案 2 :(得分:0)

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

class Kaprekar {

    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);
        int p = scanner.nextInt();
        int q = scanner.nextInt();
        long i,n,s,a,c,k,d,e=0;

        for(i=p;i<=q;i++)
        { 
            k=i;d=0;
            while(k!=0)
            { 
                d++;
                k=k/10;
             }
            c=0;s=0;n=i*i;
            while(n!=0)
            {
                a=n%10;
                n=n/10;
                s=s+ (int)Math.pow(10,c)*a;
                c++;
                if(n+s==i&&(c==d||c==d-1)&&s!=0)
                { 
                    System.out.print(i+" ");
                    e++; break;
                }
              }
             }
        if(e==0)
        {
         System.out.println("INVALID RANGE");
         }
        scanner.close();
    }
}