代码之家  ›  专栏  ›  技术社区  ›  Yahya

欧拉项目-问题22:答题率3.35%

c
  •  -1
  • Yahya  · 技术社区  · 5 年前

    我试图解决 Problem 22 在项目Euler中,首先使用冒泡排序实现对名称进行排序,然后使用Afor循环将所有的名称加在一起。“colin”的例子很好,其他一些随机分数也很好。但是,总金额是错误的。

    我在stackoverflow和类似的编码q/a站点上搜索了类似的问题22个问题,但是,似乎大多数人都在使用python、r或c。我可以通过使用库来解决Python中的这个问题,但是我想学习,所以我试着用C做它,但是它失败了。P.S.我对编程比较新,但我怀疑我执行得很差的冒泡排序会导致问题。问题是:我试过在很多地方放‘printf’语句,但仍然搞不清哪里出错了。

        FILE *file;
        char list[46448];
    
        file = fopen("/home/USER_NAME/Downloads/p022_names.txt", "r");
        fscanf(file, "%s", list);
    
        char *tok = strtok(list, ",");
        char *token[5163];
        token[0] = tok;
        int i = 1;
        char *temp;
    
        while (tok != NULL){
            tok = strtok(NULL, ",");
            token[i] = tok;
            i++;
        }
    
        for(int j = 5162; j >= 0; j--){ 
            for(int i = 0; i < j; i++){
                if(strcmp(token[i], token[i + 1]) > 0){
                    temp = token[i];
                    token[i] = token[i + 1];
                    token[i + 1] = temp;
                }   
            }
        }
    
        char str[20];
        int sum;
        int score = 0;
    
        for(int z = 0; z < 5163; z++){
            sum = 0;
            strcpy(str, token[z]);
            for(int i = 0; i < 20; i++){
                if((str[i] != '\"') & (str[i] != 0)){
                    sum += str[i] - 64;
                }
            }
            score += (sum * (z + 1));
            }
        printf("Names Score: %d\n", score);
    }   
    

    然而,我总是得到一个错误的答案900429178。正确答案是871198282。

    1 回复  |  直到 5 年前
        1
  •  1
  •   Eric Postpischil    5 年前

    循环 for(int i = 0; i < 20; i++) 入口结束时无法停止。就在这个循环之前, token[z] 被复制到 str 。此复制在终止的空字节处停止 令牌[Z] 。除此之外,它留下 STR 不管以前有什么。

    然后循环 对于(int i=0;i<20;i++) 为添加值 全部的 中的字母非引号和非空字符 STR ,包括从先前的长名字遗留下来的字母。

    应该修改此循环以停止当前名称的结尾。