2012-05-08 4 views
4

У меня возникли некоторые проблемы на веб-сайте Project Euler и вы столкнулись с проблемой. Вопрос спрашивает: «Выработайте первые десять цифр суммы из следующих ста пятидесятизначных чисел». Я предполагаю, что есть математический способ решить эту проблему, но мне просто интересно, как суммируются эти цифры? Я храню номер в виде строки и конвертирую каждую цифру в длинную, но число настолько велико, что сумма не работает.Суммирование больших чисел

Есть ли способ удерживать очень большие числа в качестве переменной (это не строка)? Я не хочу, чтобы код проблемы, как я хочу решить это для себя.

+2

Вы пробовали массив? –

+0

Я использовал 'std :: deque ' в моей реализации больших целых чисел – calccrypto

+0

Я не пробовал один из них, но будет ли он работать, чтобы суммировать число? Он мог их удержать, но мне нужно их суммировать. –

ответ

5

Мне просто интересно, как числятся эти большие суммы?

Вы можете использовать массив:

long LargeNumber[5] = { < first_10_digits>, < next_10_digits>....< last_10_digits> }; 

Теперь вы можете вычислить сумму 2 больших чисел:

long tempSum = 0; 
    int carry = 0; 
    long sum[5] = {0,0,0,0,0}; 

    for(int i = 4; i >= 0; i--) 
    { 
    tempSum = largeNum1[i] + largeNum2[i] + carry; //sum of 10 digits 

    if(i == 0) 
     sum[i] = tempSum; //No carry in case of most significant digit 
    else 
     sum[i] = tempSum % 1000000000; //Extra digits to be 'carried over' 

    carry = tempSum/1000000000; 
    } 

    for(int i = 0; i < 5; i++) 
    cout<<setw(10)<<setfill('0')<<sum[i]<<"\n"; //Pad with '0' on the left if needed 

Есть ли способ держать очень большие числа как переменная (это не строка )?

Там нет примитива для этого, вы можете использовать любую структуру данных (массивы/Очередь/LinkedList) и обработать его соответствующим образом

Я предполагаю, что есть некоторый математический способ решить эту

Конечно! Но,

Я не хочу, чтобы код проблемы, как я хочу решить это для себя.

+0

Когда я решил эту проблему (используя python), я сохранил только первые 10-15 числа и отбросил остальных. –

1

Вы можете хранить цифры в массиве. Чтобы сэкономить место и увеличить производительность в операциях, сохраните цифры номера в базе 10^9. поэтому число +182983198432847829347802092190 будет представлена ​​в следующем виде в массиве

обр [0] = 2092190 обр [1] = 78293478 обр [2] = 19843284 обр [3] = 182983

только ради ясности число представлено в виде суммирования arr [i] * (10^9i) теперь начинаем с i = 0 и начинаем добавлять числа так, как вы учились в детстве.

0
#include<iostream> 
#include<fstream> 
#include<sstream> 
using namespace std; 

struct grid{ 
    int num[50]; 
}; 

int main() 
{ 
    struct grid obj[100]; 
    char ch; 
    ifstream myfile ("numbers.txt"); 
    if (myfile.is_open()) 
    { 
     for(int r=0; r<100; r++) 
     { 
      for(int c=0; c<50; c++) 
      { 
       myfile >> ch; 
       obj[r].num[c] = ch - '0'; 
      } 
     } 
     myfile.close(); 
     int result[50],temp_sum = 0; 
     for (int c = 49; c>=0; c--) 
     { 
      for (int r=0; r<100; r++) 
      { 
       temp_sum += obj[r].num[c]; 
      } 
      result[c] = temp_sum%10; 
      temp_sum = temp_sum/10; 
     } 
     string temp; 
     ostringstream convert; 
     convert << temp_sum; 
     temp = convert.str(); 
     cout << temp_sum; 
     for(unsigned int count = 0; count < (10 - temp.length()); count++) 
     { 
      cout << result[count]; 
     } 
     cout << endl; 
    } 
    return 0; 
} 
0

Это самый лучший способ для вашего времени и объема памяти: D

#include <iostream > 
#include <climits > 

using namespace std; 

int main() 
{ 
    unsigned long long z; 

    cin >>z; 

    z=z*(z+1)/2; 

    C out << z; 

    return 0; 
} 
+0

это также работает, если вы хотите суммировать диапазон между 1 на вход от пользователя til 10^13 , если u хотите больше 10^13 .... u может изменить беззнаковое длинное длинное и длинное двойное: D –

+0

Является ли unsigned long long собирается хранить 50-значные цифры? Вы это проверили? – Mishax

1

я делал в Java, вот я беру с номерами N1 и N2, и я создать массив размера 1000. Давайте возьмем пример Как решить это, N1 = 12, N2 = 1234. Для N1 = 12, temp = N1% 10 = 2. Теперь добавьте эту цифру с цифрой N2 справа налево и сохраните результат в массиве, начиная с i = 0, аналогично для цифры покоя N1. Массив сохранит результат, но в обратном порядке. Посмотрите на эту ссылку.Проверьте эту ссылку http://ideone.com/V5knEd

import java.util.*; 
import java.lang.*; 
import java.io.*; 

/* Name of the class has to be "Main" only if the class is public. */ 
class Ideone 
{ 
    public static void main (String[] args) throws java.lang.Exception { 
     Scanner scan=new Scanner(System.in); 
     int A=scan.nextInt(); 
     int B=scan.nextInt(); 
     int [] array=new int[1000]; 
     Arrays.fill(array,0); 
     int size=add(A,B,array); 
     for(int i=size-1;i>=0;i--){ 
      System.out.print(array[i]); 
     } 
    } 
    public static int add(int A, int B, int [] array){ 
     int carry=0; 
     int i=0; 
     while(A>0 || B>0){ 
      int sum=A%10+B%10+carry+array[i]; 
      array[i]=sum%10; 
      carry=sum/10; 
      A=A/10; 
      B=B/10; 
      i++; 
     } 
     while(carry>0){ 
      array[i]=array[i]+carry%10; 
      carry=carry/10; 
      i++; 
     } 
     return i; 
    } 
} 
Смежные вопросы