Gå til innhold

ProgrammeringsBaren! Småprat, om det du elsker!


Anbefalte innlegg

Problemstilling:

Jeg har en stringarray som inneholder en rekke med tusen tall. Problemet mitt er hvordan jeg kan gjøre hver av dem om til tall slik at jeg kan gjøre matte på tallene inviduellt. Altså psudo; int haha[0] = stringarray[0]

Tingen er at atoi får jeg ikke til å funke, og (int)(array[3] = hahaaray - ansinumberbase fikk jeg ikke til å funke heller.

HÅper noen forstår hva jeg er ute etter hehe. C++.

Lenke til kommentar
Videoannonse
Annonse

Jeg begynte å skrive hvordan man kan gjøre det manuelt; men det er du vel neppe interessert i.

Atoi skal fungere, pass på at du bruker _wtoi hvis du har en unicode string

Pass også på at det kun er heltall i stringen, og at stringen lar seg konvertere til int i størrelse.

Lenke til kommentar

Hvordan kan dette gi:

#include <iostream>
#include <string>
using namespace std; 

int main()
{
string hihi = "123456789"; 
int numbs[4]; 
numbs[0] = static_cast<int>(hihi[0]); 
cout << numbs [0] << "\n";  
return 0; 
}

49 ut ? wtf

Glem det, det ble slik:

numbs[0] = static_cast<int>(hihi[0]-0x30);

 

Haha, nå får jeg segmenfault. Jeg ligger ut koden; hvis noe er åpenbart totalt feil. Yell at me!

Klikk for å se/fjerne innholdet nedenfor

#include <iostream>
#include <sstream>
#include <string>
using namespace std;
int main()
{	
// 0-999
string range = "73167176531330624919225119674426574742355349194934969835203127745063262395783180169848
186947885184385861560789112949495459501737958331952853208805511125406987471585238630507156
329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081
533627661428280644448664523874930358907296290491560440772390713810515859307960866701724271
188399879790879227492190169972088809377665727333001053367881220235421809751254540594752243
258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978
686224828397224137565705605749026140797296865241453510047482166370484403199890008895243450
585412275886668811642717147992444292823086346567481391912316282458617866458359124566529476
456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962
554443629812309878799272442849091888458015616609791913387549920052406368991256071760605886
164671094050775410022569831552000559357297257163626956188267042825248360082325753042075296
45";
int cmax = 0; 
int temp = 0; 
int numbers[4];  
for (int i = 1000; i > 0; i--)
{
numbers[0] = static_cast<int>(range[i])-0x30;
numbers[1] = static_cast<int>(range[i+1])-0x30;
numbers[2] = static_cast<int>(range[i+2])-0x30;
numbers[3] = static_cast<int>(range[i+3])-0x30;
numbers[4] = static_cast<int>(range[i+4])-0x30;
temp = numbers[0]*numbers[1]*numbers[2]*numbers[3]*numbers[4];
 if(temp > cmax)
	{
		temp = cmax; 
	}
}
cout << cmax << "\n"; 
return 0; 
}

 

Og her er oppgaven:

Klikk for å se/fjerne innholdet nedenfor

Find the greatest product of five consecutive digits in the 1000-digit number.

 

73167176531330624919225119674426574742355349194934

96983520312774506326239578318016984801869478851843

85861560789112949495459501737958331952853208805511

12540698747158523863050715693290963295227443043557

66896648950445244523161731856403098711121722383113

62229893423380308135336276614282806444486645238749

30358907296290491560440772390713810515859307960866

70172427121883998797908792274921901699720888093776

65727333001053367881220235421809751254540594752243

52584907711670556013604839586446706324415722155397

53697817977846174064955149290862569321978468622482

83972241375657056057490261407972968652414535100474

82166370484403199890008895243450658541227588666881

16427171479924442928230863465674813919123162824586

17866458359124566529476545682848912883142607690042

24219022671055626321111109370544217506941658960408

07198403850962455444362981230987879927244284909188

84580156166097919133875499200524063689912560717606

05886116467109405077541002256983155200055935729725

71636269561882670428252483600823257530420752963450

Endret av data_jepp
Lenke til kommentar

da henter du bare verdien av det første bytet? er det ikke en string da?

 

edit: dumme meg

 

edit2: så på koden... wtf? du tar jo med alle tallene fra 1 til 4 ganger... jeg skjønner ikke helt hva programmet skal gjøre...

 

string range = ...

int cmax = 1;

foreach(char c in range)
{
 cmax *= (int)(c - '0');
}

cout << cmax;

 

edit3: Du får segmentation fault fordi du begynner på 1000 + 4 (altså utenfor allokert minneområdet)

Endret av GeirGrusom
Lenke til kommentar

Find the greatest product of five consecutive digits in the 1000-digit number.

 

73167176531330624919225119674426574742355349194934

96983520312774506326239578318016984801869478851843

85861560789112949495459501737958331952853208805511

12540698747158523863050715693290963295227443043557

66896648950445244523161731856403098711121722383113

62229893423380308135336276614282806444486645238749

30358907296290491560440772390713810515859307960866

70172427121883998797908792274921901699720888093776

65727333001053367881220235421809751254540594752243

52584907711670556013604839586446706324415722155397

53697817977846174064955149290862569321978468622482

83972241375657056057490261407972968652414535100474

82166370484403199890008895243450658541227588666881

16427171479924442928230863465674813919123162824586

17866458359124566529476545682848912883142607690042

24219022671055626321111109370544217506941658960408

07198403850962455444362981230987879927244284909188

84580156166097919133875499200524063689912560717606

05886116467109405077541002256983155200055935729725

71636269561882670428252483600823257530420752963450

Lenke til kommentar

ah ok

 

her er mitt forslag :)

Klikk for å se/fjerne innholdet nedenfor

#define CVALUE(C) (C - '0')
int max;

string range = ...

int max = 0;

for(int i = 0; i < 1000; /* Do nothing, code increments counter */ )
{
  int tmp = 0;
  tmp = CVALUE(range[i++]) * CVALUE(range[i++]) * CVALUE(range[i++]) * CVALUE(range[i++]) * CVALUE(range[i++]);
  if(tmp > max)
 max = tmp;
}
std::cout << max;

 

Tror det skal fungere, har ikke testet.

 

Men ihvertfall, du får segmentation fault på grunn av at løkken starterpå 1004, istedet for 1000.

Lenke til kommentar
Svaret ble ikke godkjent på siden til projecteuler, men den ser jo riktig ut. :/ gah

YES, det funket. Vi måtte bare starte med i på -1 slik at 0 blir tatt med. Takk for hjelpen :D

Du kan jo kanskje bruke %5 før du beregner summene, så ser du hvor mange "steg forover" du kan gå.

Lenke til kommentar
Vet ikke helt hvor definert flere i++ er inni samme statement altså. Prøv heller i, i + 1, i + 2 osv.

 

edit: Ok, så det funket tydeligvis på din kompilator, men jeg tror fortsatt ikke at det er definert oppførsel i standarden.

 

http://www.eskimo.com/~scs/cclass/notes/sx7c.html

 

hmmm ja, det er sant, det tenkte jeg ikke på faktisk...

til å begynne med definerte jeg flere variabler, men fjernet det uten å tenke på at jeg også tok med i++

Endret av GeirGrusom
Lenke til kommentar

I stedet for masse en-dimensjonale arrays, er det jo ikke noe i veien for å ha en to-dimensjonal array.

 

string [,] myArray = new string[20,20];

 

edit: det var C#, ja.. :p

 

string[][] myArray = new string[20][20];

blir det vel i C++

Endret av Manfred
Lenke til kommentar

^ Nei, c++ er ikke java. Det blir int arr[20][20]; Evt int **arr = new *int[row]; for (int i = 0; i < row; i++) arr = new int[col]; hvis du vil lage de dynamisk.

 

Hvis du har en endimensjonal array så blir indexen endimensjonalarray[y * row + x]

Endret av teflonpanne
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...