c·c++/c 프로그래밍

프로그램 모음

바로이순간 2015. 5. 17. 14:33

[천칭추의 최소화]

#include <stdio.h>

int main() {

    int x, y, z;

    int b, n, ny;

    printf("몇 그람을 달았나? ");

    scanf("%d", &x);

 

    n=x; // 추의 갯수를 x라 한다. 큰 값이다.

    // 물건의 무게를 x라고 하고 왼쪽에 올려 놓는다고 하자.

    // 왼쪽에 추가할 추의 무게를 y라고 하고

    // 오른쪽에 올려놓을 추의 무게를 z라고 하자.

    // 예를 들어서 x의 무게가 15라면 왼쪽에 1을 더 올려

    // 놓으면 16이 되어서 오른쪽에 16짜리 추를 한개만

    // 사용하면 무게를 측정할 수 있다.

    // 왼쪾에 올려놓는 추의 무게의 합은 원래 무게를

    // 초과할 수 없다. (조금 따져보면 될 것으로 본다)

    y=0;

    while(y<x) {

        // 오른쪽 추의 무게의 합 z

        z=y+x;

        // 오른쪽 추의 갯수

        b=0; 

        while(z!=0) {

            b+=z%2;

            z=z/2;

        }

        //왼쪽에 추가한 추의 무게의 합 y

        z=y;

        // 왼쪽에 올려놓은 추의 갯수를 더한다.

        while(z!=0) {

            b+=z%2;

            z=z/2;

        }

        // 만약 방금 구한 추의 갯수가 

        // 지금 까지 구한 추의 갯수보다 작다면

        // 작은 추의 갯수를 바꾸어 주고,

        // 그 때 왼쪾에 올려놓은 추의 무게의 합을

        // ny에 보관한다.

        if(b<n) {

            n=b;

            ny=y;

        }

        y+=1;

    }

    printf("%d그램 추를 왼쪽 저울에 올립니다.\n", ny);

    printf("%d그램 추를 오른쪾 저울에 올립니다.\n", x+ny);

    printf("%d 개의 추를 사용하였습니다.\n", n);

 

    return 0;

}

 

 

 

[곡선의 길이]

#include <stdio.h>

#include <math.h>

// f(x)의 정의가 잘못된 것 같아

// x+sqrt(x*x-1) 로 바꾸어 돌려보았습니다.

double f(double x) {

    return x+sqrt(x*x-1);

}

int main() {

    int i, n;  // 정수 i n

    double a=2, b=5; // 구간

    double x, y, x1, y1, dx, dy;

    double length=0; // 곡선의 길이

 

    printf("n= ");

    scanf("%d", &n);

    dx=(b-a)/n;     // delta x

 

    x1=a;            // 출발하는 x좌표

    y1=f(x1);         // 출발하는 y좌표

    // printf("x1=%g y1=%g\n", x1, y1);

    // n개의 선분의 길이를 더한다.

    for(i=0;i<n;i+=1) {

        // 다음 x좌표

        x=x1+dx;

        // 다음 y좌표

        y=f(x);

        dy=y-y1;

        x1=x;

        y1=y;

        // printf("x1=%g y1=%g\n", x1, y1);

        length+=sqrt(dx*dx+dy*dy);

    }

 

    printf("길이는 %f입니다.\n", length);

 

    return 0;

}

 

 

 

[난수 중복없이 출력하기]

#include<stdio.h>

#include<stdlib.h>

#include<time.h>

 

int main(void) {

  int r, arr[9]={0,};

  int i, x, temp;

  printf("랜덤출력.\n");

  srand((unsigned)time(NULL));

 

  // 0부터 8까지의 수를

  for(i=0;i<9;i+=1) {

    arr[i]=i;

  }

  // 이 곳에서 잘 섞어 줍니다.

  for(i=0;i<9;i+=1) {

    // i번째 수와 x번째 수를 서로 바꾸어 줍니다.

    x=rand()%9;

    temp=arr[i];

    arr[i]=arr[x];

    arr[x]=temp;

  }

  // 여기서 출력해 줍니다.

  for(i=0;i<5;i+=1) {

    printf("%d", arr[i]);

  }

  printf("\n");

 

  return 0;

}

 

 

[fibo(0)부터 fibo(n)까지를 구하려면]

#include <stdio.h>

int main(void) {

  int a=0, b=1, i, n;

 

  printf("n= ");

  scanf("%d", &n);

  for(i=0;i<n+1;i+=1) {

    a=a+b;

    b=a-b;

    printf("%d ", a);

  }

 

  return 0;

}

 

 

[10진수를 2진수로 바꾸기]

#include <stdio.h>

// 주어진 10진수 n 2진수로 바꾸어 줄력해 준다.

int main() {

    // bin 2진수를 담을 배열, 가장 밑의 자리부터 구하여 

    // 위로 가면서 2진수를 구해 간다. 출력할 때는 꺼꾸로 출력을 한다.

    int bin[32]={0,};

 

    // 인덱스 변수, i 0에서 출발한다.

    int i=0;

    int n;

    // 음수를 처리하기 위해서 x unsigned 로 주었다.

    unsigned x;

 

    printf("정수: ");

    scanf("%d", &n);

    printf("2진수: ");

 

    x=n;

    // x 0이 아닌동안 계속한다.

 

    // 예를 들어서 x 5라면 

    // 5 2로 나눈 나머지는 1이되고 몫은 2가 된다

    // 가장 밑의 자리는 1이다. 이 수는 bin[0]에 들어간다.

 

    // x 2가 된다. 여전히 0이 아니다. 그리고 i 1이 된다.

    // 2 2로 나눈 나머지는 0이고 몫은 1이다.

    // bin[1]에는 0이 들어간다.

    // x 1이 되고, i 2가 된다.

 

    // x가 여전히 0이 아니므로 계속한다.

    // bin[2] 에는 1 2로 나눈 나머지인 1이 들어 간다.

    // x 1 2로 나눈 몫이므로 0이 된다.

 

    // i 3이 된다.

    // 이제 x 0이 되어서 while문을 탈출한다. 이때 bin배열에는

    // 1,0,1 이 들어 있고, i의 값은 3이다.

    while(x!=0) {

        bin[i]=x%2;

        x=x/2;

        i+=1;

    }

 

    // 출력은 꺼꾸로 해주어야 하므로 i 1 감소시킨다.

    i=i-1;

 

    // i 2가 되고 출력을 하면 맨 뒤의 1(가장 높은 자리) 이 출력이 된다.

    // i를 감소하면 1이 되고 출력을 하면 0이 출력이 된다.

    // i를 감소하면 0이 되고 출력을 하면 1이 출력이 된다.

    // i를 감소하면 -1이 되고 while문을 탈출한다.

 

    // 만약 처음 입력받은 n 0이라면 

    // i -1이 될 수 있다. 이 경우에는 

    // i 0으로 만들어 준다.

    if(i<0) {

        i=0;

    }

 

    while(i>=0) {

        printf("%d", bin[i]);

        i-=1;

    }

    printf("\n");

 

    return 0;

}

 

아래 프로그램을 돌려보면 i(시드)의 값이 1씩 증가할 때 마다

처음 rand()의 값은 3혹은 4씩 증가하도록 출력이 되는 것을 

볼수 있습니다. 왜 그렇게 되는지는 srand함수의 내부를 보아야 하겠습니다.

 

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

int main() {

    int a, t, i;

    t=time(NULL);

    for(i=t;i<t+200;i+=1) {

        srand(i);

        a = rand();

        printf("%8d", a);

    }

    return 0;

}

 

다음과 같이 해주면 연속해서 실행을 하더라도 최초의 랜덤값이 

비슷하지 않게 나오도록 하는 결과를 구할 수 있습니다.

 

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

int main() {

    int a, t, i;

    t=time(NULL);

    for(i=t;i<t+200;i+=1) {

        srand(i*12341);

        a = rand();

        printf("%8d", a);

    }

    return 0;

}

 

보다 나은 방법은 다음과 같은 코드를 사용하는 방법이 되겠습니다.

 

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

#include <windows.h>

int main() {

    int t, x=0;

    struct timeval tv;

    gettimeofday(&tv, NULL);

    t=tv.tv_usec;

    srand(t);

    x=rand();

    printf("%d",x);

    return 0;

}

 

마이크로 초 까지의 값을 가져와서 srand를 시키면 같아질수가 없읍니다.

최소한 순차적으로 거의 같은 시간에 실행을 시켰을 때는 말이지요.


[숫자 마름모 공백]

#include <stdio.h>

int main() {

    int i, j, k, n=4;

    int x=-1, y=-1;


    for(i=n;i<n+1;i+=x) {

        if(i==0) {

            x=1;

        }

        k=0;

        y=-1;

        for(j=n;j<n+1;j+=y) {

            k+=1;

            if(j==0) {

                y=1;

            }

            if(i+j<n) {

                printf(" ");

            } else {

                printf("%d", k);

            }

        }

        printf("\n");

    }


    return 0;

}

===================================================

#include <stdio.h>

int main() {

    int s, t;


    scanf("%d", &s);

    // s가 90이상이면 4개의 관계식을 모두 만족해서 t는 4가 된다.

    // s가 80이상이고 90보다 작다면 3개의 관계식을 만족 t는 3이 된다.

    // s가 70이상이고 80보다 작다면 2개의 관계식을 만족 t는 2가 된다.

    // s가 60이상이고 70보다 작다면 1개의 관계식을 만족 t는 1이 된다.

    // s가 60보다 작다면 0개의 관계식을 만족 t는 1이 된다.

    t=(s>=90)+(s>=80)+(s>=70)+(s>=60);

    switch(t) {

    case 4:

        printf("A");

        break;

    case 3:

        printf("B");

        break;

    case 2:

        printf("C");

        break;

    case 1:

        printf("D");

        break;

    default:

        printf("F");

    }


    return 0;

}