xor을 이용해 변수 a,b가 있을때
1 2 3 |
a = a^b; b = a^b; a = a^b; |
했었는데, 이제 생각해보니
1 |
a=a^b^(b=a); |
면 한 줄에 끝난다. xor도 한번 줄었다.
xor을 이용해 변수 a,b가 있을때
1 2 3 |
a = a^b; b = a^b; a = a^b; |
했었는데, 이제 생각해보니
1 |
a=a^b^(b=a); |
면 한 줄에 끝난다. xor도 한번 줄었다.
짝수인 피보나치 수의 합을 구하라.
n번째 피보나치 수열을 구하는 최속 알고리즘은 2 by 2 행렬을 이용하는 것으로 잘 알려져 있다. (O(log2n)) 하지만 본 문제에서는 한계가 4백만으로 낮으므로, 직접 구하도록 한다. 3n-1 번째 숫자만이 짝수이므로 나머지 검사를 할 필요는 없다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
use integer; sub addUntil { my $i = shift; my @n = (1,1,2); my $r; while($n[2] <= $i) { $r+=$n[2]; $n[0]=$n[1]+$n[2]; $n[1]=$n[0]+$n[2]; $n[2]=$n[0]+$n[1]; } return $r; } printf("%d",addUntil(4000000)); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
#include <stdio.h> unsigned long int addUntil(unsigned long int); unsigned long int addUntil(unsigned long int end) { unsigned long int result = 0; unsigned long int nth[3] = { 1, 1, 2 }; while (nth[2] <= end) { result += nth[2]; nth[0] = nth[1] + nth[2]; nth[1] = nth[2] + nth[0]; nth[2] = nth[0] + nth[1]; } return result; } void main(void) { printf("%lu\n", addUntil(4000000UL)); } |
3과 5의 배수의 합을 구하라.
그냥 쭉 더하면 된다. 그래도 루프를 돌지는 말자..
1 2 3 4 5 6 7 8 |
use integer; sub getTo{ my $i = shift; my $j = shift; $i/=$j; return $i*($i+1)*$j/2; } printf("%d",getTo(999,3)+getTo(999,5)-getTo(999,15)); |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#include <stdio.h> int getTo(int, int); int getTo(int end, int mul) { end /= mul; return end*(end + 1)*mul / 2; } void main(void) { printf("%d", getTo(999, 3) + getTo(999, 5) - getTo(999, 15)); } |
구현 단계
코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
#include <stdio.h> #include <string.h> void* mymemchr(const void*, int, size_t); void* mymemchr(const void* string, int character, size_t length) { const unsigned char* pString = string; while ('\0' != *pString && length > 0) { if (*pString++ == character){ pString--; return (void *)pString; } length--; } return NULL; } int main() { const char str[] = "And the Raven, never flitting, still is sitting, still is sitting"; const char ch = 'l'; char *ret; ret = mymemchr(str, ch, strlen(str)); printf("String after |%c| is - |%s|\n", ch, ret); printf("%d",sizeof(NULL)); return(0); } |