2016-12-06 6 views
2

대학에서 지정된 주 프로그램에 대한 함수를 작성해야하는 과제가 있습니다. 모두 c입니다.C 프로그래밍 - 오버플로하는 부호없는 정수의 합을 모듈로 사용

내 문제는 두 개의 부호없는 정수의 합계 모듈을 사용해야한다는 것입니다.

uint32_t mod_add(uint32_t x, uint32_t y, uint32_t n) 
{ 
    uint32_t res; 

    res = (x + y) % n; 

x와 y의 합계가 2^32-1 미만인 경우에는 정상적으로 작동합니다. 내 문제는 합계가이 값을 초과하면 분명히 오버플로되고 모듈러스 값이 잘못된 것입니다.

제 과제물에 x = 2^32-3; y = 1174501 및 n = 2^32-1 (n은 모듈로 임); 내 결과는 1174497이며, 1174499 여야합니다.

아무도 아이디어를 어떻게 해결할 수 있습니까?

+2

대신'res = ((uint64_t) x + y) % n;'시도해주세요. – BLUEPIXY

+0

예 .... 64 비트를 사용할 수 없습니다 ... 문제가 있습니다. –

답변

2

여기 있습니다.

uint32_t remainder(uint32_t x, uint32_t y, uint32_t d) 
{ 
    uint32_t r1 = x % d; 
    uint32_t r2 = y % d; 

    return r1 < (d - r2) ? r1 + r2 : r1 - (d - r2); 
} 
물론

대신 uint32_t 당신은 예를 unsigned long long에 관해서는 정수 유형을 사용할 수 있습니다.

+0

아마도'(r1 + r2) izlin

+2

@izlin r1 + r2로 인해 오버플로가 발생할 수 있습니다. 그래서 당신은 원래의 동일한 문제를 다룰 것입니다. –

+0

맞아, 그 작은 사실을 이미 잊어 버렸어. 고맙습니다! – izlin