百里狂生 @ 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
@百里狂生