C\#4.0 대수 연산--BigInteger 의 응용 상세 설명

얼마 전,한 동료 가"3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000직감 적 으로 나 에 게 중간 에 0 을 몇 개 넣 고 뒤에 1 을 넣 으 면 질 수 는 아 닐 것 이 라 고 말 했다.많은 면접 문제 가 있 는데 면접 자 들 이 대수 에 관 한 연산 을 해 야 한다.예 를 들 어 여기 서 위 에 있 는 이 숫자 가 질 수 인지 아 닌 지 를 판단 하 는 상황 이 있다.Integer,Long 은 이렇게 큰 수 를 처리 할 수 없 음 이 분명 하 다..net framework 4.0 에 서 는 System.Numerics.dll 에서 BigInteger 류 를 제공 합 니 다.이런 종 류 를 사용 하면 이 문 제 를 편리 하 게 해결 할 수 있다.n 은 질 수 를 판단 하 는 방법:1:짝수 라면 질 수 2 가 아 닐 것 이다.만약 에 Sqrt(n)보다 작 거나 같은 수 를 다 나 눌 수 있다 면 질 수 는 아니다.코드 는 다음 과 같 습 니 다.

private static bool IsPrime()
{
    string largeNumber = @"30000000000000000000000...000000001”;
    BigInteger bigInteger = BigInteger.Parse(largeNumber);
    if (bigInteger.IsEven)
    {
        return false;
    }
    for (BigInteger bi = 3; BigInteger.Pow(bi, 2) <= bigInteger; bi += 2)
    {
        if (bigInteger % bi == 0)
        {
            return false;
        }
    }
    return true;
}
원래 for 순환 중의 코드 는

for (BigInteger bi = 3; bi <= BigInteger.Sqrt(bigInteger); bi += 2)
{
    if (bigInteger % bi == 0)
    {
        return false;
    }
}
안 타 깝 게 도 BigInteger 는 Sqrt 방법 을 지원 하지 않 기 때문에 바 꾸 었 습 니 다.
for (BigInteger bi = 3; BigInteger.Pow(bi, 2) <= bigInteger; bi += 2)
 결 과 는 다음 그림 과 같다.
image
'300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
2:C 언어 중 에 전형 적 인 제목 은 100 을 구 하 는 것 입 니 다!뒤에 몇 개 있어 요?
BigInteger 를 모른다 면 어떻게 해 야 하나 요?
 100! 로 이해 할 수 있다image
 짝수 가 5 보다 많 기 때문에 i 값 이 j 값 보다 많 기 때문에 100 을 구 합 니 다!몇 개의 0 이 있 는 지 는 j 의 값 을 구 하 는 것 이 라 고 볼 수 있다.
물론 공식 으로 도 가능 합 니 다.
 Sum = [100/5]+[100/(5^2)]+[100/(5^3)]=20+4+0=24;
 만약 당신 이 생각 도 공식 도 없다 면 머 릿 속 에 한 가지 생각 만 있 습 니 다.1*2*3*4*5*..*100 의 for 순환,그리고 0 의 수량 을 통계 하면 4.0 에서 도 실현 할 수 있 습 니 다.속도 가 느 린 것 같 지만 답 을 얻 을 수 있 습 니 다.
 코드 는 다음 과 같 습 니 다:
image  
통계 의 코드 는 다음 과 같다.
운행 결 과 는 다음 과 같다.

int count = 0;
for (int i = strSum.Length - 1; i >= 0; i--)
{
    if (strSum[i] == '0')
    {
        count++;
    }
    else
    {
        break;
    }
}
image 
아직도 많은 수의 연산 을 사용 하 는 곳 이 있 습 니 다.당신 의 발 휘 를 기다 리 고 있 습 니 다!

좋은 웹페이지 즐겨찾기