2017-10-06 1 views
-1

그래서이 문제를 해결해야합니다. R1, R2, R3 및 R4는 정수 값의 저항을 가지고 있다고 가정합니다. 4 개의 값을 입력 한 후 프로그램은 결과를 다음 정수로 산술적으로 반올림하여 출력해야합니다. 이 연습에서는 내장 정수 나누기가 모든 피연산자에 대해 0으로 반올림한다고 가정 할 수 있습니다. 부동 소수점 산술을 사용할 수 없습니다. 대용량 라이브러리로 변경하는 것은 불가능합니다.C++에서 반올림없이 반올림

는이 내 코드입니다 :

int R1; 
int R2; 
int R3; 
int R4; 

std::cin >> R1; 
std::cin >> R2; 
std::cin >> R3; 
std::cin >> R4; 

int R12 = R1 + R2; 
int R34 = R3 + R4; 

unsigned int Rtot = ((2*(R12 * R34)/(R12 + R34) + 1))/2 ; 

std::cout << Rtot ; 

return 0; 

하지만 난 큰 숫자 (8000 24000 16000 32000)를 사용하는 경우 나 오버 플로우 문제를 얻을. 어떤 아이디어? 서명하지 않아도 작동하지 않습니다. 모듈러스로 해결할 것으로 추측되지만 어떻게 될지는 모릅니다.

+2

[둘러보기] (https://stackoverflow.com/tour)를 읽고 [도움말 페이지] (https : //stackoverflow.com/help). 에 오신 것을 환영합니다. – Ron

+2

웹에서 "C++ integer division"을 검색하십시오. 예 :'1/3 == 0'. 부동 소수점'1.0/3.0 = .3333333333333333333333333333333' –

+1

@ThomasMatthews OP가 그 상태였습니다. 인용구 : "부동 소수점 산술을 사용할 수 없습니다." –

답변

2

당신은 수 중 하나

  1. long int 또는 long long int을 사용하여 대표적인 저항 값의 바이트를 늘립니다.
  2. 최대 10 배로 저항을 줄이고 계산하십시오. 그런 다음 감소 된 값으로 다시 곱하거나 사용자가 사용할 낮은 값과 승수를 반환하십시오. 주어진 예제 (8000 24000 16000 32000)에서 데이터를 잃지 않고 모든 값을 1000으로 줄이고 마지막에 1000을 곱하거나 해답과 배율을 반환 할 수 있습니다.
0

int 형식을 변경할 수 없다고 가정하면 결과를 계산하는 데 사용되는 수식을 변경할 수 있습니다. 수치 계산에서 대수적으로 동등한 표현이 완전히 다른 수치 적 특성을 갖는 것으로 밝혀졌습니다.^경우 = RA

: R + A, R34 =이 경우

(1 + RA^2/R)/2

여기서 R12로 너의 재기록 수도 2 오버플로 (곱하기 전에 numeric_limit :: max와 비교)는 해당 항을 4 ((a/2)^2)/r과 바꿉니다.

PS. ipad에서 이것을 쓰면 나중에 더 추가 할 것입니다 .... (더 잘할 수 있습니다)