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

유사완전수,괴짜수

바로이순간 2013. 12. 1. 20:16

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

int main() {

    int a[4000]={0,};

    int sfl[4000]={0,};

    int i, j=0, num;

    int sum=0, n, x, y, z, t;

 

    printf("숫자를 입력하시오: ");

    scanf("%d", &num);


    srand(time(NULL));

    for(i=1;i<=num/2;i+=1) {

        if(num%i==0) {

            a[j]=i;

            j+=1;

        }

    }

    // num보다 작은 약수의 갯수

    n=j;    

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

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

        sum+=a[i];

    }

    printf("\n");

    if(sum<=num) {

        printf("입력된 수 %d는 유사완전수가 아닙니다.\n", num);

    } else {


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

            sfl[i]=i;

        }

        for(z=0;z<10000000;z+=1) {

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

                x=rand()%n;

                y=sfl[j];

                sfl[j]=sfl[x];

                sfl[x]=y;

            }

            sum=0;

            i=0;

            while(sum<num) {

                sum+=a[sfl[i]];

                i+=1;

            }

            if(sum==num) break;

        }

        if(z==10000000) {

            printf("%d는 유사완전수가 아닙니다.(괴짜수입니다)\n", num);

        } else {

            printf("%d는 유사완전수입니다.\n", num);

            printf("근거: ");

            y=i;

            for(i=0;i<y-1;i+=1) {

                x=i;

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

                    if(sfl[x]>sfl[j]) x=j;

                }

                t=sfl[i];

                sfl[i]=sfl[x];

                sfl[x]=t;

            }

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

                printf("%d ", a[sfl[i]]);

            }

        }

    }


    return 0;

}  



'c·c++ > c 프로그래밍' 카테고리의 다른 글

Dijkstra's algorithm  (0) 2013.12.16
괴짜수(weird number) 출력하기  (0) 2013.12.02
힙정렬  (0) 2013.11.11
간단한 연결리스트  (0) 2013.10.28
n보다 작은 소수 출력하기  (0) 2013.10.26