欧拉计划-问题22:答案降低了3.35%

时间:2019-07-11 23:30:38

标签: c

我尝试解决Euler项目的Problem 22,方法是先使用冒泡排序实现对名称进行排序,然后使用FOR循环将名称分数加在一起。 “ COLIN”示例运行良好,其他一些随机分数也运行良好。但是,总和是错误的。

我在StackOverFlow和类似的编码Q / A网站上搜索了类似的问题22问题,但是,似乎大多数人都在使用python,R或C#。我可以通过使用库在python中解决此问题,但是我想学习,所以我尝试在C中完成此操作,但失败了。附言我对编程还比较陌生,但是我怀疑我执行不佳的冒泡排序是否会引起问题。问题是:我曾尝试将'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 个答案:

答案 0 :(得分:1)

当条目结束时,循环for(int i = 0; i < 20; i++)无法停止。在此循环之前,token[z]被复制到str中。该副本在以token[z]结尾的空字节处停止。除此之外,它还会将str之前的内容保留在其中。

然后,循环for(int i = 0; i < 20; i++)str中的所有字母非引号和非空字符(包括从先前的长名称中遗留的字母)添加值。 / p>

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

相关问题