[카테고리:] 컴퓨터

  • 영어와 C/C++ 언어의 유사성

    명사를 변수라고 해 보자.

    대명사 – 포인터형 변수

    자동사 – void 형 함수

    타동사 – void 형이 아닌 함수

    조동사 – 함수 자체를 조작하는 함수 (이런건 없다)

    전치사 – void형이 될 수 없는 함수 포인터

    접속사 – 함수 안에 함수 쓰기

    형용사 – 포인터 연산자

    부사 – 함수 포인터 연산자

    very – ++연산자

    감탄사 – 전역 변수

    for 처럼, 접속사도 되고 전치사도 되는 애들 – overriding으로 구현

    마침표(.) – ;

  • Totient Chain

    #include

    int isGCD(int n){

    }

    int totient(int n){

    int i=n;

    int j=0;

    while(i){

    if(isGCD==1)

    j++;

    i–;

    }

    return j;

    }

    int chainlength(int n){

    }

    int main(){

    return 0;

    }

  • Primes


    #include

    int tnumber(n){

    return 2*n*n-1;

    }

    int main(){

    int i, j;

    j=0;

    for(i=1;i<50000000;i++){
    if(isPrime(i)==_YES)

    j++;

    }

    printf(“%d\n”,j);

    }

  • 점의 밀도 측정

    점의 좌표를 모두 알고 있다고 하자.

    그럼, 특정한 점을 찍었을 때, 그 점이 다른 점과 가지는 거리의 평균을 그 점의 포텐셜 값으로 둔다.

    점이 많아지면 많아질수록 포텐셜이 낮아지고, 점이 멀어지면 멀어질수록 포텐셜이 높아진다.

    이 값의 역수를 취하면 재밌겠다.

    언제 한번 만들어봐야지.

  • 이름으로 점수 내기

    5천개쯤 되는 이름 목록이 있는데, A=1, B=2 이런 식으로 해서 점수를 준다. 그 다음에, 그걸 알파벳 순으로 정렬하여, 그 등수에 따라 가중치를 곱해준다.

    그런 다음에 그걸 모두 더한다. 얼마일까?

    출처 : http://projecteuler.net/index.php?section=problems&id=22

    나는 엑셀 VBA로 풀었다.

    Sub text()

    Dim i As Integer

    For i = 1 To 5200

    Worksheets(“Sheet2”).Cells(i, 1) = Worksheets(“Sheet2”).Cells(1, 2 * i – 1)

    Next

    End Sub

    Sub Macro1()



    ‘ Macro1 Macro



    Cells.Replace What:=”A”, Replacement:=”+1″, LookAt:=xlPart, SearchOrder _

    :=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False

    Cells.Replace What:=”B”, Replacement:=”+2″, LookAt:=xlPart, SearchOrder _

    :=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False

    Cells.Replace What:=”C”, Replacement:=”+3″, LookAt:=xlPart, SearchOrder _

    :=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False

    Cells.Replace What:=”D”, Replacement:=”+4″, LookAt:=xlPart, SearchOrder _

    :=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False

    Cells.Replace What:=”E”, Replacement:=”+5″, LookAt:=xlPart, SearchOrder _

    :=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False

    Cells.Replace What:=”F”, Replacement:=”+6″, LookAt:=xlPart, SearchOrder _

    :=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False

    Cells.Replace What:=”G”, Replacement:=”+7″, LookAt:=xlPart, SearchOrder _

    :=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False

    Cells.Replace What:=”H”, Replacement:=”+8″, LookAt:=xlPart, SearchOrder _

    :=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False

    Cells.Replace What:=”I”, Replacement:=”+9″, LookAt:=xlPart, SearchOrder _

    :=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False

    Cells.Replace What:=”J”, Replacement:=”+10″, LookAt:=xlPart, SearchOrder _

    :=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False

    Cells.Replace What:=”K”, Replacement:=”+11″, LookAt:=xlPart, SearchOrder _

    :=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False

    Cells.Replace What:=”L”, Replacement:=”+12″, LookAt:=xlPart, SearchOrder _

    :=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False

    Cells.Replace What:=”M”, Replacement:=”+13″, LookAt:=xlPart, SearchOrder _

    :=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False

    Cells.Replace What:=”N”, Replacement:=”+14″, LookAt:=xlPart, SearchOrder _

    :=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False

    Cells.Replace What:=”O”, Replacement:=”+15″, LookAt:=xlPart, SearchOrder _

    :=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False

    Cells.Replace What:=”P”, Replacement:=”+16″, LookAt:=xlPart, SearchOrder _

    :=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False

    Cells.Replace What:=”Q”, Replacement:=”+17″, LookAt:=xlPart, SearchOrder _

    :=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False

    Cells.Replace What:=”R”, Replacement:=”+18″, LookAt:=xlPart, SearchOrder _

    :=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False

    Cells.Replace What:=”S”, Replacement:=”+19″, LookAt:=xlPart, SearchOrder _

    :=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False

    Cells.Replace What:=”T”, Replacement:=”+20″, LookAt:=xlPart, SearchOrder _

    :=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False

    Cells.Replace What:=”U”, Replacement:=”+21″, LookAt:=xlPart, SearchOrder _

    :=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False

    Cells.Replace What:=”V”, Replacement:=”+22″, LookAt:=xlPart, SearchOrder _

    :=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False

    Cells.Replace What:=”W”, Replacement:=”+23″, LookAt:=xlPart, SearchOrder _

    :=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False

    Cells.Replace What:=”X”, Replacement:=”+24″, LookAt:=xlPart, SearchOrder _

    :=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False

    Cells.Replace What:=”Y”, Replacement:=”+25″, LookAt:=xlPart, SearchOrder _

    :=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False

    Cells.Replace What:=”Z”, Replacement:=”+26″, LookAt:=xlPart, SearchOrder _

    :=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False

    End Sub

    Sub addition()

    Dim i As Integer

    For i = 1 To 5163

    Worksheets(“sheet1”).Cells(i, 2) = “=” + Worksheets(“sheet1”).Cells(i, 1).Value

    Next

    End Sub

    이걸 다 하고 나면 각 이름들의 점수 값이 계산되어 있다.

    이제 정렬시켜주고, 가중치를 곱해주고, 다 더하면 된다.

    결국, 삽질. -_-;

    아마 펄이나 루비로 풀면 몇줄 안될것 같다.

  • 1일인 일요일의 수는?

    오일러 프로젝트의 19번 문제는 흥미롭다.

    20세기에서 1일이 일요일인 경우는 몇번인가?

    이 문제를 풀기 위해서 알아야 하는 정보는 다음과 같다.

    1, 3, 5, 7, 8, 10, 12월은 31일이다.

    4, 6, 9, 11월은 30일이다.

    2월은 보통 28일인데, 윤년은 29일이다.

    윤년은 연도 숫자가 4로 나누어 떨어지면 윤년이다. 단, 100으로 나누어 떨어지면 윤년이 아니다. 그럼에도 불구하고 400으로 나누어 떨어지면 윤년이다.

    20세기는 1901년 1월 1일부터 2000년 12월 31일까지다.

    1901년 1월 1일은 월요일이었다.

    이 문제를 풀기 위한 알고리즘은 아주 많이 있다. 그중 가장 간단한 방법과 내가 쓴 방법을 소개하려 한다.


    가장 간단한 방법


    내가 쓴 방법

  • 3n+1 문제

    가설: 어떤 임의의 자연수를 생각하자. 그 자연수가 짝수면 2로 나누고 홀수면 3배하여 1을 더한다. 그 결과로 얻어진 자연수에 같은 조작을 반복한다. 그럼 언젠가 반드시 1이 된다.

    그 문제에 도전하는 C프로그램이다.

    #include

    #include

    long long evenodd(long long);

    long long length(long long);

    int main(){

    long long i,leng,t,keep;

    leng=1ll;

    keep=1;

    i=1000000ll;

    while(i){

    t=length(i);

    if(leng<=t){
    leng=t;

    keep=i;

    }

    i–;

    }

    printf(“%lld has length of %lld\n”,keep,leng);

    }

    long long evenodd(long long n){

    if(n%2ll==0ll){

    return n/2ll;

    }

    else{

    return n*3ll+1ll;

    }

    }

    long long length(long long l){

    long long leng=1;

    long long i=l;

    while(i-1){

    i=evenodd(i);

    leng++;

    }

    printf(“%lld, %lld\n”,leng,l);

    return leng;

    }

  • 컴퓨터가 무조건 이기는 가위바위보

    친구의 부탁으로 만들어 줬다. 뭐…이런거 하면 안되는 거겠지만 -_-;

    #include // scanf와 printf를 사용하기 위하여 포함됨

    #include // strcpy를 사용하기 위하여 포함됨

    #include // exit를 사용하기 위하여 포함됨

    int scissor(int); // 컴퓨터의 필승 전략 함수

    int printing_choice(int , int ); // 누가 무엇을 골랐는지 알려주는 함수

    void winner(int ,int ); // 승자가 누구인지 판정하는 함수

    int main(void) // 명령줄 입력값 없음

    {

    int g;

    printf(“Input your choice : “);

    scanf(“%d”,&g); // 사람의 선택을 입력받아서 변수 g에 저장한다

    printing_choice(1,g); // 사람의 선택 g를 출력한다

    printing_choice(2,scissor(g)); // scissor 함수에서 넘겨받은 컴퓨터의 선택을 출력한다

    winner(g,scissor(g)); // 사람의 선택과 컴퓨터의 선택을 비교하여 승자를 출력한다

    system(“PAUSE”);

    return 1; // 프로그램 종료

    }

    int scissor(int p){

    return (p%3)+1;

    // 3으로 나눈 나머지에 1을 더하였으므로 이 함수는 1, 2, 3중의 하나를 반환한다.

    // 입력값 p보다 항상 1이 크기 때문에 승리 전략이 된다.

    }

    int printing_choice(int m, int p){

    char a[10],b[10];

    // 입력받은 값 m이 1이면 사용자의 입력값, 1이 아니면 컴퓨터의 입력값이다.

    if(m==1){

    strcpy(a,”You”);

    }

    else {

    strcpy(a,”Machine”);

    }

    // 입력받은 값 p가 3의 배수이면 가위, 3으로 나눈 나머지가 1이면 바위, 3으로 나눈 나머지가 2이면 보자기이다.

    if(p%3==0){

    strcpy(b,”SCISSOR”);

    }

    else if(p%3==1){

    strcpy(b,”ROCK”);

    }

    else {

    strcpy(b,”PLAIN”);

    }

    // 누구의 입력값이 무엇인지 출력한다

    printf(“%s select %s\n”,a,b);

    }

    void winner(int p,int q){

    char a[10];

    // 가위는 보자기에 이긴다. 그리고 보자기는 바위에 이기고 바위는 가위에 이긴다.

    if((p%3==0&&q%3==2)||(p%3>q%3)){

    strcpy(a,”You win”);

    }

    if((q%3==0&&p%3==2)||(p%3 strcpy(a,”You lose”);

    }

    // 만약 값이 같으면 둘은 비긴다.

    if(p%3==q%3){

    printf(“No one win\n”);

    exit(1);

    }

    // 누가 이겼는지 출력하고 끝낸다.

    printf(“%s!\n”);

    }

  • 그래서, 만들어본 삼각형 내부에 있는 점 판정하기 소스

    C로 만들어 보았다. 아는게 C밖에 없으니…-_-;

    #define TRUE 1

    #define FALSE 0

    typedef struct {

    double x;

    double y;

    } point;

    typedef struct {

    double a;

    double b;

    double c;

    } line;

    typedef struct {

    point t1;

    point t2;

    point t3;

    } triangle;

    line lineDeclaration(point p,point q){

    line l;

    l.a=q.y-p.y;

    l.b=p.x-q.x;

    l.c=p.y*q.x-p.x*q.y;

    return l;

    }

    double lineSubstitution(point p, line l){

    return l.a*p.x+l.b*p.y+l.c;

    }

    double lineMultiplication(point p, point q, line l){

    return lineSubstitution(p, l)*lineSubstitution(q,l);

    }

    point mediumPoint(point p, point q){

    point r={(p.x-q.x)/2.0,(p.y-q.y)/2.0};

    return r;

    }

    int triangleInteriorPoints(point p, triangle t){

    point side[3];

    side[0].x=t.t1.x;

    side[0].y=t.t1.y;

    side[1].x=t.t2.x;

    side[1].y=t.t2.y;

    side[2].x=t.t3.x;

    side[2].y=t.t3.y;

    int i=2;

    int justify=0;

    line l;

    line m;

    while(i){

    l=lineDeclaration(side[i%3],side[(i+1)%3]);

    m=lineDeclaration(side[(i+1)%3],side[(i+2)%3]);

    if(

    lineMultiplication(p, mediumPoint(side[(i+2)%3],side[i]), l)>0 &&

    lineMultiplication(p, mediumPoint(side[(i+2)%3],side[i]), m)>0){

    justify++;

    }

    i–;

    }

    if(justify==3){

    return TRUE;

    }

    else{

    return FALSE;

    }

    }

    이건 헤더 파일이다. 테스트용 코드는 다음과 같다.

    #include

    #include

    #include”triangle.h”

    #include

    #include

    int main(int argc, char* argv[]){

    if(argc==1){

    printf(“ERROR. There are no inputs.\n Usage : %s file1 file2\n file1 includes triangle data\n file2 includes points data\n”, argv[0]);

    exit(1);

    }

    FILE *TRIDATA;

    FILE *POINTDATA;

    if(!(TRIDATA=fopen(argv[1], “rt”))){

    printf(“ERROR. %s does not exists.\n”,argv[1]);

    exit(1);

    }

    if(!(POINTDATA=fopen(argv[2],”rt”))){

    printf(“ERROR. %s does not exists.\n”,argv[2]);

    exit(1);

    }

    char buf1[200];

    char **buffer1;

    char buf2[200];

    char **buffer2;

    int i=0;

    while(!feof(TRIDATA) && !feof(POINTDATA)){

    fgets(buf1,200, TRIDATA);

    fgets(buf2,200,POINTDATA);

    buffer1=g_strsplit(buf1, “,”, 6);

    triangle tri;

    tri.t1.x=atof(buffer1[0]);

    tri.t1.y=atof(buffer1[1]);

    tri.t2.x=atof(buffer1[2]);

    tri.t2.y=atof(buffer1[3]);

    tri.t3.x=atof(buffer1[4]);

    tri.t3.y=atof(buffer1[5]);

    buffer2=g_strsplit(buf2, “,”,2);

    point po;

    po.x=atof(buffer2[0]);

    po.y=atof(buffer2[1]);

    printf(“%d,%d\n”,triangleInteriorPoints(po, tri),i++);

    g_strfreev(buffer1);

    g_strfreev(buffer2);

    }

    return 1;

    }

    그리고 컴파일 명령어는 다음과 같다.

    gcc `pkg-config –cflags –libs glib-2.0` -o triangle triangle.c

    glib2가 있어야 컴파일 된다는 점에 주의하여야 한다.

    사용법은 다음과 같다.

    Usage : ./triangle file1 file2

    file1 includes triangle data

    file2 includes points data

    triangle data는 콤마(,)로 구분된 6개의 실수가 들어가고, points data는 콤마로 구분된 2개의 실수가 들어간다.

  • 피보나치 수열

    간단한 피보나치 수열의 구현.

    #include

    #include

    #include

    int fibonacci(int);

    int main(int argc, char* argv[])

    {

    int i;

    if (argc==1){

    printf(“Error. There are no options.\n”);

    exit(1);

    }

    i=atoi(argv[1]);

    printf(“%d-th number of fibonacci is %d\n”, i, fibonacci(i));

    }

    int fibonacci(int i)

    {

    if (i<1) {
    printf(“Error. Parameter is negative.\n”);

    }

    else if (i==1) {

    return 1;

    }

    else if (i==2) {

    return 1;

    }

    else {

    return fibonacci(i-2)+fibonacci(i-1);

    }

    }