- 수정. 한가지 오류를 바로 잡음. "/10" 으로 나눔 연산.
쿡... 즐거운 공통 수학 시간이군.
p를 1834567891242341235423542542451234145678551475585744로 가정
k = log(n root string:p)
// p를 string으로 받음
= 1/n * log(string:p)
// n을 밖으로 낸다.
= 1/n * ( log( 10의 (string:p의 자릿수)승) + log((x) = string:p의 맨 첫숫자와 두번째 숫자를 일의자리로 한 것을 반올림. -> 예제에서 1.8) )
// 반올림은 ceil, floor 함수로 효율성 있게 구성한다.
// 여기서 문자를 숫자로 변경하고 log10 함수를 사용한다.
// 반올림 하지 않고 바로 log10을 취해도 됨.
= 1/n * ( 자릿수 + log(x) )
= 계산 끝.
// 반올림을 하고 정수로 캐스팅한다.
정수형이기 때문에 이것은 맞아떨어짐.
설령 실수형이래도 로그로 인해 근사값에 맞아 떨어짐. (반올림 하면됨)
~cpp
// 개략 적인 코딩으로 컴파일러가 없어 에러를 잡지 못했음.
// 수학 함수는 func(). n, p를 받아들이고 정수 k를 반환함.
// 6시 44분 코딩 시작 // 6시 57분 끝.
#include <stdio.h>
#include <string.h>
#include <math.h>
int func(char *p, int n){
double ret_buf;
int ret;
int t = strlen(p)-1;
double buf;
char p_buf[3];
sscanf(p_buf, "%2c\0", p); // 앞의 두 자리만 취한다.
buf = log10((double)atof(p_buf)/10); // 첫 두자리를 log취한다.
ret_buf = (buf+t)/n;
if(ret_buf >= (ceil(ret_buf)+floor(ret_buf))/2) // 반올림. 올림+내림/2보다 클거나 같을 경우
ret_buf = (int)ret_buf + 1; // 올림.
ret = (int)ret_buf; // 내림일경우 여기서 저절로 내린다.
return ret;
}