c언어 초보좀 도와주세요~

qkdlvlxk의 이미지

팩토리얼 연산을 만들고 있는데 범위를 그냥 아주 크게 잡으려고 unsigned long long 자료형을 선언했었습니다.
근데 이거 자릿수가 19 자리가 최대인 거 같아서 그냥 char num[21] 이런 식으로 선언하고 계산을 하려고 했었습니다.
unsigned long long나 num[21]같은 배열 형식을 이용하려고 합니다.

문제는
팩토리얼이 음수 연산이 안 된다기에 -을 입력하고 숫자 입력 시, 에러 취급을 하려고 합니다.
그러려면 가장 처음에 입력받은게 -인지, 혹은 그냥 숫자인지를 구별해야 하는데 이 부분을 어떻게 할 지 모르겠네요..

#include <stdio.h>
 
int main()
{
	unsigned long long i, num = 0, result = 1;
	char sav[21];
 
	scanf_s("%s", sav, 21);
 
	if(sav[0] != '-') // num이 양수일 경우
		for(i = 0; i <= num; i++)
			result *= i;
 
	else if(sav[0] == '-') // num이 음수일 경우
	{
		printf("음수 팩토리얼 연산 불가\n");
		return 1;
	}
 
	else // num이 0일 경우
		result = 0;
 
	printf("%llu\n", num);
 
	return 0;
}

지금 쓴 게 이건데 첨에는 다 int 형으로 선언했었다가 위에 쓴 거 고민하다보니 암것도 안 되네요.
문자열을 숫자로 바꾸면 될 거 같아서 atoi 함수같은 거 써보려다가 unsigned long long형에 맞는 함수가 뭔 지를 못찾겠는데 혹시 아시는 분 있으시면 답변부탁드립니다..
아니면 무슨 방법이라도 가르쳐주세요.

palsuet의 이미지

위 코드대로 하면 안되는 게, num이 0으로 초기화되고 그 뒤로 값이 바뀌지 않으니까 for문이 돌지 않아서 그러는 거겠네요. 문자열을 unsigned long long으로 바꾸는 건 찾아보니까 stdlib.hstrtoull라는 함수가 있네요. 저도 써본 적은 없어서 잘 모르지만...

feel the gravity

qiiiiiiiip의 이미지

쉬운것부터 일단 해보시고, 문제가 생기면 하나씩 해결하는게 나을것 같네요.
입력이 0 보다 작은경우나 int range보다 큰 경우는 물론 처음부터 설계에 고려되면 좋겠지만,
그것때문에 작업 자체를 멈춰야할만큼 critical 한 문제는 아닌듯요.

-

입력이 - 인 경우 또는 아예 숫자가 아닌 경우는 입력을 int 로 바꾸다보면 저절로 해결될 문제고요,
man atoi 참고하시고,
big integer 구글링해보시면 원하시는 답을 모두 얻을 수는 있습니다.

klyx의 이미지

10진수 문자열을 정수로 변환하는거야, 그냥 첫글자부터 10씩 곱해가면서 더해가면될뿐입니다.
함수가 없으면 스스로 만들면됩니다.

그보다, 팩토리얼을 계산할때 unsigned long long을 쓰는건 큰 숫자에 대한 해결책이 아닙니다.
팩토리얼은 지수적으로 증가하기 때문에 고작 비트수 두배한거가지고는 택도없습니다.
20!만 계산해도 2^61승 이상이기 때문에 64비트 정수로 나타낼 수 있는건 이게 한계입니다.
정말로 큰수에 대해 대응하고 싶으신거라면 별도의 큰숫자용 라이브러리를 쓰거나 간단하게는 길이에 제한이 없는 배열끼리 그대로 곱할수 있는 알고리즘을 작성하셔야 합니다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.