这个怎么输入啊

P1320 压缩技术(续集版)

百里狂生 @ 2024-08-24 12:11:10

精通c++想着自学java,可是一上手就是各种疑难杂症

#include<iostream>
#include<cmath>
using namespace std;
int i;
char ch;
int a[400000];
int n,t,p;
int main()
{
    i=1;
    while(cin>>ch)
        a[i++]=ch;
    n=sqrt(i-1);
    cout<<n<<" ";
    p=1;
    if(a[p]!='0')
        cout<<0<<" ";
    while(p<=n*n)
    {
        if(a[p]==a[p+1])
        {
            t++;
            p++;
        }
        else
        {
            cout<<t+1<<" ";
            t=0;
            p++;
        }
    }
    return 0;
}

这是通过的c++原程序,我把它翻译成了java,变成了这样:


import java.util.Scanner;

public class P1320{
    static int i=0,n=0,t=0,p=0,ch;
    static int[] a=new int [400000];
    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        while(in.hasNext()){
            ch=in.nextInt();
            a[++i]=ch;
        }
        n=(int)Math.sqrt(i);
        System.out.print(n+" ");
        if(a[1]!='0'){
            System.out.print("0 ");
        }else{
            System.out.print(" ");
        }
        p=1;
        while(p<=n*n){
            if(a[p]==a[p+1]){
                t++;
                p++;
            }else{
                System.out.print(t+1+" ");
                t=0;
                p++;
            }
        }
        in.close();
    }
}

如你所见,while输入始终无法完成,无论是按ctrl+z还是按ctrl+d都无法完成输入,交上去是RE和WA的混合版,求大佬赐教!!


by xiao_kwt @ 2024-08-24 12:27:01

您的Java程序旨在处理一系列整数输入,并计算并输出几个特定的统计信息。然而,程序中存在一些问题和潜在的改进点。我将逐一指出并提供修改后的代码。\

问题\ 变量类型不匹配:ch 变量被声明为 int,但在比较 a[1]!='0' 时尝试与 char 类型的 '0' 进行比较。\ 数组越界访问:在循环 while(p<=nn) 中,如果 nn 大于数组的实际长度(即 i),则会发生数组越界。\ 逻辑错误:您的代码意图是统计连续相同数字的长度,但实现方式有误。特别是,当数组中没有连续相同的数字时,应该输出 1 而不是 0(如果数组非空且首元素不是 0)。\ 性能考虑:数组 a 被初始化为 400000 个元素,但实际使用的长度可能远小于此,这可能导致内存浪费。\ 修改后的代码

import java.util.Scanner;  

public class P1320 {  
    static int i = 0, n = 0, t = 0, p = 0;  
    static int[] a = new int[400000];  

    public static void main(String[] args) {  
        Scanner in = new Scanner(System.in);  
        while (in.hasNextInt()) {  
            a[++i] = in.nextInt();  
        }  
        n = (int) Math.sqrt(i);  
        System.out.print(n + " ");  

        // 检查第一个元素是否为0  
        if (i > 0 && a[1] != 0) {  
            System.out.print("0 ");  
        } else {  
            System.out.print(" ");  
        }  

        // 初始化p为1,但检查应从2开始(跳过第一个元素,因为已经单独处理)  
        p = 2;  
        if (i > 0) { // 确保数组非空  
            t = 1; // 初始化t为1,因为至少有一个元素  
            while (p <= i) {  
                if (p < i && a[p] == a[p - 1]) {  
                    t++;  
                } else {  
                    System.out.print(t + " ");  
                    t = 1; // 重置t为1,准备下一个序列  
                }  
                p++;  
            }  
        }  
        in.close();  
    }  
}

说明\ 我修改了 ch 变量的使用,因为它实际上是用来存储整数输入,所以保持为 int 类型。 我修正了数组越界的问题,现在 while 循环条件为 p <= i,确保不会超出实际输入的数组长度。\ 我调整了逻辑以正确输出连续相同数字的长度,包括处理数组第一个元素(这里假设您不需要对第一个元素进行特殊处理,除了检查是否为0)。\ 我添加了检查以确保数组非空,才执行统计连续数字长度的逻辑。\ 我将 t 的初始值设置为1,以正确处理单个元素或数组以相同数字开头的情况。\ 文心一言


by xiao_kwt @ 2024-08-24 12:41:03

@百里狂生


|