2013-09-22 6 views
0

그래서 C#에 대한 지식이 거의없는 초보자라는 말로 시작하겠습니다.C#에서 bigint없이 매우 큰 숫자를 더하거나 빼는 방법은 무엇입니까?

주제에 도달 : 매우 큰 정수를 더하고/감할 수있는 프로그램을 만들어야합니다. 처음에는 BigInt가 허용되지 않는다는 것을 알아 내기 위해서만 BigInt를 사용했습니다. 이에 대한 논리적 인 해결 방법이 있어야합니까? 나는 "초등학교 방법"을 사용하는 아이디어를 가지고 있습니다. 여기에서는 오른쪽에서 왼쪽으로 시작하는 각 자릿수를 추가합니다.

문자열을 문자 배열로 분할하고 각 숫자를 오른쪽에서 왼쪽으로 추가했습니다 (GetUpperBound-i). 그러나 그것은 효과가없는 것처럼 보입니다.

내 코드 : SO 질문 아래

string s, s2; 
char[] c_arr, c_arr2; 
int i, erg; 

s = "1234"; 
s2 = "5678"; 
c_arr = s.ToCharArray(); 
c_arr2 = s2.ToCharArray(); 
for (i = 0; i <= c_arr.GetUpperBound(0); i++) 
{ 
    erg = c_arr[c_arr.GetUpperBound(0)-i]+c_arr2[c_arr2.GetUpperBound(0)-i]; 
    Console.Write(erg); 
} 

Console.ReadKey(); 
+3

이 당신은 아마 지정해야 work._하지 않는 것 _But. –

+0

개별 자릿수 합이 9 이상인 경우를 처리 할 필요가 없습니까? 1을 다음 열로 가져와야합니다. – Matt

+0

각 배열의 두 문자를 합쳐도 예상 한대로 작동하지 않습니다. 처음 2, 4, 8에서는 "4"를 52로 변환하고 "8"을 56으로 변환합니다. 이것은 char 표현입니다. 각각의 개별 문자를 정수 값으로 변환하고 그 합을 계산해야합니다. – Matt

답변

2

는 '초등학교 방법'에 대한 코드 문제 몇 가지가 있습니다. 당신은 캐리를 고려하지 않고, 0-9 사이의 실제 값보다는 ascii 값을 더하고, 결과를 잘못된 순서로 출력합니다.

var s1 = "1234"; 
var s2 = "5678"; 
var carry = false; 
var result = String.Empty; 

for(int i = s1.Length-1;i >= 0; i--) 
{ 
    var augend = Convert.ToInt32(s1.Substring(i,1)); 
    var addend = Convert.ToInt32(s2.Substring(i,1)); 
    var sum = augend + addend; 
    sum += (carry ? 1 : 0); 
    carry = false; 
    if(sum > 9) 
    { 
     carry = true; 
     sum -= 10; 
    } 

    result = sum.ToString() + result; 
} 

if(carry) 
{ 
    result = "1" + result; 
} 

Console.WriteLine(result); 
+0

감사합니다. 내가 뭘 찾고 있었는지. 코드를 복사하는 것이 좋지 않다는 것을 알고 있습니다. 그러나 나는 그것을 이해하기 위해 최선을 다했지만 이해하고 있습니다. 이제이 코드의 도움으로 모든 산술 연산자가 작동하도록 노력할 것입니다. –

1

다음 프로그램은 두 개의 큰 번호를 추가 할 수 있습니다, 나는 결과를 저장하기 위해 문자열 빌더를 사용했다 :

아래의 코드는 매우 우아하지 반면, 올바른 결과를 생성한다. 최대 2,147,483,647 자릿수의 숫자를 추가 할 수 있습니다.

Using System; 

using System.Text; 

using System.Linq; 

public class Test 

{ 

public static void Main() 

{ 

    string term1="15245142151235123512352362362352351236"; 

    string term2="1522135123612646436143613461344"; 

    StringBuilder sum=new StringBuilder(); 

    int n1=term1.Length; 

    int n2=term2.Length; 

    int carry=0; 

    int n=(n1>n2)?n1:n2; 

    if(n1>n2) 

    term2=term2.PadLeft(n1,'0'); 

    else 

    term1=term1.PadLeft(n2,'0'); 

    for(int i=n-1;i>=0;i--) 

    { 

     int value=(carry+term1[i]-48+term2[i]-48)%10; 

     sum.Append(value); 

     carry=(carry+term1[i]-48+term2[i]-48)/10; 

    } 

    char[] c=sum.ToString().ToCharArray(); 

    Array.Reverse(c); 

    Console.WriteLine(c); 

} 

} 
0
public static int[] addTwoNumbers(string s1, string s2) 
    { 

     char[] num1 = s1.ToCharArray(); 
     char[] num2 = s2.ToCharArray(); 
     int sum = 0; 
     int carry = 0; 
     int size = (s1.Length > s2.Length) ? s1.Length + 1 : s2.Length + 1; 
     int[] result = new int[size]; 
     int index = size - 1; 
     int num1index = num1.Length - 1; 
     int num2index = num2.Length - 1; 


     while (true) 
     { 
      if (num1index >= 0 && num2index >= 0) 
      { 
       sum = (num1[num1index]-'0') + (num2[num2index]-'0') + carry; 
      } 
      else if(num1index< 0 && num2index >= 0) 
      { 
       sum = (num2[num2index]-'0') + carry; 
      } 
      else if (num1index >= 0 && num2index < 0) 
      { 
       sum = (num1[num1index]-'0') + carry; 
      } 
      else { break; } 


      carry = sum /10; 
      result[index] = sum % 10; 
      index--; 
      num1index--; 
      num2index--; 
     } 

      if(carry>0) 
      { 
       result[index] = carry; 
      } 


     return result; 
    } 
+0

답변 해 주셔서 감사합니다. 코드가 질문에 어떻게 대답하는지 간단한 설명을 작성해보십시오. –