#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的位置开始访问了