Hero Image
Problem.1110

백준 단계별 문제집 레벨 3 모든 내용은 Git Hub에도있습니다. 1110번[더하기 사이클] 처음 덧셈의 수식이 다시 한번 돌아 올때 까지의 사이클을 찾는것입니다. start: 26 [2+6=8 =>(68) 6+8=14 =>(84) 8+4=12 =>(42) 4+2=6 =>(26) 2+6=8] 위의 예제 처럼 26이 다시 나올려면 68 -> 84-> ->42 -> 26 이렇게 4번만에원래의 숫자로 돌아왔습니다. 알고리즘은 비교적간단합니다. 처음 상태와 다음 상태 들을 비교하면서 같은 상태가 나올때 까지 사이클을 카운트 합니다. #include <stdio.h> int circle(); int tokken_units(); int token_tens(); int main(){ int N,temp_N; int result; scanf("%d",&N); printf("%d\n",circle(N)); } int circle(int N){ int count=1; int init_state[3]; int next_state[3]; int arg_first,arg_second,arg_result; init_state[0]=token_tens(N); //첫 시작의 10의자리 init_state[1]=tokken_units(N); //첫 시작의 1의자리 init_state[2]=init_state[0]+init_state[1]; //첫 시작의 덧셈 결과 next_state[0]=init_state[0]; next_state[1]=init_state[1]; next_state[2]=init_state[2]; while(1){ if(next_state[2]<10){ next_state[0]=next_state[1]; next_state[1]=next_state[2]; next_state[2]=next_state[0]+next_state[1]; } else{ next_state[0]=next_state[1]; next_state[1]=tokken_units(next_state[2]); next_state[2]=next_state[0]+next_state[1]; } if(next_state[0]==init_state[0]&&next_state[1]==init_state[1]&&next_state[2]==init_state[2]){ //다음 계산식이 처음과 같아지면 종료 break; } count++; } return count; } int tokken_units(int N){ int units;//units 일의 자리 units= N-(N/10)*10; return units; } int token_tens(N){ int tens;//units 일의 자리 tens= N/10; return tens; }

Hero Image
Problem.1978

Math Problem Problem.1978 - Tag[수학] 소수찾기 소수찾기 소수는 sqrt(N)까지만 검색하면 된다. 2~sqrt(N)까지 나누어 떨어지는 수가 없다면 소수가 보장되기 때문임. #include <stdio.h> #include <math.h> int is_prime(); int main(){ int N,input,count=0,prime=1; scanf("%d",&N); for (int i = 1; i <= N; ++i) { // input=i; scanf("%d",&input); if(is_prime(input)==1) count++; } printf("%d\n",count); } int is_prime(int num){ if(num==1) return 0; for (int j = 2; j <= sqrt(num); ++j) { if(num%j==0){ return 0; } } return 1; } 에라토네스의 체 알고리즘 /* 에라토스테네스의 체 알고리즘을 기준으로 찾는다. 2부터 소수를 구하고자 하는 구간의 모든 수를 나열한다. 그림에서 회색 사각형으로 두른 수들이 여기에 해당한다. 2는 소수이므로 오른쪽에 2를 쓴다. (빨간색) 자기 자신을 제외한 2의 배수를 모두 지운다. 남아있는 수 가운데 3은 소수이므로 오른쪽에 3을 쓴다. (초록색) 자기 자신을 제외한 3의 배수를 모두 지운다. 남아있는 수 가운데 5는 소수이므로 오른쪽에 5를 쓴다. (파란색) 자기 자신을 제외한 5의 배수를 모두 지운다. 남아있는 수 가운데 7은 소수이므로 오른쪽에 7을 쓴다. (노란색) 자기 자신을 제외한 7의 배수를 모두 지운다. 위의 과정을 반복하면 구하는 구간의 모든 소수가 남는다. */ #include <stdio.h> #include <string.h> #include <stdlib.h> int main(){ int N,count=1; scanf("%d",&N); char *arr=(char*)malloc(sizeof(char)*N); memset(arr,1,sizeof(char)*N); puts(arr); for (int i = 2; (i*i)<= N; ++i) //루트 N까지만 체크 { if(arr[i]==1){ for (int j = i*i; j < N; j+=i) { arr[j]=0;//1 is prime 0 is not prime } } } for (int i = 2; i < N; ++i) { if(arr[i]==1){ printf("%d ",i); if(count%10==0) puts(""); count++; } } free(arr); } 모든 내용은 Git Hub에도있습니다.