[천칭추의 최소화]
#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;
}
'c·c++ > c 프로그래밍' 카테고리의 다른 글
하노이탑 - 반복문사용 (0) | 2015.09.20 |
---|---|
Microsoft Visual Studio 2010 Express Registration Key (0) | 2015.07.16 |
disjoint set union 프로그래밍 (0) | 2015.05.02 |
한 점의 삼각형포함문제 (0) | 2015.02.03 |
신입생 c언어독학 (0) | 2014.11.05 |