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.

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