그거 있자나 n(n+1)/2해가지고 그값이 int n 이런식으로두면은
int타입 정수형데이터가 데이터 2^16까지 계산할수있어서
만약 n(n+1)/2가 2^16이상 넘어갔기때문에 오버플로우가 발생한거같거든요
제 생각에는 n값에다가 제한을 걸어둬야한다고 생각합니다.
n(n+1)/2값이 2의 16승 미만으로 제한을걸어둬야한다고생각합니다.
그거 있자나 n(n+1)/2해가지고 그값이 int n 이런식으로두면은
int타입 정수형데이터가 데이터 2^16까지 계산할수있어서
만약 n(n+1)/2가 2^16이상 넘어갔기때문에 오버플로우가 발생한거같거든요
제 생각에는 n값에다가 제한을 걸어둬야한다고 생각합니다.
n(n+1)/2값이 2의 16승 미만으로 제한을걸어둬야한다고생각합니다.
결과값이 오버플로우 되는거면 어차피 안되는거고 계산결과 도중에 안나도록 하는방법임 - dc Cpp
결과를 구하는 도중에 결과보다 더 큰값이 나오는 일을 방지하는거지 - dc Cpp
그러니까 제한을겁시다. 컴퓨터가 계산할수있는만큼만으로 범위를 제한해서
뭐 얼마나 큰값을 계산해야 하길래 저러는지...
sum의 값 상한을 INT_MAX라고 두고 int자료형으로 연산한다 치자. 단순히 n(n+1)/2를 계산할때 오버플로우가 일어나질 않길 바라잖아 - dc Cpp
엄청큰값을 계산해야한다고하면 저도 방법이없고요
근데 지금 쓴 식은 n(n+1)를 일단 계산하고 그 뒤에 2를 나누는건데 기대하는 결과값은 INT_MAX이고 처음 계산한 값은 당연히 INT_MAX를 초과하니까 계산과정 "도중에" 오버플로우가 발생함 - dc Cpp
그런데 밑에 글에 쓴 방법을 쓰면 이런일이 안일어난단거지 - dc Cpp
저는 내공이부족해서... 공부좀 더해야겠는걸요
거기까지는 저도모르겠어요
작은 숫자로 예시를 들면 - dc Cpp
근데 범위 별로 차이 안날듯함
sum이 50을 넘기면 안됨. 근데 1부터 9까지 더한걸 계산하래. 그럼 9*10/2를 계산하려고 시도하겠지? 9*10부터 계산하면 90인데 이건 50을 넘었음. 결과는 45로 안넘는데말야 - dc Cpp
sum값이 얼마나 천문학적인 숫자를 바라는건지... 알수없어서
1부터 9까지 더하면 구할 수 있는(오버플로우 안나는)값인데 간단히 하려니 오버플로우가 나버렸단말잉8 - dc Cpp
INT_MAX는 21억정돈데 그정도 구할 수 있는거 아니냐? - dc Cpp
방법에 대해 논하는데 효용에 대해 말하면 할말이 없을듯 - dc Cpp