답변

3

비교 결과는 C++에서 0 (거짓) 또는 1 (참)을 반환합니다. 다음과 같이 그래서 당신은 가장 안쪽의 조건을 변환 할 수 있습니다

int condition = d < results[i] 
results[i] = d * condition + results[i] * !condition; 

그냥에서하고 넘어 인수에 하나를 추가, 내부 루프에서 난을 건너려면

... 
for (int j = 0; j < n - 1; j++) { 
    d = myfunction(x, y, i, j + (j >= i)); 
    int condition = d < results[i] 
    results[i] = d * condition + results[i] * !condition; 
} 
... 

적은 수의 비교와 또 다른 것 두 개의 루프로 내부 루프를 분할하는 :

for (int j = 0; j < i; j++) { 
    ... 
} 
for (int j = i + i; j < n; j++) { 
    ... 
} 

편집 : 복잡한 증가/루프를 교체 맹 글링 시작합니다.

P. : optimizaion 옵션은 로컬 변수에 최소값을 만들고 내부 루프 이후의 결과 [i]에 할당하는 옵션 일 수 있습니다.

+0

프로그램이 충돌합니다. i = 4, j = 4, j + = (i == j) 일 때 크기가 5 인 배열이 있다고 가정합니다. make j = 5 이것은 배열의 인덱스를 초과합니다. –

+0

어떻게/왜 추락할까요? –

+0

늦은 편집에 대해 죄송합니다 –

1

, 당신은 즉, nn에 의해 매트릭스에서 작동해야하지만 대각선에있는 값을 제외 :

X O O O 
O X O O 
O O X O 
O O O X 

당신은 "줄이기"에 의해 문제를 재구성 할 수있는 행렬과 같이 :

. O O O 
. . O O O 
. . . O O O 
. . . . O O O 

이 그럼 당신은 내부 루프에 j를 해결할 수 :

for (int i = 0; i < n; i++) { 
    // ... 
    for (int j = i + 1; j < i + n; j++) { 
     d = myfunction(x, y, i, j % n); 
     // ... 
    } 
} 
+1

'j % n'은 분기가 없지만 컴파일러가이를 실제 나눗셈 대신 compare/cmov로 변환하지 않으면 느립니다. (또는'n'이 컴파일 타임 상수라면 나쁘지 않습니다.) 소스에서'jmod ++; jmod = (jmod == n)? 0 : jmod;' –

+0

@PeterCordes : 좋은 점, 부수적으로, j가 한정되어 있기 때문에 동일한 결과를 얻으려면'j % n'을'jn'으로 바꿀 수 있습니다 : D (대답 업데이트) –

+1

j