TLE: csu 1211 정수 제곱 연습
9689 단어 su
코드가 좀 어수선해서 결과가 정확해야 하는데...TLE입니다...
다음은 불필요한 연산을 제외하고 코드를 짧게 하는 것을 고려해야 한다.
그래도 안 되면 어떡해...소 테스트를 환영합니다. 가르쳐 주셔서 감사합니다!
/* */
# include <stdio.h>
# include <string.h>
# include <stdlib.h>
# include <math.h>
# include <time.h>
# define MAXN 1001
void bigN_sqrt(char *s);
int bigN_cmp(char *a, char *b, int lim);
void bigN_mul(char *a, int k, int lim);
void bigN_add(char *a, int k);
void bigNN_minus(char *a, char *b, int lim);
char str[MAXN];
int main()
{
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
while (~scanf("%s", str))
bigN_sqrt(str);
printf("time cost %.3lfs.
", (double)clock()/CLOCKS_PER_SEC);
return 0;
}
int bigN_cmp(char *a, char *b, int lim)
{
int i;
for (i = lim-1; i >= 0; --i)
if (a[i] < b[i]) return 1;
else if (a[i] > b[i]) return -1;
return 0;
}
void bigN_mul(char *a, int k, int lim)
{
int i, tmp, c;
for (c=i=0; i < lim; ++i) {
tmp = a[i]*k + c;
c = tmp / 10;
a[i] = tmp - 10*c;
}
}
void bigN_add(char *a, int k)
{
int i = 0;
while (k > 0) {
a[i++] += k%10;
k /= 10;
}
}
void bigNN_minus(char *a, char *b, int lim) // b = b - a;
{
int i, tmp, c;
for (c=i=0; i < lim; ++i) {
tmp = b[i] - a[i] + c;
c = (tmp<0 ? -1:0);
b[i] = (tmp+10) % 10;
}
}
void bigN_sqrt(char *s)
{
short int i, k, slen; //
char res[MAXN]; //
char cur[MAXN]; //
char tmp[MAXN];
int lim;
memset(res, 0, sizeof(res));
memset(cur, 0, sizeof(cur));
lim = slen = strlen(s);
if (slen < 18) {
printf("%.0lf
", sqrt(atof(s)));
return;
}
if (slen & 0x1) {
k = -1;
cur[0] = s[0] - 48;
} else {
k = 0;
cur[1] = s[0] - 48;
cur[0] = s[1] - 48;
}
while (1) {
i = 0;
while (1) {
++i;
memcpy(tmp, res, MAXN);
bigN_mul(tmp, i*20, lim);
bigN_add(tmp, i*i);
if (-1 == bigN_cmp(tmp, cur, lim)) break; // break until tmp > cur;
}
--i;
printf("%d", i);
memcpy(tmp, res, MAXN); //cur -= res*i*20+i*i;
bigN_mul(tmp, i*20, lim);
bigN_add(tmp, i*i);
bigNN_minus(tmp, cur, lim);
bigN_mul(res, 10, lim); // res = res*10+i;
bigN_add(res, i);
k += 2;
if (k >= slen) break;
else {
bigN_mul(cur, 100, lim);
bigN_add(cur, ((s[k]-48)*10+(s[k+1]-48)));
}
}
printf("
");
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
대상 Linux Master ~ su 명령에 대한 권한 ~su 명령은 루트 권한으로 승격하여 다른 사용자로 로그인할 수 있는 강력한 명령입니다. 쉽게 사용할 수 없습니다. ※ [2016.11.4 보충] PAM 설정이 변경되었습니다. PAM(/libpam.so) 0.82.2...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.