addendum777 发表于 2022-9-14 15:14:15

为什么我发布了帖子了

哪里有问题

addendum777 发表于 2022-9-14 15:14:44

int romanToInt(char * s){
    int longth=strlen(s);
    int i=0;
    int sum=0;
    int* flag=NULL;
    flag=(int*)malloc(longth*sizeof(int));
    for(i=0;i<longth;i++)
    {
      switch(s)
       { case 'I':flag=1;break;
      case 'V': flag=5;break;
      case 'X': flag=10;break;
      case 'L': flag=50;break;
      case 'C': flag=100;break;
      case 'D': flag=500;break;
      case 'M': flag=1000;break;}

    }

    for(i=0;i<longth-1;i++)
    {
      flag=flag>flag?flag:-flag;
    }

    for(i=0;i<longth;i++)
    sum+=flag;

return sum;
}

cnkizy 发表于 2022-9-14 19:07:45

本帖最后由 cnkizy 于 2022-9-14 19:15 编辑

{:10_257:}
1.条件错了
2.还有记得free
3.多写用例测试,养成好习惯



int romanToInt(char* s) {
        int len = strlen(s);
        int i = 0;
        int sum = 0;
        int* flag = (int*)malloc(len * sizeof(int));
        if (flag == NULL) {                     //<---- malloc 不一定会申请成功
                printf("内存申请失败\n");
                return 0;
        }

        for (i = 0; i < len; i++) {
                switch (s) {
                case 'I':flag = 1; break;
                case 'V': flag = 5; break;
                case 'X': flag = 10; break;
                case 'L': flag = 50; break;
                case 'C': flag = 100; break;
                case 'D': flag = 500; break;
                case 'M': flag = 1000; break;
                }
        }

        for (i = 0; i < len - 1; i++) {
                if (flag >= flag) { //<---正确条件 >=
                        flag = flag;
                } else {
                        flag = -flag;
                }
        }

        for (i = 0; i < len; i++) {
                sum += flag;
        }
        if (flag != NULL) { // <--- 无论是否为NULL 都必须检查
                free(flag);//<---malloc后记得释放内存
                flag = NULL;//<--- 避免指针被二次引用,虽然这里用不到,但要养成好习惯
        }
        return sum;
}
void test();
int main() {
        // 罗马数字转阿拉伯数字
        char buff = { 0 };
loop:
        printf("请输入罗马数字:");
        scanf_s("%s",buff, 10);
        printf("转换后为:%d\n", romanToInt(buff));
        goto loop;
        return 0;
}



typedef struct _roma_test {
        char str;
        int num;
}ROMATEST;

void test() {
        ROMATEST list[] = {
        {"I",1},
        {"II",2},
        {"III",3},
        {"IV",4},
        {"V",5},
        {"VI",6},
        {"VII",7},
        {"VIII",8},
        {"IX",9},
        {"X",10},
        {"XI",11},
        {"XII",12},
        {"XIII",13},
        {"XIV",14},
        {"XV",15},
        {"XVI",16},
        {"XVII",17},
        {"XVIII",18},
        {"XIX",19},
        {"XX",20},
        {"XXX",30},
        {"XL",40},
        {"L",50},
        {"LX",60},
        {"LXX",70},
        {"LXXX",80},
        {"XC",90},
        {"XCIX",99},
        {"C",100},
        {"CI",101},
        {"CII",102},
        {"CXCIX",199},
        {"CC",200},
        {"CCC",300},
        {"CD",400},
        {"D",500},
        {"DC",600},
        {"DCCC",800},
        {"CM",900},
        {"M",1000},
        {"MCD",1400},
        {"MCDXXXVII",1437},
        {"MD",1500},
        {"MDCCC",1800},
        {"MDCCCLXXX",1880},
        {"MCM",1900},
        {"MM",2000},
        {"MMM",3000},
        {"MMMCCCXXXIII",3333},
        {"MMMCMXCIX",3999}
        };
        bool all_ok = true;
        for (int i = 0; i < _countof(list);i++) {
                int mynum = romanToInt(list.str);
                if (list.num != mynum) {
                        printf("发现该算法与正确的数存在差异! 正确结果:%s %d ,算法的结果是:%d\n", list.str, list.num, mynum);
                        all_ok = false;
                        break;
                }
        }
        printf("测试完毕,结果是:%s", all_ok?"算法通过测试,全部正确":"算法有误");
}
页: [1]
查看完整版本: 为什么我发布了帖子了