为什么以下代码无法正确输出所有测试用例?

时间:2016-01-10 16:48:34

标签: c string loops ide codeblocks

/*
*
*Program for finding total number of holes in a string.
*For example total number of holes in "ANUBHAV" is 4 and in "GOURAV" is 3
*
*/
#include <stdio.h>
#include<string.h>
// start of main function
int main(void) {
    int t,i = 0,hole = 0; // variable declaration
`   char str[100];
    scanf("%d",&t); // input number of test cases
    while(t--)
    {
        scanf("%s",str);  // input string
        while(i < strlen(str))
        {
            if(str[i] == 'B')
            {
                hole += 2;
            }
            else if(str[i] == 'A' || str[i] == 'D' || str[i] == 'O' || str[i] == 'P' || str[i] == 'Q' || str[i] == 'R' )
            {
                hole += 1;
            }

            i = i + 1;  
        }
        printf("%d",hole); //printing the total number of holes
    }
    return 0;
}

此代码在第一个测试用例(t)中正确输出,但为下一个测试用例产生错误的输出。代码中有什么问题? 请帮忙! 在此先感谢!

3 个答案:

答案 0 :(得分:1)

每次输入新字符串时都需要初始化hole。您的代码也可以进行很多改进,请查看

/*
*
*Program for finding total number of holes in a string.
*For example total number of holes in "ANUBHAV" is 4 and in "GOURAV" is 3
*
*/
#include <stdio.h>
#include <string.h>
// start of main function
int main(void)
{
    int hole; // variable declaration
    int count;
    char str[100];
    if (scanf("%d", &count) != 1)
        return -1; // Input Error
    for (int i = 0 ; i < count ; ++i)
    {
        hole = 0;
        if (scanf("%99s", str) != 1)
            return -1; // Input Error
        for (int j = 0 ; str[j] != '\0' ; ++j)
        {
            switch (str[j])
            {
                case 'B':
                    hole += 2;
                    break;
                case 'A':
                case 'D':
                case 'O':
                case 'P':
                case 'Q':
                case 'R':
                    hole += 1;
                    break;
            }
        }
        printf("Holes in %s -> %d\n", str, hole); //printing the total number of holes
    }
    return 0;
}

答案 1 :(得分:1)

<强>解决方案: -

在您的代码中,您应该在循环内初始化hole

while (t--) {
int hole = 0;
.
.
}

<强>解释: -

hole的计数对于每个测试用例都是独特的。如果在每个测试用例的0未初始化,则显示的计数将累计先前的计数,从而导致错误的结果。

例如,如果 test_case_0 有2个洞,则孔设置为2,如果 test_case_1 3个洞,则孔为未重置为0,最终结果将为 test_case_1 设置为5,这会导致错误。

希望有所帮助。

答案 2 :(得分:0)

你应该在while语句和printf函数之后创建hole = 0的值。因为你的洞值不会因下一个测试用例而改变。