프로 그래 밍 연습 (1)

12335 단어 데이터 구조
제목:
 1  이런 숫자 가 있어 요. ABCD.  *  E  ==DCBA, 그 중 각 숫자 가 같 지 않 습 니 다. 프로그램 을 만들어 서 ABCD 가 각각 어떤 숫자 를 대표 하 는 지 계산 합 니 다.
 
#include 

int fun(int i,int j);
int reverse(int i);

int main()
{
    int i,j;
    for (i=1000; i<9999; i++)
        for(j=1; j<10; j++)
        {
            if(i*j==reverse(i)&&fun(i,j))
            {
                printf("%d
",i); printf("* %d
",j); printf("-------
"); printf("%d

",i*j); } } return 0; } int reverse(int i)// i { int r=0; while(i) { r=r*10+i%10; i=i/10; } return r; } int fun(int i,int j)// { int buf[4],k=0; while(i) { buf[k]=i%10; i=i/10; k++; } if(buf[0]==buf[1]) return 0; if(buf[0]==buf[2])return 0; if(buf[0]==buf[3])return 0; if(buf[0]==j)return 0; if(buf[1]==buf[2])return 0; if(buf[1]==buf[3])return 0; if(buf[1]==j)return 0; if(buf[2]==buf[3])return 0; if(buf[2]==j)return 0; if(buf[3]==j)return 0; return 1; }

2  
 3 쌍 의 신혼부부 가 결혼식 에 참석 했다. 3 명의 신랑 은 A, B, C 이 고 3 명의 신 부 는 X, Y, Z 이다. 누가 누구 와 결 혼 했 는 지 모 르 는 사람 이 있어 서 6 명의 신인 중 3 명 에 게 물 었 다. 그러나 A 는 X 와 결혼 할 것 이 라 고 말 했다. X 는 약혼자 가 C: C 라 고 말 하고 Z 와 결혼 할 것 이 라 고 말 했다.이 사람 은 듣 고 나 서 그들 이 농담 을 하고 있다 는 것 을 알 았 는데, 모두 거짓말 이 었 다.누가 누구 와 결혼 할 지 프로 그래 밍 해 보 세 요.
#include 

int match(int i,int j,int k,char wife[]);
int main()
{
    char husband[3]= {'A','B','C'},wife[3]= {'X','Y','Z'};
    int i,j,k;
    for (i=0; i<3; i++)
        for (j=0; j<3; j++)
            for (k=0; k<3; k++)
                if(i!=j&&i!=k&&j!=k)
                {
                    if(match(i,j,k,wife))
                    {
                        printf("husband    wife
"); printf("A----%c
",wife[i]); printf("B----%c
",wife[j]); printf("C----%c
",wife[k]); } } return 0; } int match(int i,int j,int k,char wife[]) { if(wife[i]=='X')return 0; if(wife[k]=='X')return 0; if(wife[k]=='Z')return 0; return 1; }

3  분해 질 인수
#include

int isPrime(int a)//        
{
    int i;
    for(i=2; i<=a-1; i++)
    {
        if(a%i==0)
            return 0;
    }
    return 1;
}

void PrimeFactor(int n)//     ,     
{
    int i;
    if(isPrime(n))
        printf("%d",n);
    else
    {
        for(i=2; i<=n-1; i++)
        {
            if(n%i==0)
                printf("%d ",i);
            if(isPrime(n/i))
            {
                printf("%d ",n/i);
                break;
            }
            else
                PrimeFactor(n/i);
            break;
        }
    }
}

int main()
{
    int n;
    scanf("%d",&n);
    PrimeFactor(n);
    return 0;
}

4. 판 타지 방진, n * n 의 행렬 에 n ^ 2 개의 숫자 를 입력 하여 모든 줄, 각 열 과 두 대각선 의 합 을 똑 같이 합 니 다.
해법: 
#include 

int match(int i, int j, int k, int l, int m, int n, int o, int p, int q)
{
  if(i!=j && i!=k && i!=l && i!=m && i!=n && i!=o && i!=p && i!=q && j!=k && j!=l && j!=m && j!=n && j!=o && j!=p && j!=q && k!=l && k!=m && k!=n && k!=o && k!=p && k!=q && l!=m && l!=n && l!=o && l!=p && l!=q && m!=n && m!=o && m!=p && m!=q && n!=o && n!=p && n!=q && o!=p && o!=q && p!=q)
    return 1;
  else
    return 0;
}

int justic(int i, int j, int k ,int l, int m, int n, int o, int p, int q)
{
  if(i+j+k==l+m+n && i+j+k==o+p+q && i+l+o==j+m+p && i+l+o==k+n+q && i+m+q==k+m+o)
    return 1;
  else
    return 0;
}

void getMatrix()
{
  int i,j,k,l,m,n,o,p,q;
  for(i=1;i<=9;i++)
    for(j=1;j<=9;j++)
      for(k=1;k<=9;k++)
        for(l=1;l<=9;l++)
          for(m=1;m<=9;m++)
            for(n=1;n<=9;n++)
              for(o=1;o<=9;o++)
                for(p=1;p<=9;p++)
                  for(q=1;q<=9;q++)
                  {
                    if(match(i,j,k,l,m,n,o,p,q))
                      if(justic(i,j,k,l,m,n,o,p,q)){
                        printf("%d %d %d
",i,j,k); printf("%d %d %d
",l,m,n); printf("%d %d %d
",o,p,q); return; } } } int main(int argc, char *argv[]) { getMatrix(); return 0; }

또 다른 간단 한 해법: 순서대로 1 부터 N ^ 2 까지 행렬 에 채 우 고 채 우 는 위 치 는 다음 과 같은 규칙 이 있 습 니 다.
 *첫 번 째 요 소 는 첫 번 째 줄 중간 에 놓 여 있 습 니 다. 
* 다음 요 소 는 현재 요소 의 이전 줄, 다음 열 에 저 장 됩 니 다.
 *이전 줄, 다음 열 에 내용 이 있 으 면 다음 요 소 는 현재 열 다음 줄 에 저 장 됩 니 다.
 
5  1 ~ 8 이라는 8 개의 숫자 를 무 작위 로 3 * 3 의 바깥쪽 동그라미 에 채 우 고 가운데 빈 동그라미 만 남 았 다.매번 빈 동그라미 로 만 이동 할 수 있 도록 규정 하고, 수 진의 숫자 를 질서 있 게 해 야 한다.
본질은 정렬 이 고 교환 성 을 가 진 정렬 방법 이다.나 는 정렬 을 선택 하고 거품 을 일 으 켜 정렬 할 수도 있다.
#include
void Print(int m[]);
int  getstep(int m[]);
int main()
{
    int i , m[8];
    for(i=0 ; i<8 ; i++)
        scanf("%d",&m[i]);
    Print(m);
    printf("
"); getstep(m); Print(m); return 0; } void Print(int m[]) { printf("[%d]--[%d]--[%d]
",m[0],m[1],m[2]); printf("| %c | %c |
" , 92 , 47); printf("[%d]--[ --[%d]
",m[7],m[3]); printf("| %c | %c |
" , 47 , 92); printf("[%d]--[%d]--[%d]
",m[6],m[5],m[4]); } int getstep(int m[]) { int i , j , temp; for (i =0 ; i<7 ; i++) for(j=0; j<7-i; j++) if(m[j]>m[j+1]) { temp=m[j]; m[j]=m[j+1]; m[j+1]=temp; } }

(6) 3 명의 용의자 가 법관 앞에서 각자 주장 을 한다. 갑 은 을 이 거짓말 을 한다. 을 은 병 이 거짓말 을 한다 고 말한다.병: 갑 과 을 두 사람 모두 거짓말 을 하고 있다.판사 가 어려움 을 위해 갑 을 병 세 사람 은 도대체 누가 거짓말 을 하고 있 습 니까? 누가 진실 을 말 했 습 니까?[제목 분석] 이것 은 매우 재 미 있 는 논리 추리 문제 다.이런 논리 적 추리 문 제 를 해결 하 는 가장 간단 하고 직관 적 인 방법 은 궁 거 법 을 사용 하 는 것 이다.갑 을 병 세 사람 중 누구든지 한 말 은 두 가지 가능성 이 있 는데 그것 이 바로 진실 과 거짓 이다.1 로 진 위 를 표시 하고 0 으로 가 위 를 표시 하면 갑 을 병 3 명 이 한 말의 진 위 는 다음 과 같은 범위 로 한정한다.갑 을 병 000 001...
#include

int main()
{
    int a,b,c;
    for (a=0; a<=1; a++)
        for (b=0; b<=1; b++)
            for (c=0; c<=1; c++)
            if((a&&!b ||  !a&&b)  &&  (b&&!c  ||  !b&&c)  &&  (c&&a+b==0  ||  !c&&a+b!=0))
            {
                printf("   told a %s
",a?"truth":"lie"); printf(" told a %s
",b?"truth":"lie"); printf(" told a %s
",c?"truth":"lie"); } return 0; }

 
 
(7) 사방 의 정 리 를 검증한다.
모든 자연 수 는 최대 4 개의 제곱 합 만 있 으 면 프로그램 검증 을 작성 할 수 있 습 니 다.
#include

int mode_1(int n)   //N=a^2
{
    int i;
    for(i=1;i

 
 
이 해법 은 생각 하기는 간단 하지만 너무 길다.다음은 다른 해법 입 니 다. 이 해법 은 비교적 교묘 합 니 다. 저 는 생각 지도 못 하고 가르침 을 받 았 습 니 다.
 
# include 
# include 
int f(int n, int a[], int idx)
{
    int i;
    if(n==0) return 1;
    if(idx==4)  return 0;
    for( i=(int)sqrt(n); i>=1; i--)
    {
        a[idx] = i;
        if(i * i == n || f(n - i * i, a, idx + 1))  return 1;  //    
    }
    return 0;

}
int main(int argc, char* argv[])
{
    for(;;)
    {
        int number;
        scanf("%d",&number);
        int a[] = {0,0,0,0};
        int r = f(number, a, 0);
        printf("%d: %d %d %d %d
", r, a[0], a[1], a[2], a[3]); } return 0; }

 
 
(8) 정수 시퀀스 에서 가장 작은 요 소 를 찾 아 재 귀 하 는 방법 으로 프로그램 을 작성 합 니 다.
# include 
#define N 100

int GetMin(int a[] , int n)
{
    int v1, v2 , v3;
    if(n==1)
        return a[0];
    if(n%2==0)        //     ,             
    {
        v1=GetMin(a, n/2);
        v2=GetMin(a+n/2 , n/2);
        if(v1>v2)
            return v2;
        else
            return v1;
    }

    if(n%2!=0)
    {
        v1=GetMin(a, n/2);
        v2=GetMin(a+n/2+1 , n/2);
        v3=a[n/2];
        if(v1

 
(9) 어부 조업 문제 A, B, C, D, E 등 5 개 어 부 는 야간 에 함께 조업 을 하 다가 새벽 에 지 쳐 각자 강가 숲 에서 자 리 를 찾 아 잠 이 들 었 다.해 가 중천 에 떴 을 때 어부 A 가 제일 먼저 깨 어 나 자 그 는 물고 기 를 5 인분 으로 나 누 어 나머지 한 마 리 를 강 에 던 져 자신의 몫 을 집 으로 가 져 갔다.어부 B 가 두 번 째 로 깨 어 나 도 물고 기 를 5 인분 으로 나 누고 남 은 한 마 리 를 버 리 고 자신의 몫 을 가 져 갔다. 이 어 C, D, E 가 차례대로 깨 어 나 도 똑 같은 방법 으로 물고 기 를 나 누 어 5 명의 어부 에 게 적어도 몇 마리 의 물고 기 를 잡 았 느 냐 고 물 었 다.시험 편성 프로그램 산출
이 문 제 를 해결 하려 면 마지막 어부 부터 시작 해 야 한다. 물고 기 를 나 누 는 원칙 에 따라 마지막 으로 남 은 것 은 6, 11, 16, 21 일 수 있다. 6 으로 가입 하면 D 는 8.5 로 논리 에 맞지 않 는 다.그래서 E 가능 한 값 을 다시 가 져 옵 니 다.
# include 


#define MAX 1000

int main()
{
    int last_fish;
    int s;
    int flag;
    int i , n;
    for(n=1; n

(10) 미인 대회 현장에서 한 무리의 선수 들 이 경기 에 참가 하 는데 경기 의 규칙 은 마지막 득점 이 높 을 수록 순위 가 낮 다 는 것 이다. 경기 가 결 동 될 때 현장에서 선수 의 출전 순서 (즉 선수 의 번호) 에 따라 최종 득점 과 최종 순 위 를 발표 해 야 한다. 같은 점 수 를 얻 은 선 수 는 같은 순위, 순위 연속 번 호 를 가지 고 같은 순위 의 선수 수 를 고려 하지 않 아 도 된다.예 를 들 어 선수 번 호 는 1, 2, 3, 4, 5, 6, 7 선수 의 점 수 는 5, 3, 4, 7, 3, 5, 6 등 이다.
3,1,2,5,1,3,4
이 문 제 는 배열 로 해결 할 수 없 으 므 로 구조 체 를 결합 하여 구조 체 배열 을 구성 해 야 한다.
# include 

typedef struct player
{
    int num;
    int score;
    int rand;
} P;

void sortScore(P psn[],int n)
{
    int i,j;
    P temp;
    for(i=0;ipsn[j+1].score)
        {
            temp=psn[j];
            psn[j]=psn[j+1];
            psn[j+1]=temp;
        }
    }
}

void setRand(P psn[] , int n)
{
    int i,j=2;
    psn[0].rand=1;
    for(i=1;ipsn[j+1].num)
        {
            tmp=psn[j];
            psn[j]=psn[j+1];
            psn[j+1]=tmp;
        }
    }
}


void sortRand(P psn[],int n)
{
    sortScore(psn,n);//         
    setRand(psn,n);//       
    sortNum(psn,n);//        
}

int main()
{
    P psn[7]= {{1,5,0},{2,3,0},{3,4,0},{4,7,0},{5,3,0},{6,5,0},{7,6,0}};
    int i;
    sortRand(psn , 7);
    printf("num  score  rand    
"); for(i=0;i<7;i++) { printf("%d%6d%6d
",psn[i].num, psn[i].score, psn[i].rand); } return 0; }

(11) 순서 표 의 현지 역 치
원 표 의 저장 공간 을 이용 하여 순서 표를 역 설정 하 다.
#include
#include
#define MAXSIZE 10

typedef struct
{
    int *base;
    int length;
} sqlist;

void reverse(sqlist *l)//  
{
    int low=0 , high=l->length-1;
    int buf , i;
    for(i=0;ilength/2 ; i++)
    {
        buf=l->base[low];
        l->base[low] = l->base[high];
        l->base[high]= buf;
        low++;
        high--;
    }
}

int main()
{
    int  a,i=0;
    sqlist l;
    l.base=(int *)malloc(sizeof(int)*MAXSIZE);
    l.length=0;

    scanf("%d",&a);
    while(i<=9&&a!= -1)
    {
        l.base[i]=a;
        l.length++;
        i++;
        scanf("%d",&a);
    }

    reverse(&l);
    for(i=0; i

좋은 웹페이지 즐겨찾기