为什么这段代码不会因为 1 行代码而运行?

问题描述

为什么此代码仅在我删除 Total = 0 循环中的 while(Total != N) 时才会运行,而如果我不删除它就不会运行?
但问题是我需要使用 total = 0 才能完成某个测试用例。

#include <stdio.h>

int N;

void Shift(long long B[]){
    int i;
    long long temp;
    temp = B[N - 1];
    for(i = N - 1; i > 0; i--){
        B[i] = B[i - 1];
    }
    B[0] = temp;
}

int main() {
    
    int j,i,Jumlah = 0,Total = 0;
    scanf("%d",&N);
    long long A[N],B[N];
    for(i = 0; i < N; i++) {
        scanf(" %lld",&A[i]);
    }
    for(i = 0; i < N; i++) {
        scanf(" %lld",&B[i]);
        if(B[i] == A[i]) {
            TotaL++;
        }
    }
    while(Total != N) {
        Shift(B);
        Jumlah++;
        //Total = 0;
        for(i = 0; i < N; i++) {
            if(A[i] == B[i]) {
                TotaL++;
            }
        }
    }
    printf("%d\n",Jumlah);
    
    return 0;
}

测试用例:N = 5 第一个数组 = 1 2 5 3 4 第二个数组 = 5 1 4 2 3

解决方法

在这段代码中

    Total = 0;
    for(i = 0; i < N; i++){
        if(A[i] == B[i]){
            Total++;
        }
    }

当且仅当条件 Total 对于 A[i] == B[i] 的所有值都为真时,变量 i 将达到值 N。

因此,当您将代码包装成 while 语句时,例如:

while (Total != N) {
    Total = 0;
    for(i = 0; i < N; i++){
        if(A[i] == B[i]){
            Total++;
        }
    }
}

如果 A[i] == B[i] 为 false 一次或多次,您将陷入无限循环。

移位操作(即 Shift(B);)并不能确保您将在 B 中的所有元素等于 A 中的所有元素的情况下结束