myd1120221973 2022-11-09 19:07 采纳率: 0%
浏览 8

最开始拿到的字符ab没错,经历了一段跟ab无关的代码ab就只剩垃圾值了

`最开始拿到的ab是对的,经历了一段跟ab无关的代码ab就只剩垃圾值了
#include<stdio.h>
#include<string.h>
#include<math.h>
int main(){
char a[20],b[20];
scanf("%s",a);
scanf("%s",b);
int i,l1,l2,j,flag=0,key=0,u=0;
int c[20],d[20],sum1[36],sum2[36];
l1=strlen(a);
l2=strlen(b);
a[l1]='\0';
b[l2]='\0';
memset(c,0,sizeof(c));
memset(d,0,sizeof(d));
memset(sum1,0,sizeof(sum1));
memset(sum2,0,sizeof(sum2));
//将字符转化为数字之第一个数
for(i=0;i<l1;i++){
//字符为数字的情况
if(a[l1-i-1]>='0'&&a[l1-i-1]<='9'){
c[i]=a[l1-1-i]-'0';
}
//字符为字母的情况
if(a[l1-i-1]>='A'&&a[l1-i-1]<='Z'){
c[i]=a[l1-1-i]-55;
}
}//第二个数
for(i=0;i<l2;i++){
if(b[l2-i-1]>='0'&&b[l2-i-1]<='9'){
d[i]=b[l2-i-1]-'0';
}
if(b[l2-i-1]>='A'&&b[l2-i-1]<='Z'){
d[i]=b[l2-i-1]-55;
}
}
for(i=2;i<=36;i++){
for(j=0;j<l1;j++){
//当有超越进制的情况,跳出,下一轮循环
if(c[j]>=i){
flag++;
break;
}else{
//否则算出该数转化成十进制的结果
sum1[i]=sum1[i]+c[j]*pow(i,j);
}
}
}
for(i=2;i<=36;i++){
for(j=0;j<l2;j++){
if(d[j]>=i){
key++;
break;
}else{
sum2[i]=sum2[i]+d[j]*pow(i,j);
}
}
}
//比较是否有相同情况
for(i=2+flag;i<=36;i++){
for(j=2+key;j<=36;j++){
if(sum1[i]==sum2[j]){
printf("%s (base %d) = %s (base %d)\n",a,i,b,j);
return 0;
}
}
}
printf("%s is not equal to %s in any base 2..36",a,b);
return 0;
}


用代码块功能插入代码,请勿粘贴截图
  • 写回答

1条回答 默认 最新

  • 科技梦想家 2024-09-24 00:03
    关注

    以下内容由AIGC 及 gpt.4o 科技梦想家编程波士 共同为您回答解决方案、有用望采纳☀️☀️:

    看起来你在处理字符串 a 和 b 时遇到了问题,尤其是在字符串变成“垃圾值”后。以下是对你的代码进行的一些分析和修复建议。

    代码分析
    输入处理:

    使用 scanf 读取字符串时,注意不要超出数组边界。
    字符串结束符:

    scanf 会自动在读取的字符串末尾添加 \0,所以手动设置 a[l1] = '\0'; 和 b[l2] = '\0'; 是多余的。
    转换过程:

    你的转换逻辑看起来是合理的,但在处理超出基数的字符时要小心,确保它不会影响后续计算。
    数组初始化:

    使用 memset 来初始化数组是一个好习惯。
    修复后的代码

    #include <stdio.h>
    #include <string.h>
    #include <math.h>
    
    int main() {
        char a[20], b[20];
        scanf("%s", a);
        scanf("%s", b);
        
        int l1 = strlen(a);
        int l2 = strlen(b);
        int c[20] = {0}, d[20] = {0}, sum1[37] = {0}, sum2[37] = {0};
        
        // 将字符转化为数字
        for (int i = 0; i < l1; i++) {
            if (a[l1 - i - 1] >= '0' && a[l1 - i - 1] <= '9') {
                c[i] = a[l1 - 1 - i] - '0';
            } else if (a[l1 - i - 1] >= 'A' && a[l1 - i - 1] <= 'Z') {
                c[i] = a[l1 - 1 - i] - 'A' + 10; // 'A' -> 10, 'B' -> 11, ...
            }
        }
        
        for (int i = 0; i < l2; i++) {
            if (b[l2 - i - 1] >= '0' && b[l2 - i - 1] <= '9') {
                d[i] = b[l2 - 1 - i] - '0';
            } else if (b[l2 - i - 1] >= 'A' && b[l2 - i - 1] <= 'Z') {
                d[i] = b[l2 - 1 - i] - 'A' + 10; // 'A' -> 10, 'B' -> 11, ...
            }
        }
    
        int flag = 0, key = 0;
        
        // 计算 sum1 和 sum2
        for (int i = 2; i <= 36; i++) {
            for (int j = 0; j < l1; j++) {
                if (c[j] >= i) {
                    flag++;
                    break;
                } else {
                    sum1[i] += c[j] * pow(i, j);
                }
            }
            
            for (int j = 0; j < l2; j++) {
                if (d[j] >= i) {
                    key++;
                    break;
                } else {
                    sum2[i] += d[j] * pow(i, j);
                }
            }
        }
        
        // 比较
        for (int i = 2 + flag; i <= 36; i++) {
            for (int j = 2 + key; j <= 36; j++) {
                if (sum1[i] == sum2[j]) {
                    printf("%s (base %d) = %s (base %d)\n", a, i, b, j);
                    return 0;
                }
            }
        }
        
        printf("%s is not equal to %s in any base 2..36\n", a, b);
        return 0;
    }
    
    
    

    主要修改
    删除多余的字符串结束符设置:不需要手动添加 \0。
    更清晰的字符转数字逻辑:统一处理字符到数字的转换。
    调试建议
    打印调试信息:在关键地方添加 printf 语句,可以帮助你检查变量的值是否符合预期。
    检查输入:确保输入的字符串不超过数组的长度,避免越界。
    这样处理后,a 和 b 应该能够正确存储字符串值,而不会变成垃圾值。希望这些修改能解决你遇到的问题!

    评论

报告相同问题?

问题事件

  • 创建了问题 11月9日

悬赏问题

  • ¥15 工创大赛太阳能电动车项目零基础要学什么
  • ¥20 limma多组间分析最终p值只有一个
  • ¥15 nopCommerce开发问题
  • ¥15 torch.multiprocessing.spawn.ProcessExitedException: process 1 terminated with signal SIGKILL
  • ¥15 QuartusⅡ15.0编译项目后,output_files中的.jdi、.sld、.sof不更新怎么解决
  • ¥15 pycharm输出和导师的一样,但是标红
  • ¥15 想问问富文本拿到的html怎么转成docx的
  • ¥15 我看了您的文章,遇到了个问题。
  • ¥15 GitHubssh虚拟机连接不上
  • ¥15 装完kali之后下载Google输入法 重启电脑后出现以下状况 且退不出去 桌面消失 反复重启没用