어디로든 빼도 소수가되는수

qw3709의 이미지

소수 3797에는 왼쪽부터 자리수를 하나씩 없애거나 (3797, 797, 97, 7) 오른쪽부터 없애도 (3797, 379, 37, 3) 모두 소수가 되는 성질이 있습니다.
이런 성질을 가진 소수는 단 11개만이 존재합니다. 이것을 모두 찾아서 합을 구하세요.
(참고: 2, 3, 5, 7은 제외합니다)

이게 문제이구요

#include <stdio.h>
int getsosu(int num)
{
	int i,a;
	if(num%2!=0){
		for(i=2;i<num;i++){
			if(num%i==0){
				a=1;
				break;
			}
		}
		if(a==0)
		return 1;
	}
	a=0;
}
void main()
{
	int i=10,b,A2=0,A3,A4,copy_i,much,dis,judge,xx=1,ans,count=0,total;
 
 
	while(count==11)
	{
		b=getsosu(i);
		if(b==1){
		A2=1;
		}//소수 구하기.A1
 
 
		if(A2==1){
			copy_i=i;
 
			while(copy_i>9){
				dis=copy_i%10;
				copy_i-dis;
				judge=getsosu(copy_i);
				if(judge!=1)
				break;	
			}
			if(judge==1)
			A3=1;	
 
		}//오른쪽부터 뺴서 소수구하기.A2 
 
		if(A3==1){
			copy_i=i;
			while(copy_i>9){
				copy_i=copy_i/10;
				xx=xx*10;
			}
			copy_i=i;
			while(copy_i>9){
				dis=copy_i/xx;
				copy_i=copy_i-(dis*xx);
				xx=xx/10;
				judge=getsosu(copy_i);
				if(judge!=1)
				break;
			}
			if(judge==1)
			A4=1;
 
		}//왼쪽부터 빼서 소수구하기.A3 
 
		if(A4==1){
		total+=i;
		count++;
		}
 
		A2=0;
		A3=0;
		A4=0;
		i++;
	}//모든 반복문 
 
 
	printf("%d",total);
 
 
 
 
}

이게 제코드입니다
어디가 잘못된건지 답이계속 0이나오네요...

raymundo의 이미지

그냥 넘어갈까 하다가 질문글 올리신 게 처음도 아닌데 매번 답을 못 얻으셔서 속상할 것 같아 약간 참견을 하자면... 웬만큼 시간이 남고 심심해 죽겠다는 분이 아니라면 이 문제를 해결할 맘이 들지 않을 것 같습니다.

남이 작성한 코드를 보는 것은 원래도 어려운 일입니다. 게다가 이런 알고리즘 문제처럼 복잡한 계산 로직이 필요하고, 미리 정해져 있는 로직을 단순히 구현한 게 아니라 본인이 직접 만든 로직이라면 더더욱 그렇고요. 그럼 자신이 문제를 풀기 위해 세운 로직을 설명을 따로 하거나, 주요 변수들의 용도가 무엇인지 주석을 달거나, 하다못해 변수 이름이라도 좀 직관적으로 알아볼 수 있게 지어야 다른 사람들이 보면서 문제점이 뭔지를 그나마 쉽게 찾아줄 수 있습니다. a, b, A2, A3, 이런 거 말고요.

일단 눈에 띄는 것만 짚어드리면,

1.

당장 함수 이름부터 헷갈립니다. getsosu() 함수는 이름을 보면 소수를 구하는 함수 같은데 실제로는 인자로 받은 num이 소수인지 아닌지 판별하는 거군요. is_prime 같은 게 낫겠고요.

2.

처음 if 조건이 참이면 안으로 진입해서 어찌어찌 return 1이 수행될 수 있다치고, if 조건이 거짓이면 a=0;을 수행하고 끝나는데, 바로 종료될 건데 a를 0으로 다시 재설정하는 건 무슨 의미가 있는지 모르겠고요. 그리고 C의 함수(반환형이 void인 경우를 빼면)는 명시적인 return 문이 없이 블록의 끝에 도달해서 종료될 경우 어떤 값이 리턴될지는 알 수 없습니다.

3.

그리고 이건 동작에는 영향이 없지만, 한번이라도 num이 i로 나누어떨어지면 그 순간 소수가 아니라는 판정을 내리고 리턴해버리면 그만이니 a라는 변수는 사실 전혀 안 쓰고도 함수를 만들 수 있었을 테고, 정 쓴다면 위에서 말씀드렸듯이 이름이라도 divided나 not_prime이었으면 알아보기 쉬웠을 것 같습니다.

4.

암튼, 이 getsosu() 함수가 제대로 동작하는지는 확인해보셨습니까? 이건 컴파일 환경에 따라서 운 좋으면 잘 되었을 수도 있긴 하겠는데, 제가 컴파일할 때는 a의 초기값이 주어지지 않는 바람에 a==0 조건을 만족을 못해서 num이 소수여도 1을 반환하지 못하는 경우가 생기더군요.

5.

이제 문제의 main()함수인데...

디버거를 쓰는 것에 익숙하지 않다면, 하다못해 코드 곳곳에 printf라도 집어넣어서 주요 변수들의 값이 내가 예상한 대로 변해나가고 있는지 확인해보세요. while 루프 안에 printf를 넣었다면, while 루프 안에 단 한 번도 진입하지 못하고 끝나버렸다는 걸 바로 알았을 겁니다. count 가 0으로 시작했는데 count==11 이라는 조건을 검사하고 있으니까 당연히 진입 못 합니다.

조건을 수정해도 제대로 실행은 안 되는 것 같지만요.(무한 루프 빠지는 듯 하군요)

6.

copy_i-dis;

이런 구문이 있는데 이건 어떤 변수에도 영향을 주지 못합니다. 아마 copy_i -= dis 라고 쓰려던 게 아니었나 싶고요.

그리고 copy_i -= dis 라면, dis 는 copy_i % 10 이니까 원래값의 일의 자리의 수입니다. 원래값에서 일의 자리의 수를 빼면 그 결과는 항상 일의 자리가 0입니다. (1234 - 4 = 1230) 이걸 소수인지 검사하면 당연히 소수가 아니라고 나올 것이고, 따라서 i 가 몇이든 간에 여기서 탈락하겠네요.

(다른 문제점이 더 있을지는 모르겠는데 저도 힘들어서 여기까지만...)

암튼, 지금 언급하는 것들 모두가 printf 만 적절히 넣어서 변수들의 값이 바뀌는 걸 확인만 해봤어도 발견했을 문제들입니다.

스크롤이 너무 빨리 된다거나 하면 출력을 파일로 리다이렉트해서 보도록 하시고,

지금 보면 3797이 답 중 하나라는 건 확실히 아니까, 그냥 i = 3797 로 고정한 다음에 이걸 11개의 답 중 하나로 찾아내는지부터 점검해보세요.

좋은 하루 되세요!

hh의 이미지

아이구 시간내주셔서 감사합니다 제가 프로그래밍 배운지 얼마되지않고 나이도 어려서 여기저기 실수도많고 모르는게 많습니다.
적어주신 내용 모두 참고해서 스스로 해결해보겠습니다 감사합니다

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.