当b[j]跳出最里面那个循环后,再次进入b[j]会是最开始那个值,还是上次循环结束时的值

#include<stdio.h>
#define int long long
signed main(){
int n,ans,i,j,a[5005],b[5005];
int sum=0,max=0;
scanf("%lld",&n);
for(i=0;i<n;i++){
scanf("%lld",&a[i]);
sum=0;
while(1){
if(a[i]%2==1)sum++;
if(a[i]%2==0)break;
a[i]=a[i]/2;
}
b[i]=a[i]*sum;
}
for(i=0;i<n;i++){
for(j=0;j<i;j++){
b[j]+=b[i]*0.2;
}
}
if(j==n-1&&i==n-1)b[j]=b[i];
for(j=0;j<n;j++){
if(b[j]>max){
max=b[j];
ans=j+1;
}
}
printf("%lld",ans);
return 0;
}其中的for(i=0;i<n;i++){
for(j=0;j<i;j++){
b[j]+=b[i]*0.2;
}
}

注释见代码,供参考:

#include<stdio.h>
#define int long long
signed main() {
    int   n, ans, i, j, a[5005], b[5005];
    int sum = 0, max = 0;
    scanf("%lld", &n);
    for (i = 0; i < n; i++) {
        scanf("%lld", &a[i]);
        sum = 0;
        while (1) {
            if (a[i] % 2 == 1)sum++;
            if (a[i] % 2 == 0)break;
            a[i] = a[i] / 2;
        }
        b[i] = a[i] * sum;
    }
    for (i = 0; i < n; i++) {  // i 是外循环变量因子,i 被初始化一次即:i = 0; 这句只在进入循环时执行一次。  
        for (j = 0; j < i; j++) { // j 是内循环变量因子,j = 0 在外循环因子每 i++ 一次, j = 0;这句就被执行一次。
            //printf("i = %lld, j = %lld\n", i, j);
            b[j] += b[i] * 0.2;   
            // 假如输入n = 5
            //i = 0, 内循环里 j < i 条件不满足,内循环未执行
            //i = 1, j = 0
            //i = 2, j = 0
            //i = 2, j = 1
            //i = 3, j = 0
            //i = 3, j = 1
            //i = 3, j = 2
            //i = 4, j = 0
            //i = 4, j = 1
            //i = 4, j = 2
            //i = 4, j = 3
        }
    }
    if (j == n - 1 && i == n - 1) b[j] = b[i];
    for (j = 0; j < n; j++) {
        if (b[j] > max) {
            max = b[j];
            ans = j + 1;
        }
    }
    printf("%lld", ans);
    return 0;
}

其他代码呢?

这要看你跳到哪里了。还有就是变量的生命期。

会是最开始的那个值,因为你每次进入的时候,j都被重置为1了,也就相当于又从下标为1的位置开始访问了