Java代码转换成C语言代码

1.独立元素


import java.io.BufferedInputStream;
import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner s = new Scanner(new BufferedInputStream(System.in));
        int n = s.nextInt();
        long[] a = new long[n];
        for (int i = 0; i < n; i++) {
            a[i] = s.nextLong();
        }
        //Set防重复
        Set<Long> c = new HashSet<>();
        for (long i : a) {
            c.add(i);
        }
        Long[] b = new Long[c.size()];
        c.toArray(b);
        Arrays.sort(b);
        System.out.print(b[b.length-1]);
        //按照空格顺序输出
        for (int i = 1; i < b.length; i++) {
            System.out.printf(" %d",b[b.length-1-i]);
        }
        System.out.println();
    }
}

img

2.字符串映射


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

public class Main {
    //映射
    public static String Map(String c) {
        //删掉重复元素
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < c.length(); i++) {
            char d = c.charAt(i);
            if (c.indexOf(d) == c.lastIndexOf(d)){
                sb.append(d);
            }
            else {
                int FirstPosition = c.indexOf(d);
                if (FirstPosition == i) {
                    sb.append(d);
                }
            }
        }
        return String.valueOf(sb);
    }
    public static void main(String[] args) {
        Scanner s = new Scanner(new BufferedInputStream(System.in));
        String a = s.nextLine();
        String b = s.nextLine();
        int[] arr1 = new int[26];
        int[] arr2 = new int[26];
        //得到a、b中每个字母的个数
        for(int i = 0; i < a.length(); i++) {
            arr1[a.charAt(i) - 'A']++;
            arr2[b.charAt(i) - 'A']++;
        }
        //判定两数组的对应情况
        for(int i = 0; i < a.length(); i++) {
            if(arr1[a.charAt(i) - 'A'] != -1) {
                for(int j = 0; j < 26; j++) {
                    if(arr2[j] == arr1[a.charAt(i) - 'A']) {
                        arr1[a.charAt(i) - 'A'] = -1;
                        arr2[j] = -1;
                        break;
                    }
                }
            }
            //输出NO
            if(arr1[a.charAt(i) - 'A'] != -1) {
                System.out.println("NO");
                //正常退出,程序正常执行结束退出;1为非正常,强行退出
                System.exit(0);   
            }
        }
        System.out.println("YES");
        String deleteA = Map(a);
        String deleteB = Map(b);
        //输出映射
        for (int i = 0; i <deleteA.length()-1 ; i++) {
            System.out.print(deleteA.charAt(i)+"->"+deleteB.charAt(i)+" ");
        }
        System.out.println(deleteA.charAt(deleteA.length()-1)+"->"+deleteB.charAt(deleteB.length()-1));
        s.close();
    }
}

img

引用chatgpt部分指引作答:
第一题:
运行结果如下:

img

下面是一个用C语言编写的控制台程序,用于按照要求从大到小输出独立元素。

#include <stdio.h>
#include <stdlib.h>

int main() {
    int N;
    printf("请输入正整数N:");
    scanf("%d", &N);

    int *arr = (int *)malloc(N * sizeof(int));
    if (arr == NULL) {
        printf("内存分配失败");
        return 1;
    }

    printf("请输入%d个整数,以空格分隔:", N);
    for (int i = 0; i < N; i++) {
        scanf("%d", &arr[i]);
    }

    // 对数组进行排序(冒泡排序)
    for (int i = 0; i < N - 1; i++) {
        for (int j = 0; j < N - 1 - i; j++) {
            if (arr[j] < arr[j + 1]) {
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }

    // 输出独立元素
    printf("输出结果:");
    printf("%d ", arr[0]);
    for (int i = 1; i < N; i++) {
        if (arr[i] != arr[i - 1]) {
            printf("%d ", arr[i]);
        }
    }

    free(arr); // 释放动态分配的内存

    return 0;
}

请注意,这段代码假设输入的整数都在int类型的表示范围内,并且输入的整数个数满足要求(1 < N ≤ 10000)。此外,这段代码使用了冒泡排序算法对输入的整数数组进行排序,然后输出独立元素。

第二题:
以下是一个使用C语言编写的控制台代码,实现了字符串映射的功能:

#include <stdio.h>
#include <string.h>

void mapString(char* str1, char* str2) {
    int i, j;
    int map[26];  // 存储字母映射关系的数组
    
    // 初始化映射数组为-1,表示尚未映射
    for (i = 0; i < 26; i++) {
        map[i] = -1;
    }
    
    // 判断是否可以映射
    for (i = 0; i < strlen(str1); i++) {
        int index1 = str1[i] - 'A';  // 字母在映射数组中的索引
        int index2 = str2[i] - 'A';  // 字母在映射数组中的索引
        
        // 如果当前字母已经映射过了
        if (map[index1] != -1) {
            // 如果映射结果与str2中的字母不一致,映射失败
            if (map[index1] != index2) {
                printf("NO\n");
                return;
            }
        } else {
            // 如果当前字母尚未映射,则进行映射
            map[index1] = index2;
        }
    }
    
    // 输出映射结果
    printf("YES\n");
    for (i = 0; i < 26; i++) {
        if (map[i] != -1) {
            printf("%c->%c ", 'A' + i, 'A' + map[i]);
        }
    }
}

int main() {
    char str1[101];
    char str2[101];
    
    // 读取输入的两个字符串
    fgets(str1, sizeof(str1), stdin);
    fgets(str2, sizeof(str2), stdin);
    
    // 去除换行符
    str1[strcspn(str1, "\n")] = '\0';
    str2[strcspn(str2, "\n")] = '\0';
    
    // 判断字符串映射
    mapString(str1, str2);
    
    return 0;
}

使用该代码,您可以在控制台输入两个字符串,并得到相应的输出结果。请注意,该代码假定输入的字符串由大写字母A-Z构成,并且长度不超过100。

  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7640318
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:编译原理C的词法分析器(JAVA)代码及思路
  • 除此之外, 这篇博客: java和C语言在数据类型和语法上的比较中的 一.数据类型 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 1.Java:Java的数据类型可分为两大类:
    ①基本数据类型:byte、short、int、long、double、float、boolean、char
    ②引用数据类型:类、接口、数组、枚举、注解
    ~int 类型占四个字节
    ~常量有final关键字修饰。
    ~定义float类型时,赋值时一定要在浮点数后加f,否则自动视为double类型,且会编译失败。
    ~Java中当高精度赋值给低精度类型时,会编译失败,显示不兼容的类型。
    ~Java中字符型中字符对应的Unicode编码,占2字节,可以保存单个汉字。
    ~java整数默认为int,超过int类型要加L,建议大写,否则容易和1搞混.,小数默认double.
    ~java布尔值输出就是false,和true
    ~java是强类型语言,在基本数据类型的赋值和转化上比较严格

    2.C语言:C语言的数据类型可分为:
    ①基本数据类型:short int、int(由硬件决定可能2字节也可能四字节)、long int、double、float、char、long longint(C99增加)、long double、bool(C99增加)、float_complex、double_complex、long long _complex
    ②枚举类型:enum
    ③空类型:void
    ④派生类型:指针类型(*)、数组类型([])、结构体类型(struct)、共用体类型(union)、函数类型
    -常量由#define定义。
    -C语言中定义浮点型不会出现java中的问题。
    -C语言中当高精度赋值给低精度类型时,会有精度缺失,但并不会造成编译失败。
    -C语言中字符型中字符对应ASCII码。
    -C语言中char占一个字节,不能保存单个汉字。
    ~没有boolean类型的变量,正数代表true,非正数代表false
    3.标识符
    Java:Java标识符有如下命名规则:

         1、标识符由字母、数字、 “_”、 “$”组成,且首字母不能是数字(实际上其他语言中的字符也可以);
         2、不能把Java关键字作为标识符;
         3、标识符没有长度限制;
         4、标识符对大小写敏感。
         5、自定义标识符最好取具有一定意义的字符串,便于记忆和理解。
    

    C语言:C语言标识符有如下规则:

       1、标识符必须以字母a~z、 A~Z或下划线开头,后面可跟任意个(可为0)字符,这些字符可以是字母、下划线和数字,其他字符不允许出现在标识符中。
       2、标识符区分大小写字母 
       3、标识符的长度,c89规定31个字符以内,c99规定63个字符以内 
       4、C语言中的关键字,有特殊意义,不能作为标识符 
    

    4.运算符
    java中"+"还可以作为字符串的连接符.

  • 您还可以看一下 孙杰老师的图解&代码-常见算法的原理和实现-Java版课程中的 8分钟掌握算法(四),广度优先穷竭贪心算法解答“选硬币”问题,JAVA实现小节, 巩固相关知识点