我尝试解决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。
答案 0 :(得分:1)
当条目结束时,循环for(int i = 0; i < 20; i++)
无法停止。在此循环之前,token[z]
被复制到str
中。该副本在以token[z]
结尾的空字节处停止。除此之外,它还会将str
之前的内容保留在其中。
然后,循环for(int i = 0; i < 20; i++)
为str
中的所有字母非引号和非空字符(包括从先前的长名称中遗留的字母)添加值。 / p>
应修改此循环以停止当前名称的结尾。