微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决为什么这段代码不会因为 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 中的所有元素的情况下结束

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。