C/C++

Член од
25 јануари 2009
Мислења
45
Поени од реакции
2
1.Да се напише рекурзивна ф-ја за добивање на број запишан со истите цифри но во обратен редослед???
и

2.Да се напише рек. ф-ја која за примен цел број н помал од 80 на екран ќе
печати број кој почнува со точно н единици и има 0 на крај. Пр. n=4 излезот е 11110

:rolleyes:
 
M

Mr.InF3ction

Гостин
SEASOUL92 За втората не знам зошто рекурзивно..али ај:
PHP:
#include <iostream>
 
usingnamespacestd;
 
int funk1(int broj, int pom = 0)
{
    if(broj <= 0 )
        return pom;
   
    return (funk1(broj/10, pom = pom * 10 + broj %10 ));
}
 
int funk2(int n){
    if ( n >= 80 ||  n < 0 )
        return -1;
   
    if(n > 0)
        cout << 1;
    else
        cout << 0;
   
    return funk2(--n);
}
 
int main(int argc, const char * argv[])
{
    cout << funk1(54321) << endl;
    funk2(5);
 
}
Печати на екран:
 
Член од
5 јануари 2008
Мислења
2.806
Поени од реакции
3.062
Да се напише програма што ќе ги испечати сите прости броеви помали од 10000 чиј што збир на цифри е исто така прост број. На крајот да се отпечати колку вакви броеви биле пронајдени.

Е сега јас воопшто не ни го гледам решението во скриптата.
И како и обично ги решавам на мој начин.

Е сега .. тоа што го напишав ми јавува грешка во последната заграда на втората функција (со функции треба да го решам).
И не гледам зошто ми ја јавува таа грешка односно не компајлира.

Помош...

PHP:
#include<stdio.h>
int prost(int n);
int zbir(int n);
int main()
{
    int br=0,i;
    printf("Prostite broevi cij zbir na cifri e prost se :  \n");
    for(i=2;i<10000;i++)
    {
                        if(prost(i) && prost(zbir(i)))
                        {
                        printf("brojot %d so zbir %d\n",i,zbir(prost(i)));
                        br++;
                        }
}
                        printf("i gi ima %d takvi broevi \n",br);
    system("pause");
    return 0;
}
int prost(int n)
{
    int j=2;
    while(j<n)
    {
              if(n%j==0)
              return 0;
    j++;
}
return n;
}
 
int zbir(int n)
{
    int s,c;
    s=0;
    while(n>0)
    {
              c=n%10;
              s+=c;
              n/=10;
}
return s;
}



МИ УСПЕА СУМ ЗАБОРАВИЛ ДА ГО ЗАТВОРАМ FOR ЦИКЛУСОТ СО ЗАГРАДА :facepalm:


работи!!! :D
--- надополнето: 27 јули 2012 во 15:31 ---
A во скрипта ја решиле 3494 пати поглупо и комплексно, дури ни збирот не може да се прочита -.-.

PHP:
#include<stdio.h>
int prost(int n);
int zbir(int n);
int main()
{
    int br=0,i;
    printf("Prostite broevi cij zbir na cifri e prost se :  \n");
    for(i=1;i<=9999;i++)
    {
                         if(prost(i) && prost(zbir(i)))
                         {
                         printf("brojot %d  \n",i);
                         br++;
                         }
                         }
                         printf("i gi ima %d takvi broevi \n",br);
                         
    system("pause");
    return 0;
}
int prost(int n)
{
int i,prost;
if(n<4) 
prost=1;
 
else 
         if(n%2==0) 
          prost=0;
else
{
    i=3;
    prost=1;
    while((i*i<=n) && prost)
    {
                   if(n%i==0) 
                   prost=0;
                   i+=2;
                   }
}
return prost;
}
 
 
int zbir(int n)
{
    int s,c;
    s=0;
    while(n>0)
    {
              c=n%10;
              s+=c;
              n/=10;
}
return s;
}
 
M

Mr.InF3ction

Гостин
Out Of Reality
Инаку мала оптимизација за прост број не мора j да иде до н туку до пола..пр ако тестираш за 5 нема потреба да провериш дали 3,4 % 5 == 0 знаеш дека не е :)
 
Член од
5 јануари 2008
Мислења
2.806
Поени од реакции
3.062
Да се напише програма што ќе ги отпечати сите парови прости броеви што се разликуваат меѓу себе за 2. На крај да се отпечати и нивниот број.

Според мене:

PHP:
#include<stdio.h>
int prost(int n);
int raz(int n,int j);
int main()
{
    int i,j,br=0;
    printf("toa se parovite :\n");
    for(i=1;i<1000;i++)
    for(j=1;j<1000;j++)
    {
                      if (raz(i,j)==2)
                      {
                      printf("%d i %d\n",i,j);
                      br++;
                      }
                      }
                      printf("ima vkupno %d parovi\n", br); /* br/2 zatao sto pr 569 i 571 so 571 i 569 gi racina kako dva para*/
    system("pause");
    return 0;
}
int prost(int n)
{
    int t=2;
    while(t<n)
    {
              if(n%t==0)
              return 0;
    t++;
}
    return n;
}
int raz(int n,int j)
{
    int s;
    if (prost(n) && prost(j))
    {
    s=prost(n)-prost(j);
}
    if (s<0)
    {
}
 
return s;
}


A според решението во скриптата :


PHP:
#include<stdio.h>
int prost(int n);
int main()
{
    int br=0,i;
    for(i=1;i<=(1000-2); i++)
    {
                        if(prost(i) && prost(i+2))
                        {
                                    printf(" %d i %d \n",i,i+2);
                                    br++;
                                    }
}
  printf("ima vkupno %d takvi broevi \n",br);
  system("pause");
  return 0;
}
int prost(int n)
{
    int i;
    if (n<4)
    return 1;
    else
          if(n%2==0)
          return 0;
    else
    {
        i=3;
        while (i*i<=n)
        {
              if (n%i==0)
              return 0;
              i+=2;
              }
              }
              return 1;
              }
истиот резултат се добива.. .

Ако може некој да ми објасни зошто проверуваат прост број вака...

PHP:
int prost(int n)
{
int i,prost;
if(n<4)
prost=1;
else if (n%2==0)
prost=0;
else
{
    i=3;
    prost=1;
    while((i*i<=0) && prost)
    {
                  if(n%i==0)
                  prost=0;
                  i+=2;
                  }
}
return prost;
}
кога може како мене ... многу по лесно ..
PHP:
int prost(int n)
{
    int j=2;
    while(j<n)
    {
              if(n%j==0)
              return 0;
    j++;
}
return n;
}

истото го направиле и со втората задача што ја постирав во овој коментар.
--- надополнето: 27 јули 2012 во 17:00 ---
Out Of Reality
Инаку мала оптимизација за прост број не мора j да иде до н туку до пола..пр ако тестираш за 5 нема потреба да провериш дали 3,4 % 5 == 0 знаеш дека не е :)

да јасно ми е тоа, ама сепак истиот резултат го дава.

Но мене ме буни тоа како "тие" проверуваат прост број во двете задачи. Зошто на тој начин?

и не го сфаќам тоа while((i*i<=0) односно зошто i*i ?
 
M

Mr.InF3ction

Гостин
Тоа ти е математика. Не сум баш добар со тоа да ти објаснувам но види низ гугл алгоритми за наоѓање на прост број ќе видиш уште почудни примери и пресметување..а сепак се подобри и побрзи.
i*i < 0 е грешка треба да е од N. Пошто нели i почнува од 2 и тој услов никогаш нема да се исполни.
Дебагирај ја таа функција и види како работи следи како наоѓа прост број и ќе сфатиш.
 
Член од
10 јули 2012
Мислења
87
Поени од реакции
54
Out Of Reality
Инаку мала оптимизација за прост број не мора j да иде до н туку до пола..пр ако тестираш за 5 нема потреба да провериш дали 3,4 % 5 == 0 знаеш дека не е :)
Уште малку оптимизација: :) за големи n и воопшто, најдобро е да се проверува до корен от n.
--- надополнето: 27 јули 2012 во 19:38 ---
Ако може некој да ми објасни зошто проверуваат прост број вака...

PHP:
int prost(int n)
{
int i,prost;
if(n<4)
prost=1;
else if (n%2==0)
prost=0;
else
{
    i=3;
    prost=1;
    while((i*i<=0) && prost)
    {
                  if(n%i==0)
                  prost=0;
                  i+=2;
                  }
}
return prost;
}

Но мене ме буни тоа како "тие" проверуваат прост број во двете задачи. Зошто на тој начин?

и не го сфаќам тоа while((i*i<=0) односно зошто i*i ?
Сигурен си дека проверката во циклусот е (i*i<=0) ? Зошто ако е така за ниту еден број проверката нема да помине и добиваш true за одговор, а целата функција проверува дали бројот е непарен. (Пробај со не-парен, не-прост број, на пример 9 и според мене би требало да добиеш одговор дека е прост број). Според мене, проверката треба да е (i*i <= n), или i да се инкрементира не повеќе од корен од n. ( i*i <= n можеш да го запишеш како i <= sqrt( n ) но бидејќи i ти е цел број sqrt( n ) нема да работи итн инт... Така да (i*i <= n) е најдобрата проверка во случајов). Иначе функцијата си е супер :)
 
Член од
5 јануари 2008
Мислења
2.806
Поени од реакции
3.062
Уште малку оптимизација: :) за големи n и воопшто, најдобро е да се проверува до корен от n.
--- надополнето: 27 јули 2012 во 19:38 ---


Сигурен си дека проверката во циклусот е (i*i<=0) ? Зошто ако е така за ниту еден број проверката нема да помине и добиваш true за одговор, а целата функција проверува дали бројот е парен. (Пробај со не-парен, не-прост број, на пример 9 и според мене би требало да добиеш одговор дека е прост број). Според мене, проверката треба да е (i*i <= n), или i да се инкрементира не повеќе од корен од n. ( i*i <= 0 можеш да го запишеш како i <= sqrt( n ) но бидејќи i ти е цел број sqrt( n ) нема да работи итн инт... Така да (i*i <= n) е најдобрата проверка во случајов). Иначе функцијата си е супер :)

погрешно ми е напишано дека е нула. i*i<=n. во право сте.
Прееска заборавив да го поправам кога го пишував кодот.
 
Член од
5 јануари 2008
Мислења
2.806
Поени од реакции
3.062
Да се нашише рекурзивна функција која ќе пресметува најголем заеднички делител на два дадени броеви.

Е задачава вака е решена во скриптата.
Алгоритмот за NZD мене ми се чини дека е супер, затоа што го проверив рачно и би требало да даде точно решение.

Но.. не дава на пример внесувам два броја 24 и 18 и nzd место 6 ми дава 16.

Во решението на скриптата можно е да има грешки затоа што.. во main() на крај фали return 0; (се разбира јас во мојот код поправив) и во скриптата има еден ред што нема врска а тоа е ..

float x0=1.0, x1=2.0;

Еве го кодот .. вака е во скрипта.

PHP:
#include<stdio.h>
int nzd(int i,int j);
int main()
{
    int n,m;
    float x0=1.0, x1=2.0;
    printf("vnesi dva broja : \n");
    scanf("%d%d",&n,&m);
    printf("nzd na dvata broja %d i %d e %d ",n,m,nzd(n,m));
  system("pause");
  return 0;
}
int nzd(int i,int j)
{
    int vrednost;
    if(i!=j)
      if(i<j)
    vrednost=nzd(j-i,i);
    else
    vrednost=nzd(i-j,j);
    return vrednost;
}

кај функцијата нзд ставив и загради после првото if пак исто дава.

помош ?
 
M

Mr.InF3ction

Гостин
Некако од таа збирка многу комплицираат :)
Мој совет заеби тоа воопшто не ни гледај како се решени, туку обиди се сам да решиш, може ќе се измачиш малку но ќе научиш да мислиш подобро околу проблемите...
PHP:
int nzd(int i, int j) {
  if(i == j)
      return i;
  else if (i > j)
      return nzd(i-j, j);
  else
      return nzd(i, j-i);
}
 
Член од
5 јануари 2008
Мислења
2.806
Поени од реакции
3.062
Некако од таа збирка многу комплицираат :)
Мој совет заеби тоа воопшто не ни гледај како се решени, туку обиди се сам да решиш, може ќе се измачиш малку но ќе научиш да мислиш подобро околу проблемите...
PHP:
int nzd(int i, int j) {
  if(i == j)
      return i;
  else if (i > j)
      return nzd(i-j, j);
  else
      return nzd(i, j-i);
}
Фала многу, деновиве го учам C , па може да замарам малку повеќе(ко имам нешто не јасно ќе биде пишано тука.), па кој може ако има слободно време и воља, може да ми помогне тоа што знае :)
 
Член од
5 јануари 2008
Мислења
2.806
Поени од реакции
3.062
Ужасно ме нервира што нејќе да се уклучи кодот!

Ја сфатив задачата. Но нешто нејќе да ги прикаже броевите.
Дали има грешка во кодот. Задачата гласи вака.

1)
Да се напише програма која ќе ги отпечати сите природни броеви помали од
10000 кои го имаат следното својство: карактеристичната збир цифра и
карактеристичната производ цифра им се исти. Карактеристична збир цифра за
даден број се добива кога ќе се соберат цифрите на дадениот број. Ако при ова се
добие повеќецифрен број, постапката се повторува (повторно се собираат
цифрите на новодобиениот број), сé додека не се добие едноцифрен број.
Карактеристична производ цифра за даден број се добива кога ќе се помножат
цифрите на дадениот број. Ако се добие повеќецифрен број, постапката се
повторува (повторно се множат цифрите на новодобиениот број), сé додека не се
добие едноцифрен број.
Пример: 22 → 2+2=4=2*2
726 → 7+2+6=15 → 1+5=6
7*2*6=84 → 8*4=32 → 3*2=6

Кодот во скриптата изгледа вака.

PHP:
#include<stdio.h>
int kzcif(int x);
int kcifra1(int x);
int kpcif(int x);
int kcifra2(int x);
void main()
{
int b=0,i;
for(i=1;i<=9999;i++)
if (kcifra1(i)==kcifra2(i))
{
printf("%d\n",i);
b++;
}
printf("Vkupno: %d",b);
getchar();
}
int kzcif(int x)
{ int kcif;
if (x<=9) kcif=x;
else kcif=(x%10)+kzcif(x/10);
return kcif;
}
int kcifra1(int x)
{ int kcifra,s;
s=kzcif(x);
if (s<=9) kcifra=s;
else kcifra=kcifra1(s);
return kcifra;
}
int kpcif(int x)
{ int kcif;
if (x<=9) kcif=x;
else kcif=(x%10)*kpcif(x/10);
return kcif;
}
int kcifra2(int x)
{ int kcifra,p;
p=kpcif(x);
if (p<=9) kcifra=p;
else kcifra=kcifra2(p);
return kcifra;
}
При што истиот нејќе да се компајлира. Односно.
C:\Dev-Cpp\daadad.c In function `main':
7 C:\Dev-Cpp\daadad.c [Warning] return type of 'main' is not `int'

Изгледа прави проблеми тоа Void main() , i getchar() na kraj.

па јас кодот си го преформулирав со мои термини, за полесен привид и со int main, i return на крај.
и .. го компајлира овој пат без пронајдени грешки, но нејќе да го уклучи односно тоа трае една милисекунда и се гаси.

Кодот појасен изгледа вака.

PHP:
#include<stdio.h>
int suma(int x);
int scifra(int x);
int proz(int x);
int pcifra(int x);
 
int main()
{
    int i,br=0;
    printf("Broevi so ednakvi karakteristicni cifri na suma i proz : \n\n");
    for(i=1;i<=9999;i++)
    {
                        if(scifra(i)==pcifra(i))
                        {
                                                printf("%d \n");
                                                br++;
                        }
}
printf("Ima vkupno %d takvi broevi \n\n");
system("pause");
return 0;
}
int suma(int x)
{
    int zbir;
    if(x<=9)
    zbir=x;
    else
    zbir=(x%10)+suma(x/10);
    return zbir;
}
int scifra(int x)
{
    int cifra,s;
    s=suma(x);
    if(x<10)
    cifra=s;
    else
    cifra=scifra(x);
    return cifra;
}
int proz(int x)
{
    int prez;
    if(x<10)
    prez=x;
    else
    prez=(x%10)*proz(x/10);
    return prez;
}
int pcifra(int x)
{
    int cifra,s;
    s=proz(x);
    if(x<10)
    cifra=s;
    else cifra=pcifra(x);
    return cifra;
}
некој знае зошто не работи ?
--- надополнето: 29 јули 2012 во 13:54 ---
Прва година гимназија. :(
која е таа гимназија бе, ние у прва Office учевме o_O
--- надополнето: 29 јули 2012 во 14:11 ---
офффффффффффффф


Ги најдов грешките...

Место cifra=scifra(s) jas cifra=scifra(x).

и други такви глупи грешки.

Еве го точниот код.
PHP:
#include<stdio.h>
int suma(int x);
int scifra(int x);
int proz(int x);
int pcifra(int x);
 
int main()
{
    int i,br=0;
    printf("Broevi so ednakvi karakteristicni cifri na suma i proz : \n\n");
    for(i=1;i<=9999;i++)
    {
                        if(scifra(i)==pcifra(i))
                        {
                                                printf("%d \n",i);
                                                br++;
                        }
}
printf("Ima vkupno %d takvi broevi \n\n",br);
system("pause");
return 0;
}
int suma(int x)
{
    int zbir;
    if(x<=9)
    zbir=x;
    else
    zbir=(x%10)+suma(x/10);
    return zbir;
}
int scifra(int x)
{
    int cifra,s;
    s=suma(x);
    if(x<10)
    cifra=s;
    else
    cifra=scifra(s);
    return cifra;
}
int proz(int x)
{
    int prez;
    if(x<10)
    prez=x;
    else
    prez=(x%10)*proz(x/10);
    return prez;
}
int pcifra(int x)
{
    int cifra,s;
    s=proz(x);
    if(x<10)
    cifra=s;
    else cifra=pcifra(s);
    return cifra;
}
 
Член од
5 јануари 2008
Мислења
2.806
Поени од реакции
3.062
Ми текна да направам програма за Внесени два бинарни броеви, и внесен оператор (+) или (-) , тие да се соберат или да се одземат.

Е сега, ја направив доста посложена програмата.. за да се извежбам.

... ФИНТАТА Е ... функцијата од ДЕКАДЕН во БИНАРЕН што ми претвора на крај ИМА ГРАТИС нула.
Односно бинарниот број што се добива има една нула плус на десно.

може некој да ми каже што не е во ред со функцијата???

Еве го мојот изум :icon_lol: слободно може да си играте :pipi:
пробајте на пример со:
+
1111
1011
(за да не се замарате со целиот тој код.. погледнете ја само последната функција во нејзе мора да е проблемот - претворање од декаден во бинарен)

PHP:
#include<stdio.h>
int prov(int x);
int stepen(int o,int x);
int broj(int x);
long int bin(int x);
int main()
{
    int t=0,s;
    long int n,m;
    char c;
    printf("Vnesi operator + ili - : \n");
    scanf("%c",&c);
    do
    {
    printf("vnesi  dva binarni broevi : \n");
    scanf("%d",&n);
    scanf("%d",&m);
            }
  while(prov(n) && prov(m));
                   
                            if(c=='+')
                            {
                            s=broj(n)+broj(m);
                            printf("binarniot %d = %d dekadno, binarniot  %d = %d dekadno i nivniot (%c) iznesuva %d dekadno ili binarno %d \n",n,broj(n),m,broj(m),c,s,bin(s));
                            }
                            else if (c=='-')
                            {
                            s=broj(n)-broj(m);
                            printf("binarniot %d = %d , %d = %d i nivniot (%c) iznesuva %d ili binarno %d \n",n,broj(n),m,broj(m),c,s,bin(s));
                            }
                            else printf("pogresen operator \n");
                                           
    system("pause");
    return 0;
}
                   
                   
                   
int prov(int x)
{
    int z;
    while(x>0)
    {
    z=x%10;
    if(z!=1 || z!=0)
    return 0;
    x/=10;
    }
    return 1;
    }
int broj(int x)
{
    int broj,r,c;                     
broj=0;
r=1;
while(x>0)
{
          c=x%10;
          if(c!=0)
          broj+=stepen(2,r);
          r++;
          x/=10;
}
return broj;
}
int stepen(int o,int x)
{
    int i,st=1;
    for(i=1;i<=x;i++)
    st*=o;
    return st;
          }
long int bin(int x)
{
    int poz,bin1,p,pom;
    poz=1;
    bin1=0;
    while (x>0)
    {
          p=x%2;
          bin1+=p*poz;
          poz*=10;
          x/=2;
          }
          return bin1;
          }
некој ?
 

Kajgana Shop

На врв Bottom