Programare C

Intrebari despre limbajul C++, standardul C++, STL, OOP in C++ sau alte subiecte nelegate de VisualC++
Post Reply
mircea2011
Junior
Junior
Posts: 27
Joined: 11 Aug 2011, 23:12
Judet: Olt

Programare C

Post by mircea2011 » 11 Aug 2011, 23:22

Salut.
Stiu ca este un site dedicat programarii in c++, dar cer ajutor pentru programe in C, program din care a derivat C++.
Multumesc.

1. Printre numerele mai mici sau egale cu un numar intreg n dat pe mediul de intrare sa se gaseasca cel care are cei mai multi divizori.

Code: Select all

#include<stdio.h>
#include<math.h>
void main()
{
    int n, i, j, ndiv=0, ndiv_max=0;
    printf("\n Dati n = ");
    scanf("%d", &n);
    for(i=2; i<=n; i++)
    {
        for(j=1; j<=n; j++)
        {
            if(n%j==0)
            ndiv++;
        }
        printf("\n %d.\n", ndiv);
        ndiv=0;
    }
}
2. Un numar perfect este un numar egal cu suma divizorilor sai, printre care este considerata valoarea 1 dar nu si numarul. Sa se gaseasca toate numerele perfecte mai mici sau egale cu un numar dat pe mediul de intrare, si sa se afiseze fiecare numar astfel determinat, urmat de suma divizorilor lui.

Code: Select all

#include<stdio.h>
#include<math.h>
void main()
{
    int i, j, nr, s=0;
    printf("\n Introduceti nr = ");
    scanf("%d", &nr);
    printf("\n Divizorii numarului %d sunt : ", nr);
    for(i=1; i<=nr; i++)
    {
         for(j=1; j<nr; j++)
         if(nr%j==0)
         {
              s += j;
              printf(" %d", j);
              printf(" %d", s);
         }
           printf("\n");
           printf("\n Suma divizorilor numarului %d este : ", s);
           printf("\n");
              if(s == nr)
              {
                  printf("\n Numerele perfecte sunt : %d", nr);
              }
    }
}



User avatar
Marius Bancila
Fondator
Fondator
Posts: 2344
Joined: 11 Jul 2007, 11:45
Judet: Timiş
Location: Timisoara
Contact:

Re: Programare C

Post by Marius Bancila » 12 Aug 2011, 08:33

Pentru problema 1, cel de-al doilea for ar trebui sa mearga pana la i, nu tot pana la n, intrucat verifici divizorii numarului i din primul for. La fel si testul n%j==0 ar trebui sa fie i%j==0. In plus 1 si numarul insusi sunt divizori la toate numerele, are rost sa-i pui la socoteala? Doar pierzi timp cu calculele. Poti sa aduni 2 la final, cand printezi numarul de divizori.

La problema 2 faci aceiasi gresala din cate observ.
Marius Bancila
Fondator Codexpert, Microsoft MVP VC++
Site personal | Blog

User avatar
bu7ch3r
Membru++
Membru++
Posts: 326
Joined: 17 May 2011, 15:17
Judet: Iaşi
Location: Sofia
Contact:

Re: Programare C

Post by bu7ch3r » 22 Aug 2011, 10:03

La problema 2 enuntul este gresit.
Numărul perfect este un număr întreg egal cu suma divizorilor săi, din care se exclude numărul însuși.
Exemple:
6=1+2+3
28=1+2+4+7+14.
496=1+2+4+8+16+31+62+124+248
8.128=1+2+4+16+32+64+127+254+508+1016+2032+4064

Mai ai o problema care duce la ambiguitatea enuntului:
Exitența numerelor perfecte impare constituie una din problemele nerezolvate ale matematicii :)

Pentru mai multe detalii uite-te pe: http://ro.wikipedia.org/wiki/Num%C4%83r_perfect

Tot ceea ce a spus Marius ar trebui sa te ajute atat la problema 1 cat si la problema 2, cu mentiunea ca la problema 2 numarul de divizori va trebui initializat cu 1 si nu cu 2. Totodata nu e nevoie in nici un caz sa te duci cu un for de la 1 la numarul pentru care trebuie sa afli divizori ci pana la cel mult jumatate din el (sau sqrt(din el) + 1 nu stiu daca e logica chestia asta )
Cu stima,
Lupu Claudiu

Post Reply