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;
}
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();
}
}
基于new bing加以修改后的编写,可以了,没问题的话记得采纳一下哦:
【1】
#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代码转换的
#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;
}
【法二】简洁点的写法
#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;
}
//预处理部分
#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);
}
回答:
#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;
}
#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中的某个子串移到了字符串开头或结尾。如果找不到,说明两个字符串不是等价字符串。