c tablica jednowymiarowa

0

Mam napisac program, ktory znajdzie mi taka liczbe w tablicy, ktorej suma liczb po jej lewej stronie bedzie rowna sumie liczb po jej prawej stronie. jezeli po lewej lub po prawej stronie nie ma zadnej liczby to trzeba ta strone przyjac jako zero. ewentualnie jakis komunikat jezeli takowej liczby nie bedzie. moglby mi to ktos poprawic?

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    
int n;
printf ("podaj wielkosc tablicy :");
scanf ("%d",&n); // podaj n
int arr[n];
printf ("podaj liczby do tablicy");
 // wypełnij tablicę arr liczbami
int ps[n], ss[n]; // ps - prefix-sum, ss - sufix-sum
int i;
ps[0] = 0;
ss[n-1] = 0;
for (i=1; i<n; i++)scanf ("%d",&arr[i]);{
  ps[i] = ps[i-1] + arr[i-1];
  ss[n-1-i] = ss[n-i] + arr[n-i];
}
int index = -1;
for (i=0; i<n; i++){
  if (ps[i] == ss[i]) index = i;
}
if (index == -1) // nie ma takiej liczby 
{
printf ("nie ma takiej liczby");
}
else
{
printf ("arr[index]");    
    } // wypisz arr[index]
    


system("PAUSE");   
return 0;
}
0

Nie rozumiem twojej idei. Algorytm naiwny sumuje wszystko w tablicy a potem leci po kolei odejmując liczby aż znajdzie punkt podziału. Twój algorytm nie wiem co robi bo nazwy twoich zmiennych są bez sensu. Nie dało się ich nazwać normalnie?

0

masz tablicę arr o wymiarze n wypełnioną liczbami
dajmy na ten przykład takie dane:
n = 5
arr = [7,4,5,0,2]
tworzymy tablicę ps i jej pierwszy element zerujemy:
ps = [0, , , , ]
oraz ss z ostatnim zerowym:
ss = [ , , , ,0]
teraz chodzi o to, że ps[i] to suma wszystkiego co jest przed arr[i]
czyli przed pierwszym elementem jest 0 (z treści zadania)
analogicznie z sumą ss za ostatnim
teraz mamy pętlę po i od 1 do n-1 włącznie
i rozpisujemy jej obroty:
i=1:
ps[1] = ps[0] + arr[0]; czyli na ps[1] przypisz poprzedni ps i dopisz wartość z tablicy, na ps[1] będzie 0+7 = 7 czyli suma wszystkiego przed arr[1]
analogicznie
ss[5-1-1] = ss[5-1] + arr[5-1] czyli na ss[3] (przedostatni) przypisz ss[4] (ostatni) + wartość ostatniego z tablicy
i = 2:
ps[2] = ps[1] + arr[1] czyli ps[2] = 7+4 = 11
ss[5-2-1] = ss[5-2] + arr[5-2] czyli ss[2] = 2 + 0 (ss[3] + arr[3])

int n;
// podaj n
int arr[n];
// wypełnij tablicę arr liczbami
int ps[n], ss[n]; // ps - prefix-sum, ss - sufix-sum
int i;
ps[0] = 0;
ss[n-1] = 0;
for (i=1; i<n; i++){
  ps[i] = ps[i-1] + arr[i-1];
  ss[n-1-i] = ss[n-i] + arr[n-i];
}
int index = -1;
for (i=0; i<n; i++){
  index = ps[i] == ss[i] ? i : index;
}
if (index == -1) nie ma takiej liczby 
else wypisz arr[index]

kod wygladal w ten sposob. mialem tylko wstawic wczytywanie danych printfy itd. ale nie moge sb z tym poradzic. w pierwszym poscie jest moja nieudolna proba wczytywania danych

1
for (i=1; i<n; i++) scanf ("%d",&arr[i]); {
    ps[i] = ps[i-1] + arr[i-1];
    ss[n-1-i] = ss[n-i] + arr[n-i];
}

Dodając scanf tutaj zepsułeś całą pętlę. Powyższy kod jest równoważny:

for (i=1; i<n; i++) 
    scanf ("%d",&arr[i]); 

ps[i] = ps[i-1] + arr[i-1];
ss[n-1-i] = ss[n-i] + arr[n-i];

Dodaj osobną pętlę do wczytywania:

for (i = 0; i < n; ++i)
    scanf("%d", &arr[i]);

for (i=1; i<n; i++) {
    ps[i] = ps[i-1] + arr[i-1];
    ss[n-1-i] = ss[n-i] + arr[n-i];
}
1
#include <stdio.h>
#include <stdlib.h>
 
int main()
  {
   unsigned n;
   printf ("podaj wielkosc tablicy :");
   scanf ("%u",&n); // podaj n
   int *arr=(int*)malloc(n*sizeof(int));
   printf ("podaj liczby do tablicy:\n");
   int i,sum=0,half=0,value;
   for(i=0;i<n;sum+=arr[i++]) scanf ("%d",&arr[i]);
   for(i=0;(i<n)&&(half<sum);half+=value,sum-=value,++i) value=arr[i];
   if(half==sum) printf("sum(0..%d)=sum(%d..%d)=%d\n",i-1,i,n-1,half);
   else printf("nie ma takiej liczby\n");
   //system("PAUSE"); // zamiast bawić się w te rzeczy zamień IDE na jakieś z tego tysiąclecia.
   return 0;
  }
0

_13th_Dragon czemu n bedzie unsigned?
twonek czy to juz jest caly poprawny kod, czy cos jeszcze musialbym tu dopisac?

0

Zmień, odpal, sprawdź. Nie odpaliłem tego, więc nie wiem czy to wszystko.

0

_13th_Dragon dalem wielkosc tablicy 4 i wpisalem liczby 1,2,3,4. powinno wyskoczyc nie ma takiej, bo 0!=10, 1!=9, 3!=4, 6!=0 oraz 10!=0. w programie wyskakuje: sum(0..2)=sum(3..3)=6. kompletnie nie rozumiem o co tu chodzi

0

twonek po podaniu drugiej liczby wyskakuje mi ze nie ma takiej liczby niezaleznie od tego jaka bedzie jej wielkosc

#include <stdio.h>
#include <stdlib.h>
 
int main(int argc, char *argv[]){
	
	int n;
printf ("podaj wielkosc tablicy :");
scanf ("%d",&n); // podaj n
int arr[n];
printf ("podaj liczby do tablicy");
 // wypełnij tablicę arr liczbami
int ps[n], ss[n]; // ps - prefix-sum, ss - sufix-sum
int i;
ps[0] = 0;
ss[n-1] = 0;
for (i=1; i<n; i++);{
	scanf("%d",&arr[i]);
  ps[i] = ps[i-1] + arr[i-1];
  ss[n-1-i] = ss[n-i] + arr[n-i];
}
int index = -1;
for (i=0; i<n; i++);
 scanf("%d", &arr[i]);
 for (i=1; i<n; i++) {
    ps[i] = ps[i-1] + arr[i-1];
    ss[n-1-i] = ss[n-i] + arr[n-i];
}
{
  if (ps[i] == ss[i]) index = i;
}
if (index == -1) // nie ma takiej liczby 
{
printf ("nie ma takiej liczby");
}
else
{
printf ("arr[index]");    
    } // wypisz arr[index]
	
 
system("PAUSE");   
return 0;
}
0

Bo Twój kod ma się do mojego kodu jak świnka do świnki morskiej.
BTW polecam kod wrzucić tutaj: http://format.krzaq.cc/ to pewne błędy od razu zauważysz.

0

bardzo prosze o wyrozumialosc. dopiero co zaczalem sie uczyc a tu juz kolokwium. ciezko jest mi pogodzic nawet tryb zaoczny z praca, a znalezc czas na nauke jeszcze trudniej.
za glupie pytania z gory przepraszam. _13th_Dragon skopiowalem Twoj kod skompilowal sie ale np przy wielkosci tablicy 5 i liczbach 1,2,3,3,0 krzyczy ze nie ma takiej liczby a powinien podac ta srodkowa trojke bo sumy liczb po jej lewej oraz prawej stronie sa takie same. 0+1+2=3 i 3+0+0=3

0
jabluszko napisał(a):

... przy wielkosci tablicy 5 i liczbach 1,2,3,3,0 krzyczy ze nie ma takiej liczby a powinien podac ta srodkowa trojke bo sumy liczb po jej lewej oraz prawej stronie sa takie same. 0+1+2=3 i 3+0+0=3

że niby jak?
Skoro chcesz wynik: 0+1+2 3+0+0
To podaj liczby: 0 1 2 3 0 0

1
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char* argv[])
{
    int n;
    printf("podaj wielkosc tablicy :");
    scanf("%d", &n); // podaj n
    int arr[n];
    printf("podaj liczby do tablicy");
    // wypełnij tablicę arr liczbami
    int ps[n], ss[n]; // ps - prefix-sum, ss - sufix-sum
    int i;
    ps[0] = 0;
    ss[n - 1] = 0;
    for (i = 0; i < n; ++i)
        scanf("%d", &arr[i]);
    for (i = 1; i < n; i++) {
        ps[i] = ps[i - 1] + arr[i - 1];
        ss[n - 1 - i] = ss[n - i] + arr[n - i];
    }
    int index = -1;
    for (i = 0; i < n; i++) {
        if (ps[i] == ss[i])
            index = i;
    }
    if (index == -1) // nie ma takiej liczby
    {
        printf("nie ma takiej liczby");
    } else {
        printf("%d\n", arr[index]);
    } // wypisz arr[index]

    return 0;
}
0

od 17:00 odswiezam i mysle - mieli mnie juz dosc. przed chwila zauwazylem druga strone tematu..

0

_13th_Dragon chyba sie nie rozumiemy. jezeli wybralem wielkosc dla tablicy rowna 5 i podalem w niej liczby 1,2,3,3,0 to tak naprawde mam miec ich 7, a nie 5. na lewno od indeksu 0 powinienem miec liczbe 0 i na prawo od ostatniego indeksu rowniez 0. i teraz program ma sposrod tych 5 liczb przeleciec po kazdej i zsumowac oraz porownac liczby po jej lewej, i prawej stronie. podaje na powyzszym przykladzie:
sprawdzam indeks 0 czyli liczbe 1. po jej lewej nie mam nic czyli Lewa strona = 0. sprawdzam Prawą stronę 2+3+3+0+(to zero, ktore jest na prawo od ostatniego indeksu)=8, L!=P.
sprawdzam indeks 1 czyli liczbe 2. po jej lewej mam 0+1=1. prawa strona 3+3+0+0=6. L!=P. sprawdzam dalej.
sprawdzam indeks 2 czyli liczbe 3. lewa strona 0+1+2=3. prawa strona 3+0+0=3. L=P - wiec wyswietla mi liczbe z indeksu 2 czyli 3, bo suma liczb po jej lewej i prawej stronie jest sobie rowna.

0

Fakt, nie rozumiemy się, bo ja myślałem że chodzi o:

jabluszko napisał(a):

... suma liczb po jej lewej stronie bedzie rowna sumie liczb po jej prawej stronie ...
a dla podanego przez ciebie ciągu brak takiego indeksu dzielącego tablice na pół.

1 użytkowników online, w tym zalogowanych: 0, gości: 1