C语言编程解决实际问题

1.A➕B
求一个符合要求的、正确的代码


#include<stdio.h>
int main()
{
int a,b;
while(scanf("%d %d",&a,&b)!=EOF)
{
if(a==0&&b==0)
{
break;
}
else
printf("%d\n",a+b);
}
return 0;
}

img

2.等价字符串
根据基础的代码和新的要求,求一个完整c语言代码


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

基于new bing加以修改后的编写,可以了,没问题的话记得采纳一下哦:
【1】

img

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

void reverse(char s[]) {
    int i, j;
    for (i = 0, j = strlen(s)-1; i < j; i++, j--) {
        char c = s[i];
        s[i] = s[j];
        s[j] = c;
    }
}

int* create_array(int size) {
    int* array = (int*) malloc(size * sizeof(int));
    memset(array, 0, size * sizeof(int));
    return array;
}

void print_array(int* array, int size) {
    for (int i = size-1; i >= 0; i--) {
        printf("%d", array[i]);
    }
    printf("\n");
}

int main() {
    const int MAXLEN = 1005;
    char sa[MAXLEN], sb[MAXLEN];
    while (scanf("%s %s", sa, sb) == 2) {
        reverse(sa);
        reverse(sb);

        int lena = strlen(sa);
        int lenb = strlen(sb);

        int* a = create_array(MAXLEN);
        int* b = create_array(MAXLEN);
        int* c = create_array(MAXLEN);

        for (int i = 0; i < lena; i++) {
            a[i] = sa[i] - '0';
        }

        for (int i = 0; i < lenb; i++) {
            b[i] = sb[i] - '0';
        }

        int lenc = 0;
        for (int i = 0; i < MAXLEN; i++) {
            int t = a[i] + b[i] + c[i];
            c[i] = t % 10;
            if (t >= 10) {
                c[i+1]++;
            }
            if (c[i] > 0) {
                lenc = i + 1;
            }   
        }

       
        print_array(c, lenc);

        free(a);
        free(b);
        free(c);
    }

    return 0;
}


【2】
【法一】按照你提供的java代码转换的

img

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

// 映射
void Map(char *c, char *result) {
    // 删掉重复元素
    int len = strlen(c);
    int index = 0;
    for (int i = 0; i < len; i++) {
        char d = c[i];
        int firstPosition = -1;
        for (int j = 0; j < len; j++) {
            if (c[j] == d) {
                firstPosition = j;
                break;
            }
        }
        if (firstPosition == i) {
            result[index++] = d;
        }
    }
    result[index] = '\0';
}

int main() {
    char a[101], b[101];
    int arr1[26] = {0}, arr2[26] = {0};
    scanf("%s %s", a, b);
    int len_a = strlen(a);
    int len_b = strlen(b);
    // 得到a、b中每个字母的个数
    for (int i = 0; i < len_a; i++) {
        arr1[a[i] - 'A']++;
        arr2[b[i] - 'A']++;
    }
    // 判定两数组的对应情况
    for (int i = 0; i < len_a; i++) {
        if (arr1[a[i] - 'A'] != -1) {
            for (int j = 0; j < 26; j++) {
                if (arr2[j] == arr1[a[i] - 'A']) {
                    arr1[a[i] - 'A'] = -1;
                    arr2[j] = -1;
                    break;
                }
            }
        }
        // 输出NO
        if (arr1[a[i] - 'A'] != -1) {
            printf("NO\n");
            return 0;
        }
    }
    printf("YES\n");
    char deleteA[101], deleteB[101];
    Map(a, deleteA);
    Map(b, deleteB);
    // 输出映射
    int len_deleteA = strlen(deleteA);
    for (int i = 0; i < len_deleteA - 1; i++) {
        printf("%c->%c ", deleteA[i], deleteB[i]);
    }
    printf("%c->%c\n", deleteA[len_deleteA - 1], deleteB[len_deleteA - 1]);
    return 0;
}

【法二】简洁点的写法

img

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

int cmp(const void *a, const void *b) {
    return *(int *)a - *(int *)b;
}

int main() {
    char a[101], b[101];
    int count_a[26] = {0}, count_b[26] = {0};
    scanf("%s %s", a, b);
    int len_a = strlen(a);
    int len_b = strlen(b);
    if (len_a != len_b) {
        printf("NO\n");
        return 0;
    }
    for (int i = 0; i < len_a; i++) {
        count_a[a[i] - 'A']++;
        count_b[b[i] - 'A']++;
    }
    qsort(count_a, 26, sizeof(int), cmp);
    qsort(count_b, 26, sizeof(int), cmp);
    for (int i = 0; i < 26; i++) {
        if (count_a[i] != count_b[i]) {
            printf("NO\n");
            return 0;
        }
    }
    printf("YES\n");
    return 0;
}


  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7439968
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:C语言创建一个简单的图书管理系统(简单界面 完整代码)
  • 同时,你还可以查看手册:c语言-字符串字面量 中的内容
  • 除此之外, 这篇博客: C语言实现二维伊辛模型的蒙特卡罗方法模拟中的 C语言代码 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • //预处理部分
    #include <stdio.h>
    #include <math.h>
    #include <stdlib.h>
    #pragma warning(disable:4996)
    //忽略VS开发环境下的安全性错误提示C4996
    
    //生成一个正方形矩阵,元素随机赋值-1或1
    int** createAMatrix(int theOrder) {
    	int** aMatrix = (int**)malloc(sizeof(int*) * theOrder);
    	int i, j;
    	for (i = 0; i < theOrder; i++) {
    		aMatrix[i] = (int*)malloc(sizeof(int) * theOrder);
    		for (j = 0; j < theOrder; j++)aMatrix[i][j] = (rand() % 2) * 2 - 1;
    	}
    	return aMatrix;
    }
    
    //计算正方形矩阵所表示的ising模型的平均磁化强度
    //Map为矩阵的指针
    //Size为矩阵的边长
    double theM(int** aMatrix, int theOrder) {
    	int i, j, SUM = 0;
    	for (i = 0; i < theOrder; i++)for (j = 0; j < theOrder; j++)SUM += aMatrix[i][j];
    	return SUM * 1.0 / theOrder / theOrder;
    }
    
    //对正方形矩阵所表示的ising模型中的每个点按顺序进行蒙特卡罗模拟优化
    //Map为矩阵的指针
    //Size为矩阵的边长
    //T为ising模型的温度
    //J为ising模型中各点的相互作用系数
    void monteCarlo(int** aMatrix, int theOrder, double T, double J) {
    	int i, j, E, dE;
    	double R;
    	for (i = 0; i < theOrder; i++)for (j = 0; j < theOrder; j++) {
    		dE = 2 * J * aMatrix[i][j] * (aMatrix[(i + theOrder - 1) % theOrder][j] + aMatrix[i][(j + theOrder + 1) % theOrder] + aMatrix[(i + theOrder + 1) % theOrder][j] + aMatrix[i][(j + theOrder - 1) % theOrder]);
    		//+ theOrder 及 % theOrder 是为了在边界进行周期性循环
    		R = rand() * 1.0 / RAND_MAX;
    		if ((dE <= 0) || (exp(-dE * 1.0 / T) >= R))aMatrix[i][j] = -aMatrix[i][j];
    	}
    }
    
    //清除正方形矩阵(占用的内存)
    //Map为矩阵的指针
    //Size为矩阵的边长
    void clearMatrix(int** aMatrix, int theOrder) {
    	int i;
    	for (i = 0; i < theOrder; i++)free(aMatrix[i]);
    	free(aMatrix);
    }
    
    //模拟磁化强度随温度变化的主函数,数据显示到屏幕并保存到M-T_Data.txt文件中
    void main() {
    	int i, j, theOrder = 20, N = 1000;
    	double T, SUM, J = 1.0, L = 0.01;
    	int** aMatrix;
    	FILE* fp = NULL;
    	fp = fopen("Data.txt", "w");
    	for (T = 0.1; T <= 5; T += L) {
    		SUM = 0;
    		aMatrix = createAMatrix(theOrder);
    		for (i = N; i > 0; i--) {
    			monteCarlo(aMatrix, theOrder, T, J);
    			if (i <= 500)SUM += fabs(theM(aMatrix, theOrder));
    			//对后500个蒙特卡罗步的系统磁化强度取平均
    		}
    		clearMatrix(aMatrix, theOrder);
    		printf("%.2lf\t%.5lf\n", T, SUM / 500);
    		fprintf(fp, "%.2lf\t%.5lf\n", T, SUM / 500);
    	}
    	fclose(fp);
    }
    
  • 您还可以看一下 CSDN讲师老师的C语言精髓之编译过程视频教程课程中的 计算机的组成部分,栈内存的特点;画出内存图,引入指针的概念小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    回答:

    1. 可以通过C语言编程来解决1.A加B的问题。下面给出一个简单的示例代码:
    #include <stdio.h>
    
    int main() {
        int A, B, res;
        printf("请输入A的值:");
        scanf("%d", &A);
        printf("请输入B的值:");
        scanf("%d", &B);
        res = A + B;
        printf("A + B = %d\n", res);
        return 0;
    }
    
    1. 完整的C语言代码来解决等价字符串问题,基础要求已在参考资料的第一个段落中给出,下面给出满足新的需求的代码:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <stdbool.h>
    
    bool isEqual(char* str1, char* str2) {
        if (strlen(str1) != strlen(str2)) {  // 如果长度不等,直接返回false
            return false;
        }
        int n = strlen(str1);
        char* temp_str = (char*)malloc(sizeof(char) * (n + 1));  // 申请一个空间存储str1 + str2
        strcpy(temp_str, str1);
        strcat(temp_str, str1);  // 将str1 + str2相连形成一个长字符串
        bool res = strstr(temp_str, str2) != NULL;  // 查找str2在temp_str中的位置
        free(temp_str);  // 释放动态申请的空间
        return res;
    }
    
    int main() {
        char str1[100], str2[100];
        printf("请输入字符串1:");
        scanf("%s", str1);
        printf("请输入字符串2:");
        scanf("%s", str2);
        bool res = isEqual(str1, str2);
        if (res) {
            printf("两个字符串是等价字符串\n");
        } else {
            printf("两个字符串不是等价字符串\n");
        }
        return 0;
    }
    

    在新的需求中,我们需要判断两个字符串是否是等价字符串,即如果把一个字符串中的某个子串移到字符串开头或结尾,能够得到另一个字符串,那么这两个字符串就被认为是等价字符串。为了判断这个条件,我们可以将字符串1和字符串2相连,组成一个长字符串temp_str,然后在temp_str中查找字符串2的位置,如果能够找到,就说明字符串2是字符串1的子串,并且将字符串1中的某个子串移到了字符串开头或结尾。如果找不到,说明两个字符串不是等价字符串。