HDU1042(N!)문제풀이

5964 단어

HDU1042(N!)문제풀이


만일을 대비하여 제목의 원문과 링크는 모두 문말에 첨부한다.그러면 먼저 제목 분석:

[한마디로 제의]


N의 곱셈을 계산하고 출력합니다.

[제목 분석]


문제의 범위 상한선이 10000이라면 틀림없이 대수 문제일 것이다.전에 제가 여러 가지 큰 코드를 정리하고 고쳐서 이른바 봉인을 했습니다. 그래서 이 문제는 바로 비슷한 코드로 수정을 했습니다. 그리고...제출하면 맞다(야...).하지만 문제풀이로 어떻게든 방법을 분명히 설명해야 하지 않겠는가.
다음은 c 언어 코드(cpp가 제출한 것이지만 cpp 헤더 파일도 한 무더기 가지고 있음)이며 코드 해석도 첨부되어 있습니다.코드는 이해하기 쉬우니 해석을 보면 분명히 볼 수 있을 것이다.그리고 또...만약 당신이 자바 코드를 쓴다면...만들어진 빅인터 안녕. 안녕히 가세요.

【 알고리즘 프로세스 】


대수 곱하기 소수: 이곳의 소수는 int 범위 내의 소수를 가리킨다.네가 알고 있든 없든, 우리는 네가 알고 있다고 가정한다. 큰 숫자는 한 개의 수조로 저장해야 하고, 아래 표지는 한 개의 숫자에 대응해야 한다. (아래 표지와 위치의 관계는 항상 상반될 수 있다.)대수 연산은 모의 초등학교에 해당하는 열식 계산이다.그러면 우리는 초등학교처럼 대수의 한 자리와 소수를 곱한 다음에 진위를 기록하고 다음 자리에 더하면 된다.계산을 편리하게 하기 위해서 우리는 int수 그룹 a로 대수를 저장하고 i의 소수를 항상 정돈한다. (이 변수의 명칭을 바꾸면 보기 편하다. 여기서 바꾸지 않는 것은...왜냐하면.... 사랑 때문에XD) 편의를 위해 우리는 하표를 채택하여 작은 것부터 큰 것까지 대응한다. 10, 백, 천, 만...의 저장 방식입니다.비트레이트와 출력 관리를 편리하게 하기 위해서, 우리는 변수digit 저장소를 사용하여 기존의 비트레이트를 관리합니다.우리는 변수 j를 교체기로 비트레이트를 스캔하여 모든 비트레이트의 곱셈을 시뮬레이션하고 캐리로 비트레이트를 저장합니다.(주:temp 형식은 int입니다.)그래서 위의 설명에 따라 우리는 이런 코드를 가지게 되었다.
        for(carry = 0, j = 1; j <= digit; ++j) {
            temp = a[j - 1] * i + carry;
            a[j - 1] = temp % 10;
            carry = temp / 10;
        }
        while(carry) { //         ,      digit
            a[++digit - 1] = carry % 10;
            carry /= 10;
        }

우리는 위의 코드 inta[455000] = {5,4,3,2,1}를 이렇게 테스트할 수 있다//12345로 초기화하고 스스로 고치고 싶다 = = digit = 5;//위 와 같이 5 위 i = n;//n곱할 수 있는 수를 위해 함수 테스트를 봉합하세요...물론 테스트 결과는 과학적일 겁니다.코드 수정: 대수 곱셈 소수가 생기면 1곱셈에서 원하는 수(최대 1w)로 순환하면 됩니다.분명히 우리는 다음과 같은 것을 필요로 한다.
  int a[455000] = {1};//    1
  digit = 1;//1 (  
  for(i = 2; i <= n; i++) {
    //           ,i   ,a     。n       
    //     ,            *2*3*4*...*n 
  }

이제 알겠지...코드를 입력합니다.
 1 #include <iostream> 
 2 #include <algorithm>
 3 #include <stdio.h>
 4 #include <stdlib.h>
 5 #include <string.h>
 6 #include <math.h>
 7 
 8 using namespace std;
 9 
10 void echoFactorial(int n);
11 
12 int main() {
13     
14     int n;
15     while(scanf("%d",&n) != EOF) {
16         echoFactorial(n);
17     }
18     return 0;
19 }
20 
21 void echoFactorial(int n){
22     int carry, j;
23     int digit;
24     int temp, i;
25     int a[455000] = {1};//the express code of hometown
26     digit = 1;
27     for(i = 2; i <= n; i++) {
28         for(carry = 0, j = 1; j <= digit; ++j) {
29             temp = a[j - 1] * i + carry;
30             a[j - 1] = temp % 10;
31             carry = temp / 10;
32         }
33         while(carry) {
34             a[++digit - 1] = carry % 10;
35             carry /= 10;
36         }
37     }
38 
39     for(int k = digit; k >= 1; --k)
40         printf("%d", a[k - 1]);
41     printf("
"); 42 43 } 44 /* 45 TestData(IN) 46 1 47 2 48 3 49 TestData(OUT) 50 1 51 2 52 6 53 */

 
 
제목 정보는 다음과 같습니다.
제목 링크: (HDU 1042) N!제목 속성: 대수, 시뮬레이션 (이 문제를 일일이 열거해야 한다니, 취, 그럴 리가. 그래, 일일이 열거해도 괜찮아~) 관련 제목: 1002, 1042, 1133, 1250, 1297, 1715, 1753, 1865, 2100 제목 원문: [Desc] Given an integer N(0≤ N≤10000), your task is to calculate N!【In】One N in one line, process to the end of file.【Out】For each N, output N! in one line.[SampIn/Out] 코드 아래의 참고 사항을 참조하십시오.

좋은 웹페이지 즐겨찾기