Не сте регистриран! Регистрирайте се БЕЗПЛАТНО, за да използвате услугите на сайта!

Нова тема
Помощ с едни задачки
Тази тема е погледната 293 пъти
Добави темата към любими | Принтирай темата | Нова тема 
Публикувано на: 09.06.2008 20:41
ubeto
Калфа

Мнения: (11)

От скоро се занимавам с С++ (в училище) и нещата въобще не са ми ясни.Трябва да направя 2 задачи, които сигурно са лесни, но предвид възможностите си имам нужда от помощ.

Едно естествено число е съвършено, ако е равно на сумата от своите делители (без самото число). Например, 6 е съвършено, защото 6 = 1+2+3. Да се напише програма, която намира всички съвършени числа ненадминаващи дадено естествено число n.

#include <iostream.h>
int main()
{cout <<"n=";
int n;
cin>>n;
if(!cin)
{cout<<"error\n";
return 1;}
int s=0;
for(int i=1;i<=n;i++)
if(n%i==0)
s=s+1;
cout<<"s="<<s<<"\n";
return 0;
}

Направих това,но то смята броя на делители, не сумата им.

Другата задача е:Да се напише програма, която намира всички цели числа от интервала [m, n], в записа на които участва цифрата 5 (m и n са дадени естествени числа, m < n).

#include <iostream.h>
int main()
{cout <<"n=";
int n;
cin>>n;
if(!cin)
{cout<<"error\n";
return 1;}
cout <<"m=";
int m;
cin>>m;
if(!cin)
{cout<<"error\n";
return 1;}
int s=0;
int a=m,q=a,b,c;
for(q=m;q<=n;q++)
while((b==5)||(m<n))
{b=q%10;
c=q/10;
a=a+1;
s=s+1;}
cout<<"s="<<s<<"\n";
return 0;
}

По нея съм направила това.Но и тя не излиза 


 
---------------------------
Потребител от: 26.05.08 | Всички уроци от ubeto | Всички скриптове от ubeto
напиши eMail напиши лично съобщение виж профила на ubeto
Публикувано на: 10.06.2008 00:58
mrhellish
Самурай

Модератор

Мнения: (210)

Цитат от ubeto@09.06.2008 20:41:
#include <iostream.h>
int main()
{cout <<"n=";
int n;
cin>>n;
if(!cin)
{cout<<"error\n";
return 1;}
int s=0;
for(int i=1;i<=n;i++)
if(n%i==0)
s=s+1;
cout<<"s="<<s<<"\n";
return 0;
}

Направих това,но то смята броя на делители, не сумата им.
ти му задаваш да добавя 1 към s когато намери делител, и така ще ти казва броя делители, вместо
s = s + 1;
напиши
s = s + i;
така s накрая ще ти е сумата от делителите и ще ти изведе сумата,
прибави едно условие ако n = s да извежда че е съваршено


 
---------------------------
Потребител от: 12.04.08 | Всички уроци от mrhellish | Всички скриптове от mrhellish

MrHellish™
напиши eMail напиши лично съобщение виж профила на mrhellish
Публикувано на: 10.06.2008 09:55
gomaker
Калфа

Мнения: (28)

Освен това цикълът ви включва и самото число n, а то по условие се изключва. Също по условие трябва да се изведат всички съвършени числа до n, а не да се проверява само въведеното число дали е съвършено. И накрая - цикълът трябва да се върти до n / 2, няма смисъл за повече:
CODE
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
using namespace std;

int main(int argc, char* argv[])
{
 
cout << "n=";
 
int n;
 
cin >> n;

 
if ( !cin ){
   
cout << "error\n";
   
return 1;
 
}

 
for ( int i = 1; i <= n; i++ ) {
   
int s = 0;
   
for ( int j = 1; j <= i / 2; j++ )
      if ( i % j == 0 )
        s = s + j;

    if ( s == i )
      cout << "s=" << s << endl;
  }

  system( "pause" );

  return 0;
}
С тази програмка изкарах, че съвършените числа в интервала до 1000000 са само: 6, 28, 496 и 8128. Следващите ги пише във wikipedia.


 
---------------------------
Потребител от: 15.01.08 | Всички уроци от gomaker | Всички скриптове от gomaker
напиши eMail напиши лично съобщение виж профила на gomaker
Публикувано на: 10.06.2008 10:28
gomaker
Калфа

Мнения: (28)

Втората задача:
CODE
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <iostream.h>
using namespace std;

int main( int argc, char *argv[] )
{
 
int n, m, s = 0;

 
cout << "m="; cin >> m;
 
if ( !cin ) {
   
cout << "Error!\n";
   
return 1;
 
}

 
cout << "n="; cin >> n;
 
if ( !cin ) {
   
cout << "Error!\n";
   
return 1;
 
}

 
if ( m > n ) {
   
s = m;
   
m = n;
   
n = s;
 
}

 
for ( ; m <= n; m++ ) {
   
s = m;
   
do {
     
if ( (s % 10) == 5 ) {
       
cout << "m=" << m << endl;
       
break;
     
}
    }
while( s /= 10 );
  }

  system( "pause" );
  return 0;
}


 
---------------------------
Потребител от: 15.01.08 | Всички уроци от gomaker | Всички скриптове от gomaker
напиши eMail напиши лично съобщение виж профила на gomaker
Публикувано на: 10.06.2008 19:23
ubeto
Калфа

Мнения: (11)

Благодаря много.
Само да попитам, какво означава " int main( int argc, char *argv[] )" , защото попринцип знам че се пише само "int main()"
 


 
---------------------------
Потребител от: 26.05.08 | Всички уроци от ubeto | Всички скриптове от ubeto
напиши eMail напиши лично съобщение виж профила на ubeto
Публикувано на: 10.06.2008 19:37
zipopro
Майстор

Мнения: (700)

Не че знам C++ но колкото виждам това БИ трябвало да подава на main функцията някакви параметри


 
---------------------------
Потребител от: 20.12.06 | Всички уроци от zipopro | Всички скриптове от zipopro

Лъчезар Петров Лечев - 14 - Стара Загора - Уеб Програмист
Винчета, болчета гайкии...!
напиши eMail напиши лично съобщение виж профила на zipopro
Публикувано на: 10.06.2008 20:14
zaikoni
Самурай

Модератор

Мнения: (173)

Да параметри са  когато се пише само int main() функцията няма параметри ,а имам въпрос към @ubeto:
"Значи те не трябва да ти надминават дадено естествено число n,ти си го определяш,кое е най голямото естествено число n с което можеш да пуснеш програмата без да има проблем"


 
Това мнение е редактирано от zaikoni на 10.06.2008 20:18
---------------------------
Потребител от: 30.01.08 | Всички уроци от zaikoni | Всички скриптове от zaikoni

Човекът,който знае KAK,винаги ще има работа.Човекът който знае ЗАЩО,винаги ще бъде негов ШЕФ. "
напиши eMail напиши лично съобщение виж профила на zaikoni
Публикувано на: 10.06.2008 22:32
jpg
Ронин

Модератор

Мнения: (114)

Първата задачка е интересна от гледна точка на възможните оптимизации. Т.е държи на бой и "разпаралеляване". Решението ползва технологията OpenMP. Може някой компилатори да не я поддържат. CODE
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57

#define MAX_RESULTS    0x20

typedef struct tss_s { unsigned ustart, uend, nspus, uresults[MAX_RESULTS], ursize; } tss_t;

int perfect( tss_t *_tss, unsigned threadID ) {
   
unsigned i, istep = _tss->nspus << 1, ustart = _tss->ustart, uend = _tss->uend;
   
unsigned j, uroot, e, sum;
   
   
for( i = ustart + threadID << 1; i < uend; i += istep ) {
       
for (
           
j = 2, uroot = sqrt( i ) + 1, sum = 1;
           
j <= uroot;
           
j += 2
       
) if( i % j == 0 ) {
           
e = i / j;
            sum += j + e;
        }
        if( sum == i ) {
            #pragma omp critical
            { _tss->uresults[_tss->ursize++] = i; }
        }
    }
    return 0;
}

int pcmp( unsigned *_u1, unsigned *_u2 ) {
    return *_u1 - *_u2;
}

void parallel_perfects( unsigned umin, unsigned umax ) {
    int i;
    tss_t tss = { umin, umax, 8 };
   
    tss.ursize = 0;
    memset( tss.uresults, 0, sizeof( tss.uresults ) );
   
    #pragma omp parallel for private( i ) shared( tss )
    for( i = 0; i < 8; i++ ) perfect( &tss, i );
    #pragma omp barrier
   
    qsort( tss.uresults, tss.ursize, sizeof(unsigned), pcmp );
    for( i = 0; i < 8; i++ ) if( tss.uresults[i] ) printf( "\t%u\n", tss.uresults[i] );
}

#include <windows.h>

int main() {
    unsigned min, max;
    unsigned long tm;
   
    printf( "Enter [ min, max ] $" ), scanf( "%u,%u", &min, &max );
    tm = GetTickCount();
    printf( "perfect numbers in range %u <-> %u\n", min, max ); parallel_perfects( min, max );
    printf( "calculation time = %u\n", GetTickCount() - tm );
    return 0;
}
Ако някой изкара 8-ядрен процесор, да казва резултати ;).


 
---------------------------
Потребител от: 16.07.06 | Всички уроци от jpg | Всички скриптове от jpg
напиши eMail напиши лично съобщение виж профила на jpg
Публикувано на: 10.06.2008 23:31
ubeto
Калфа

Мнения: (11)

Цитат от zaikoni@10.06.2008 20:14:
Да параметри са  когато се пише само int main() функцията няма параметри ,а имам въпрос към @ubeto:
"Значи те не трябва да ти надминават дадено естествено число n,ти си го определяш,кое е най голямото естествено число n с което можеш да пуснеш програмата без да има проблем"

Да точно така. Което и число да въведеш, трябва да го проверява.


 
---------------------------
Потребител от: 26.05.08 | Всички уроци от ubeto | Всички скриптове от ubeto
напиши eMail напиши лично съобщение виж профила на ubeto
 1 посетител чете тази тема (0 потребители и 1 гост)  
Активни потребители: ---
   





IT-PLACE.NET © 2004 - 2008