PDA

Դիտել ողջ տարբերակը : Ինֆորմատիկայի խնդիրներ



aerosmith
31.03.2008, 23:42
Այս թեմայում, եկեք առաջարկենք ինֆորմատիկայի հետաքրքրություն ներկայացնող խնդիրներ։ Խնդիրների լուծումները կարող եք տալ ցանկացած լեզվով , նույնիսկ ԲԼՈԿ-ՍԽԵՄԱՆԵՐՈՎ(կցորդի միձոցով)։
Եվ այսպես՝ ԱՌԱՋ

Ավելացվել է 3 րոպե անց
1. քանի՞ եղանակով կարելի է ներկայացնել N բնական թիվը 1,2,3 և 5 թվերի գումարի տեսքով։
Բոլոր թվերը պետք է օգտագործվեն։
N>5։

Ակումբ-ի անդամներից և մոդերատորներից ներողություն եմ խնդրում , թեման սխալ բաժնում բացելու համար, և մոդերատորներին խնդրում, որ թեման տեղափոխեն համապատասխան բաժին։

_DEATH_
31.03.2008, 23:50
Խնդիր առաջարկեմ, նենց ալգորիթմ գրեք որ ամենտեղ ման կգա նույն անունով, նույն չափով և նույն պարունակությամբ ֆայլեր: Եթե գտնվեն ցուցակով բերի և առաջարկի կրկնօրինակներից մեկը ջնջել:

firewall
01.04.2008, 00:05
Խնդիր առաջարկեմ, նենց ալգորիթմ գրեք որ ամենտեղ ման կգա նույն անունով, նույն չափով և նույն պարունակությամբ ֆայլեր: Եթե գտնվեն ցուցակով բերի և առաջարկի կրկնօրինակներից մեկը ջնջել:

իսկ ինչէ՞ նույն պարունակությամբ ֆայլերը կարող են ունենալ տարբեր չափ:

_DEATH_
01.04.2008, 00:09
իսկ ինչէ՞ նույն պարունակությամբ ֆայլերը կարող են ունենալ տարբեր չափ:

Դե կարաս մի անգամից պարունակությունը ստուգես, բայց էտ դեպքում օպտիմալ չի լինի ալգորիթմը, շատ երկար կաշխատի, եթե ամբողջ համակարգչի ֆայլերի պարունակությունը համեմատի: Դրա համար ավելի նպատակահարմարա սկզբից նույն չափով ֆայլերը գտնես նոր համեմատես:

firewall
01.04.2008, 00:26
Դե կարաս մի անգամից պարունակությունը ստուգես, բայց էտ դեպքում օպտիմալ չի լինի ալգորիթմը, շատ երկար կաշխատի, եթե ամբողջ համակարգչի ֆայլերի պարունակությունը համեմատի: Դրա համար ավելի նպատակահարմարա սկզբից նույն չափով ֆայլերը գտնես նոր համեմատես:

Բաց խնդրի լուծման ձևը ու պահանջը տարբեր բաներ են ;)

_DEATH_
01.04.2008, 00:31
Բաց խնդրի լուծման ձևը ու պահանջը տարբեր բաներ են ;)

Դե փոքր հուշում էր :)

firewall
01.04.2008, 00:34
Այս թեմայում, եկեք առաջարկենք ինֆորմատիկայի
1. քանի՞ եղանակով կարելի է ներկայացնել N բնական թիվը 1,2,3 և 5 թվերի գումարի տեսքով։
Բոլոր թվերը պետք է օգտագործվեն։
N>5։


իսկ սա մաթեմատիկան խնդիր չէ՞:

Cesare
01.04.2008, 08:00
իսկ սա մաթեմատիկան խնդիր չէ՞:

Խնդիրը վերաբերվում ա ցանկացած N բանական թվին :
Իրականում շատ ինֆորմի խնդիրների հիմքում մաթեմն ա :
Ես լավ խնդիր ա :

Դինամիկ ծրագրավորումով լուծվում ա :

firewall
01.04.2008, 20:14
Խնդիրը վերաբերվում ա ցանկացած N բանական թվին :
Իրականում շատ ինֆորմի խնդիրների հիմքում մաթեմն ա :
Ես լավ խնդիր ա :

Դինամիկ ծրագրավորումով լուծվում ա :

ես էլ գիտեմ, որ դինամիկ ծրագրավորմամբ լուծվում է, բայց հարցը նա է, որ կարուղ է լուծվել նաև(ձևը չգիտեմ, ուղակի այդպես եմ մտածում) մաթեմատիկորեն: Այդ դեպքում անիմաստ է դինամիկ ծրագրավորմամբ լուծել, քանի որ մաթեմ.լուծումը ավելի արագ և ավելի մեծ N-երի համար կաշխատի:

Ֆիզիկայի խնդիրների հիմքումն էլ է մաթեմը…

aerosmith
01.04.2008, 23:10
ես այդ խնդիրը լուծել եմ C++-ով , բայց եթե մեծ N-եմ վերցնում , շատ դանդաղ ա հաշվում, չնայած կոմպս շատ հզորա, վերցրել էի 10000 թիվը և այն հաշվեց մոտ 10 րոպեում, իսկ ալգորիթմն էլ շատ կոռեկտ էր, դրանից բացի էլ ուրիշ ալգորիթմն չգտա։

firewall
02.04.2008, 00:59
ես այդ խնդիրը լուծել եմ C++-ով , բայց եթե մեծ N-եմ վերցնում , շատ դանդաղ ա հաշվում, չնայած կոմպս շատ հզորա, վերցրել էի 10000 թիվը և այն հաշվեց մոտ 10 րոպեում, իսկ ալգորիթմն էլ շատ կոռեկտ էր, դրանից բացի էլ ուրիշ ալգորիթմն չգտա։

վերցնում ես մաքսիմալ չափի մասիվ(խոսքի 10000000).
նրա i-րդ էլեմենտում պետք է գրված լինի i թիվը 1,2,3,4,5 թվերի գումարի տեսքով ներկայացնելու համար եղանակների քանակը:
Այդ մասիվի տարրերը սկսում ենք հերթով լրացնել, օգտագործելով դրանից առաջ ստացված մասսիվի տարրերի արժեքները - դա կոչվում է դինամիկ ծրագրավորում.
Հիմա լուծումը


...........
int MAX = 10000000;
int a[MAX+1];
a[0] = 1;
for(int i=1; i<=5; i++)
for(int j=1; j<=MAX; j++)
if (j - i >= 0) a[j] += a[j-i];
int N;
cin >> N;
if (N <= MAX) cout << N; else cout << "N is too big";
............


կարող ես փորձել աշխատացնել և ստուգել քո ծրագրի արդյունքների հետ, հնարավոր է, որ ճիշտ չեմ հասկացել կամ ալգորիթմը սխալ եմ գրե :)

aerosmith
02.04.2008, 23:03
բայց ես նկատի ունեի ոչ թե 1,2,3,4,5 թվերի, այլ 1,2,3,5 թվերի գումարի տեսքով։ Իսկ իմգրած ալգորիթմը հետևյալն ա՝
#include<iostream>
using std::endl;
using std::cout;
using std::cin;

int main()

{

unsigned long n;

cin>>n;

unsigned long fv, tr, tw, on;
unsigned long k=0;

for (fv=1;fv*5<=n; fv++)
for (tr=1; tr*3<=n; tr++)
for (tw=1; tw*2<=n; tw++)
for (on=1; on*1<=n; on++)

if(fv*5+tr*3+tw*2+on*1==n)

k++;

cout<<"k="<<k<<endl;

return 0;
}

firewall
03.04.2008, 04:43
բայց ես նկատի ունեի ոչ թե 1,2,3,4,5 թվերի, այլ 1,2,3,5 թվերի գումարի տեսքով։ Իսկ իմգրած ալգորիթմը հետևյալն ա՝
#include<iostream>
using std::endl;
using std::cout;
using std::cin;

int main()

{

unsigned long n;

cin>>n;

unsigned long fv, tr, tw, on;
unsigned long k=0;

for (fv=1;fv*5<=n; fv++)
for (tr=1; tr*3<=n; tr++)
for (tw=1; tw*2<=n; tw++)
for (on=1; on*1<=n; on++) «-------

if(fv`5+tr*3+tw*2+on*1==n) «-------------------

k++;

cout<<"k="<<k<<endl;

return 0;
}

խնդիրը վերջում երևի բերվելու է մաթեմատիկականին, բայց...
խորհուրդ կտամ նորից մտածել նշած կոդի մասերի վրա... օպտիմիզացնելու լիքը տեղ կա... իմ մոտ 10000-ի համար մի անգամից պատասխանը տվեց…

պ.ս. իմ վերևում գրված կոդը սխալ էր :)

Bravo
13.05.2008, 19:30
Կարող եք օգնել այս խնդիրը գրեմ?
Ծրագիրը ընդգռկում է ֆունկցիա, որը գտնւմ է երկու թվի առավելագույն արժեքը:
Ֆունկցիան իրականացվում է 3 տարբերակով.
1. Մակրոֆունկցիա 2 պարամետրով:
2, Հասարակ ֆունկցիա, որն ընդունում է 2 արգումենտ int տիպի և վերադարձնում է մաքսիմալ արժեք int տիպի:
3, Նույն ֆունկցիան inline տարբերակով:
Բոլոր տարբերակներին փոխանցել 2 արգումենտ int տիպտ, ապա 2 արգումենտ float տիպի և բացատրել արդյունքը:
Համեմատել 3 լուծումները:

Ավելացվել է 1 րոպե անց
Կամ ավելի ճիշտ կոդը ստուգեք!!!!!
#include<iostream>

#define MAX(a,b) ((a)>(b) ? (a) : (b))

int max(int a,int b)
{
return (a>b ? a:b);
}
inline int in_max(int a,int b)
{
return (a>b ? a:b);
}

int main()
{
using std::cout;
using std::endl;
int ai = 0,bi = 5;
float af = 0.2, bf = -4.56;
//Integer
cout << "MACROS:\t" << MAX(ai,bi) << endl;
cout << "USUAL:\t" << max(ai,bi) <<endl;
cout << "INLINE:\t" << in_max(ai,bi) <<endl;
//Real
cout << "MACROS:\t" << MAX(af,bf) << endl;
cout << "USUAL:\t" << max(af,bf) <<endl;
cout << "INLINE:\t" << in_max(af,bf) <<endl;
return 0;
}

Ավելացվել է 4 րոպե անց
Ինչ որ սխալ բան կա

firewall
13.05.2008, 20:13
Ինչ որ սխալ բան կա

խնդրի մի մասն հենց նա ա, որ բացատրես ինչն ա «սխալ» :)

float-ի դեպքում ֆունկցիաները սարքում են float ից -> int, ու պատասխանել int ով տալիս, դրա համար պատասխանը միշտ լինումա ճիշտ պատասխանի(իրական թիվ) ամբողջ մասը :)

Bravo
13.05.2008, 22:09
Շնորհակալություն

Ավելացվել է 10 րոպե անց
Խնդրը ճիշտ ա գրած չէ?????

linus
16.05.2008, 11:21
Խնդիր առաջարկեմ, նենց ալգորիթմ գրեք որ ամենտեղ ման կգա նույն անունով, նույն չափով և նույն պարունակությամբ ֆայլեր: Եթե գտնվեն ցուցակով բերի և առաջարկի կրկնօրինակներից մեկը ջնջել:

դե օրինակ սենց

A1: fail = read(dir)
A1: if file != empty()
A1: while fail2.read(dir2) != empty() do
A1: if file2.name() == file.name() then
A1: if file2.size() == file.size() then
A1: if file2=file list[file].add(file2)
A1 Goto start

ներդրված դիրեկտորիաները չեմ հաշվի առել.

Հ.Գ. հասկացողին հալալ է :)

armen9494
28.11.2010, 12:14
Որ խնդրեմ, էս ծրագիրը Pascal-ով կգրե՞ք: Կամ ավել լավա բլոկ սխեման կգծե՞ք:

soultaker
12.03.2011, 22:59
Էս ինչ պասիվ թեմայա, ինչի՞ ոչ մեկ բան չի գրում:

aerosmith
12.03.2011, 23:06
լավ. թեման ակտիվացնեմ :)
առաջարկում եմ հետևյալ խնդիրը
հաշվել և 2^n (n>=500)
այս խնդիրը դժվար կլինի բլոկ սխեմայով պատկերել. ցանկալի կլինի վոր տեղադրվի աշխատող ծրագրի կոդը կամ հենց աշխատող ծրագիրը
բարի ժամանց :)

armen9494
13.03.2011, 10:36
2^n-ը նշանակում է 2-ի n աստիճան ?
Եթե այո, ապա Turbo Pascal-ով կլինի այսպես`
var s,n,i:integer;
begin repeat write('n='); readln(n) until n>=500;
s:=1;
For i:=1 to n do
s:=s*2;
writeln('s=',s)
end.

aerosmith
13.03.2011, 12:40
ապ ջան սթրինգը կարող է վերադարձնել մաքսիմում 2-ի 32աստիճան ամբողջ թիվ "32 բիթ"
փորձիր այլ տարբերակներ... իսկ որպես մի քիչ օգնություն ...՝ պատասխանը պետք է ներկայացվի որպես սթրինգ...

aerosmith
13.03.2011, 14:07
կներես ինտեջր-ը կարող է վերադարձնել մաքսիմում 2-ի 32 աստիճան թիվ :)

soultaker
13.03.2011, 14:29
#include <iostream>
using namespace std;
#define MAX_L 300
int m[MAX_L];
int main()
{
int n;
scanf("%d", &n);
m[MAX_L - 1] = 1;
int i;
for(i=0; i<n; i++)
{
int j, t = 0;
for(j=MAX_L-1; j>=0; j--)
{
m[j] <<= 1;
m[j] += t;
t = m[j] / 10;
m[j] %= 10;
}
}
i = 0;
while(m[i] == 0) i++;
for(; i<MAX_L; i++) printf("%d", m[i]);
printf("\n");
return 0;
}

անհրաժեշտության դեպքում MAX_L-մեծացրեք

matlev
13.03.2011, 14:50
2^1000-ը տասական համակարգում 302 նիշ ունի, էնպես որ, եթե մինչև n=1000 հաշվել եք նախատեսում, MAX_L-ը մեծացրեք: :)

soultaker
13.03.2011, 15:00
Դե հա, ես դրա համար տակը գրել եմ, որ ով ինչքան ուզումա մեծացնի: Ուղղակի aerosmith-ը ներքևիցա սահմանափակում դրել չգիտեմ ինչի: Կամ էլ նշաննա թարս, չգիտեմ:

armen9494
13.03.2011, 16:36
Ես չհասկացա, պատասխանի պիտի լինի string թե integer տիպի?

soultaker
13.03.2011, 17:24
Ստեղ "պատասխանի տիպ" հասկացություն չկա, ուղղակի էկրանին տպումա էտ թիվը, ու կարդացողը ընդհանրապես գործ չունի թե ինչ լեզվովա գրած ծրագիրը, խնդրի նպատակը արդյունքն էր:

armen9494
13.03.2011, 23:59
Այդ դեպքում կարելի է S-ը նկարագրել extended, ես փորձել եմ, մինչև 2-ի 16383 աստիճանը հաշվում է(կարծում եմ բավարար է): Այսպես`
var s:extended; n,i:integer;
begin repeat write('n='); readln(n) until (n>=500) and (n<=16383);
s:=1;
For i:=1 to n do
s:=s*2;
writeln('s=',s)
end.

soultaker
14.03.2011, 00:06
Օրինակ n = 1000-ի համար էս ծրագիրը մոտավորապես քանի՞ նիշանոց պատասխանա տալիս:

matlev
14.03.2011, 00:10
Այդ դեպքում կարելի է S-ը նկարագրել extended, ես փորձել եմ, մինչև 2-ի 16383 աստիճանը հաշվում է(կարծում եմ բավարար է): Այսպես`

...

extended-ը երբվանի՞ց ա ամբողջ թիվ նկարագրում: ;)

armen9494
14.03.2011, 16:21
extended-ը երբվանի՞ց ա ամբողջ թիվ նկարագրում: ;)

Ցավտ տանեմ, դու չասեցիր որ կապ չունի թե ինչ տեսքով կներկայացվի թիվը? Դե ես էլ էտ տեսքով եմ տալիս:) Պատասխանը կլինի էքսպոնենտային տեսքով, բայց եթե դու չես ուզում էքսպոնենտային ձև, կարող էս այսպես անել (եթե գիտես թե քո թիվը մոտավորապես քանի նիշանոց է) օրինակ` write(s:20,0) (Սա նշանակում է, որ թվի ամբողջ մասը (մինչև ստորակետը) 20 նիշ է, իսկ տասնորդական մասը (ստորակետից հետո) 0 (քանի որ մեր թիվը հաստատ ամբողջ է):

matlev
14.03.2011, 16:55
Ցավտ տանեմ, դու չասեցիր որ կապ չունի թե ինչ տեսքով կներկայացվի թիվը? Դե ես էլ էտ տեսքով եմ տալիս:) Պատասխանը կլինի էքսպոնենտային տեսքով, բայց եթե դու չես ուզում էքսպոնենտային ձև, կարող էս այսպես անել (եթե գիտես թե քո թիվը մոտավորապես քանի նիշանոց է) օրինակ` write(s:20,0) (Սա նշանակում է, որ թվի ամբողջ մասը (մինչև ստորակետը) 20 նիշ է, իսկ տասնորդական մասը (ստորակետից հետո) 0 (քանի որ մեր թիվը հաստատ ամբողջ է):

Արի պայմանավորվենք ցավս հանգիստ թողնել: :))

Չէ՛, ես չասեցի, թե կապ չունի ինչ տեսքով կներկայացվի, ես ընդհանրապես տեսքի մասին բան չասեցի: ;)
Ես իմ թիվը ոչ միայն մոտավորապես, այլև ճշգրիտ գիտեմ՝ 2^1000-ը 302 նիշ ունի, գրել էի:

51514

Դե հիմա վերևում գրածս թիվը փորձիր extended-ով ներկայացնել:

aerosmith
14.03.2011, 20:07
Ժող ջան դե մի հատ խնդիր առաջարկեք....
թե էլի ես առաջարկեմ?

armen9494
14.03.2011, 23:19
Արի պայմանավորվենք ցավս հանգիստ թողնել: :))

Չէ՛, ես չասեցի, թե կապ չունի ինչ տեսքով կներկայացվի, ես ընդհանրապես տեսքի մասին բան չասեցի: ;)
Ես իմ թիվը ոչ միայն մոտավորապես, այլև ճշգրիտ գիտեմ՝ 2^1000-ը 302 նիշ ունի, գրել էի:

51514

Դե հիմա վերևում գրածս թիվը փորձիր extended-ով ներկայացնել:

Ես քեզ թվի էքսպոնենտային ձևը ստանալու միջոցն ասեցի, փորձի գտնես, թե ոնց էքսպոնենտայինից անցնես սովորականի, ինձ թվումա Ֆարոնովի մեջ կգտնես:

matlev
14.03.2011, 23:56
Ես քեզ թվի էքսպոնենտային ձևը ստանալու միջոցն ասեցի, փորձի գտնես, թե ոնց էքսպոնենտայինից անցնես սովորականի, ինձ թվումա Ֆարոնովի մեջ կգտնես:

Շնորհակալ եմ: :)) Բայց քեզ թվալը իմ համար բավարար պայման չի: ;)

soultaker
15.03.2011, 00:12
Ուզում էի ինչ-որ խնդիր առաջարկեմ, բայց մտքովս հետքրքիր բան չանցավ, համ էլ դե էնքան խնդիր կա, որ գնա գալիս եմ:
Ու մտածեցի, որ ինչի ենք տանջվում, հենա մտեք ասենք acm.am (http://acm.am), spoj.pl (http://spoj.pl), acm.timus.ru (http://acm.timus.ru), լուծեք, համ էլ կտեսնեք անցնումա լուծումը թե չի անցնում: Ու extended-ի համար էլ կռիվ չեք անի :)

yuri1995
19.03.2011, 19:37
Բարև ձեզ:
Ահա խնդիր.
Հաշվե´լ արմատ N-ը, որտեղ 1<N<999 բնական թիվ է: Հաշվարկները կատարել ստորակետից հետո K (3<=K<=6) թվի ճշտությամբ` չօգտագործելով քառակուսի արմատի հաշվման ստանդարտ ֆունկցիան (օրինակ` կիսման մեթոդով):

Մուտք - 23
Ելք - 4.796

armen9494
20.03.2011, 08:18
Բարև ձեզ:
Ահա խնդիր.
Հաշվե´լ արմատ N-ը, որտեղ 1<N<999 բնական թիվ է: Հաշվարկները կատարել ստորակետից հետո K (3<=K<=6) թվի ճշտությամբ` չօգտագործելով քառակուսի արմատի հաշվման ստանդարտ ֆունկցիան (օրինակ` կիսման մեթոդով):

Մուտք - 23
Ելք - 4.796

Իսկ ընդհանրապես արմատը առան հաշվարկիչի ոնց են հաշվում?

matlev
20.03.2011, 12:01
Իսկ ընդհանրապես արմատը առան հաշվարկիչի ոնց են հաշվում?

Հետաքրքիր ա, իսկ հաշվարկիչն ի՞նչ ա, կամ հաշվարկիչը ինքը ի՞նչ հաշվարկիչով ա հաշվում:

Իսկ թե լուրջ, եթե մաթեմատիկայի գիտելիքներդ կբավարարեն, էստեղ նայի (http://en.wikipedia.org/wiki/Methods_of_computing_square_roots), Էնքան էլ բարդ չի, ինչքան առաջին հայացքից ա երևում:;)

EgoBrain
20.03.2011, 12:53
Իսկ ընդհանրապես արմատը առան հաշվարկիչի ոնց են հաշվում?
Սկսնակի համար առավել պարզ ալգորիթմ է՝ http://ru.wikipedia.org/wiki/%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D1%8B%D0%B9_%D0%BA%D0%BE%D1%80%D0%B5%D0%BD%D1%8C#.D0.A1.D1.82.D0.BE.D0.BB.D0.B1.D0.B8.D0.BA .D0.BE.D0.BC
Եթե ինչ-որ բան չհասկանաս, նաի սա՝ http://kvant.mirror1.mccme.ru/1987/03/staryj_algoritm.htm շատ պարզ է բացատրած։

armen9494
20.03.2011, 13:52
Հետաքրքիր ա, իսկ հաշվարկիչն ի՞նչ ա, կամ հաշվարկիչը ինքը ի՞նչ հաշվարկիչով ա հաշվում:

Իսկ թե լուրջ, եթե մաթեմատիկայի գիտելիքներդ կբավարարեն, էստեղ նայի (http://en.wikipedia.org/wiki/Methods_of_computing_square_roots), Էնքան էլ բարդ չի, ինչքան առաջին հայացքից ա երևում:;)

Հաշվարկիչը կալկուլյատորնա:)

yuri1995
20.03.2011, 15:37
Կօգնեք գրեմ?

armen9494
21.03.2011, 22:29
Կօգնեք գրեմ?

Ախպեր, որ ճիշտը ասեմ, ըտենց էլ չհասկացա: Կարաս հայերենով գրես? Կամ փորձի ինքդ գրել, որ մասը որ չստացվի, ասա կօգնեմ:

MSGM
22.03.2011, 12:58
Բարև ձեզ:
Ահա խնդիր.
Հաշվե´լ արմատ N-ը, որտեղ 1<N<999 բնական թիվ է: Հաշվարկները կատարել ստորակետից հետո K (3<=K<=6) թվի ճշտությամբ` չօգտագործելով քառակուսի արմատի հաշվման ստանդարտ ֆունկցիան (օրինակ` կիսման մեթոդով):

Մուտք - 23
Ելք - 4.796
Կիսման մեթոդը էս ա.


#include <cstdio>
#include <cmath>

using namespace std;

int main()
{
int N, K;
scanf("%d %d", &N, &K);
double left = 0.0, right = N, middle, eps = pow(1e-1, K);
while (right - left > eps)
{
middle = (left + right) / 2.0;
if (middle * middle < N)
left = middle;
else
right = middle;
}
printf("%.*lf\n", K, left);
return 0;
}

armen9494
22.03.2011, 13:52
Կիսման մեթոդը էս ա.


#include <cstdio>
#include <cmath>

using namespace std;

int main()
{
int N, K;
scanf("%d %d", &N, &K);
double left = 0.0, right = N, middle, eps = pow(1e-1, K);
while (right - left > eps)
{
middle = (left + right) / 2.0;
if (middle * middle < N)
left = middle;
else
right = middle;
}
printf("%.*lf\n", K, left);
return 0;
}


ես մենակ Pascal գիտեմ

yuri1995
22.03.2011, 13:58
ափսոս...ինձ Պասկալով ա պետք...
Ուղղակի ինձ մեթոդն ա պետք գտնել:

MSGM
22.03.2011, 17:09
Դե ես էլ Պասկալ չգիտեմ: Բայց կիսման մեթոդը հետևյալն ա:
Նախ, վերցնում ենք ինչ-որ միջակայք, որը, հաստատ գիտենք, պարունակում ա պատասխանը, ասենք մեր դեպքում կարելի ա [0, 40] միջակայքը: Հետո ամեն քայլին վերցնում ենք միջակայքի միջնակետը (օր. առաջին քայլին 20-ը) ու հաշվում ենք դրա քառակուսին: Եթե էդ քառակուսին մեծ ա մեր N թվից, նշանակում ա պատասխանը գտնվում ա միջակայքի առաջին կեսում (0...20), հակառակ դեպքում` երկրորդ կեսում (20...40): Փաստորեն, ամեն քայլին կիսում ենք միջակայքը` ստանալով պատասխանի ավելի ու ավելի ճշգրիտ (նեղ) սահմաններ: Այդպես այնքան քայլ ենք անում, ինչքան որ պետք ա պատասխանը անհրաժեշտ ճշտությամբ ստանալու համար:

armen9494
22.03.2011, 18:45
Դե ես էլ Պասկալ չգիտեմ: Բայց կիսման մեթոդը հետևյալն ա:
Նախ, վերցնում ենք ինչ-որ միջակայք, որը, հաստատ գիտենք, պարունակում ա պատասխանը, ասենք մեր դեպքում կարելի ա [0, 40] միջակայքը: Հետո ամեն քայլին վերցնում ենք միջակայքի միջնակետը (օր. առաջին քայլին 20-ը) ու հաշվում ենք դրա քառակուսին: Եթե էդ քառակուսին մեծ ա մեր N թվից, նշանակում ա պատասխանը գտնվում ա միջակայքի առաջին կեսում (0...20), հակառակ դեպքում` երկրորդ կեսում (20...40): Փաստորեն, ամեն քայլին կիսում ենք միջակայքը` ստանալով պատասխանի ավելի ու ավելի ճշգրիտ (նեղ) սահմաններ: Այդպես այնքան քայլ ենք անում, ինչքան որ պետք ա պատասխանը անհրաժեշտ ճշտությամբ ստանալու համար:

Պարզա, շատ սիրուն լուծելու ձևա, Յուրի քեզ ծրագիրնա պետք, թե մենակ ալգորիթմը հերիք էր?

yuri1995
22.03.2011, 22:16
Շատ լավ կլինի ծրագիրը)

armen9494
24.03.2011, 17:38
Շատ լավ կլինի ծրագիրը)

Ախպերս էս 2 օրա փորձում եմ, չի ստացվում, չգիտեմ ինչն եմ սխալ անում, բայց մի բան էն չի, խոսքի թիվը գրում եմ 49, ինքը գալիս, մոտիկանում ա յոթին, բայց չի հասնում (7.00000000000348)-ի վրա ստոպ ա տալիս

matlev
24.03.2011, 19:48
Ախպերս էս 2 օրա փորձում եմ, չի ստացվում, չգիտեմ ինչն եմ սխալ անում, բայց մի բան էն չի, խոսքի թիվը գրում եմ 49, ինքը գալիս, մոտիկանում ա յոթին, բայց չի հասնում (7.00000000000348)-ի վրա ստոպ ա տալիս

Ամեն ինչ իր տեղում ա: :))
Իսկ եթե 48-ի արմատը հաշվելիս լինեիր, ճշգրիտ արժեքն էիր սանալու՞: :)
Նույն պրոբլեմն ա, որն անցած անգամ հուշում էի: ;)

armen9494
24.03.2011, 21:17
Ամեն ինչ իր տեղում ա: :))
Իսկ եթե 48-ի արմատը հաշվելիս լինեիր, ճշգրիտ արժեքն էիր սանալու՞: :)
Նույն պրոբլեմն ա, որն անցած անգամ հուշում էի: ;)

Ինձ թվում է դա նրանից է, որ ինքը անվերջ մոտենում է այդ թվին, բայց չի հասնում

yuri1995
24.03.2011, 23:03
Ինձ թվում է դա նրանից է, որ ինքը անվերջ մոտենում է այդ թվին, բայց չի հասնում

Կարող ես գրածդ մի հատ ցույց տալ?

armen9494
24.03.2011, 23:16
Կարող ես գրածդ մի հատ ցույց տալ?

Իհարկե

var n,a,b:real;
begin
write('n='); read(n);
a:=50;
b:=0;
while (a+b)*(a+b)/4<>n do
begin if (a+b)*(a+b)/4<n then b:=(a+b)/2
else a:=(a+b)/2;
end;
writeln((a+b)/2);
readln
end.

yuri1995
25.03.2011, 18:12
Ինձ պետք ա, որ հաշվարկները կատարի ստորակետից հետո K (3<=K<=6) թվի ճշտությամբ
Բայց հետաքրքիր ա ինչի չի հասնում 7-ին

armen9494
25.03.2011, 18:56
Ինձ պետք ա, որ հաշվարկները կատարի ստորակետից հետո K (3<=K<=6) թվի ճշտությամբ
Բայց հետաքրքիր ա ինչի չի հասնում 7-ին

Ես ճշտեցի, իրականում հենց էդ ձև էլ պետք ա լինի, մաթեմատիկորեն էլ որ նայենք, ինքը անընդհատ մոտիկանում ա մեր թվին, բայց չի հասնում, անվերջ ձգտում ա էդ թվին: Մեր պատասխանը պետք ա լինի ինչ որ էփսիլիոն մոտավոր ճշտությամբ: Եթե խնդիրը պետք է լուծել առանց sqrt ֆունկցիայի, ապա պետք է նայել, թե մաթեմատիկորեն ոնց է հաշվվում արմատը: Որ ճիշտը ասեմ, ես մի 3 անգամ նայեցի, բայց ըտենց ել չհասկացա (դե հիմա էտ ձև էլ ա լինու, тормуза:)) Եթե նորմալ ասեք, թե ոնց ա ինքը աշխատում, ես կգրեմ ծրագիրը:

yuri1995
26.03.2011, 23:12
Ես ճշտեցի, իրականում հենց էդ ձև էլ պետք ա լինի, մաթեմատիկորեն էլ որ նայենք, ինքը անընդհատ մոտիկանում ա մեր թվին, բայց չի հասնում, անվերջ ձգտում ա էդ թվին: Մեր պատասխանը պետք ա լինի ինչ որ էփսիլիոն մոտավոր ճշտությամբ: Եթե խնդիրը պետք է լուծել առանց sqrt ֆունկցիայի, ապա պետք է նայել, թե մաթեմատիկորեն ոնց է հաշվվում արմատը: Որ ճիշտը ասեմ, ես մի 3 անգամ նայեցի, բայց ըտենց ել չհասկացա (դե հիմա էտ ձև էլ ա լինու, тормуза:)) Եթե նորմալ ասեք, թե ոնց ա ինքը աշխատում, ես կգրեմ ծրագիրը:
Փաստորեն միակ տարբերակը այս է?

armen9494
26.03.2011, 23:51
Փաստորեն միակ տարբերակը այս է?

Չի կարող ուրիշ տարբերակ չլինել, ուղղակի մտածել ա պետք: Իսկ ինչի դու չես ուզում օգտագործել sqrt ֆունկցիան?

yuri1995
27.03.2011, 13:55
Չի կարող ուրիշ տարբերակ չլինել, ուղղակի մտածել ա պետք: Իսկ ինչի դու չես ուզում օգտագործել sqrt ֆունկցիան?

Խնդիրը տենց ա տված)

armen9494
29.03.2011, 14:46
Խնդիրը տենց ա տված)

Դե ուրեմն կարող ես օգտագործել էն, ինչ Sqrt ֆունկցիայի մեջ ա գրված (վերջ ի վերջո ինքն էլ ա չե ինչ որ ալգորթմ):

Պոզիտրոն
30.03.2011, 14:42
Ժող մի հատ շատ հեշտ խնդիր կա, միջանկյալիս լուծել էի կոմպով չոտքի աշխատում էր բայց դասախոսս ասում ա սխալ ես գրել:
Պետք է մուտք անենք զանգվածի էլեմենտները և մի թիվ, ծրագիրը դուրս է բերում թե այդ թիվը քանի անգամ է հանդիպում զանգվածում
#include <iostream.h>
main()
{
int a[5],i,b,k=0;
cout<<"b=";
cin>>b;
for (i=0; i<5; i++)
{cin>>a[i];
if(a[i]==b) k=k++;
}
cout<<k ;
return 0;}
կարմիրով նշվածը սխալ է համարում, բայց ծրագիրը անխափան աշխատում է: Միթե նման կերպ գրելը սխալ է:

armen9494
31.03.2011, 22:39
Ժող մի հատ շատ հեշտ խնդիր կա, միջանկյալիս լուծել էի կոմպով չոտքի աշխատում էր բայց դասախոսս ասում ա սխալ ես գրել:
Պետք է մուտք անենք զանգվածի էլեմենտները և մի թիվ, ծրագիրը դուրս է բերում թե այդ թիվը քանի անգամ է հանդիպում զանգվածում
#include <iostream.h>
main()
{
int a[5],i,b,k=0;
cout<<"b=";
cin>>b;
for (i=0; i<5; i++)
{cin>>a[i];
if(a[i]==b) k=k++;
}
cout<<k ;
return 0;}
կարմիրով նշվածը սխալ է համարում, բայց ծրագիրը անխափան աշխատում է: Միթե նման կերպ գրելը սխալ է:
Չգիտեմ C++-ով ոնց կլինի, բայց ալգորիթմը այսպես է (եթե ուզում ես, կարող եմ պասկալով գրել), պետք է մուտք անես մատրիցը, հետո թիվը, հետո մտցնես մի հաշվիչ (k=0), բացես ցիկլ (i:=1 to n, j:=1 to n, որտեղ n-ը տողերի կամ սյուների քանակն է) և ամեն անգամ ստուգես, արդյոք քո թիվը հավասար է X[i,j] տարրին, եթե այո, ապա k-ն ավելացնես մեկով, հակառակ դեպքում անցնես հաջորդին: Վերջում տպես k-n:

LoK®
31.03.2011, 23:42
Ժող մի հատ շատ հեշտ խնդիր կա, միջանկյալիս լուծել էի կոմպով չոտքի աշխատում էր բայց դասախոսս ասում ա սխալ ես գրել:
Պետք է մուտք անենք զանգվածի էլեմենտները և մի թիվ, ծրագիրը դուրս է բերում թե այդ թիվը քանի անգամ է հանդիպում զանգվածում
#include <iostream.h>
main()
{
int a[5],i,b,k=0;
cout<<"b=";
cin>>b;
for (i=0; i<5; i++)
{cin>>a[i];
if(a[i]==b) k=k++;
}
cout<<k ;
return 0;}
կարմիրով նշվածը սխալ է համարում, բայց ծրագիրը անխափան աշխատում է: Միթե նման կերպ գրելը սխալ է:
Գրելաձևն ա սխալ, կամ k=k+1, կամ k++:
k=k++ -ը ըստ էության պիտի կատարվեր հետևյալ կերպ`
սկզբում կատարվում ա k++ -ը:
1. հիշել k-ի արժեքը (tmp=k)
2. k-ի արժեքը մեկով ավելացնել (k=k+1)
հետո վերագրումը:
3. k-ին վերագրել հիշված արժեքը (k=tmp)

Արդյունքում k-ի արժեքը պիտի մնար նույնը: Բայց քո մոտ ծրագիրը աշխատելա, քանի որ կոմպիլյատորը էդ քայլերը մի քիչ ուրիշ հերթականությամբ ա կատարում, այ սենց (Visual Studio 2008 SP1, Debug)

mov eax,dword ptr [k] // 1. հիշել k-ի արժեքը
mov dword ptr [k],eax // 3. k-ին վերագրել հիշված արժեքը
mov ecx,dword ptr [k] // 2. k-ի արժեքը մեկով ավելացնել
add ecx,1
mov dword ptr [k],ecx

Այսինքն վերջում k-ի արժեքը մեկով ավելանում ա ու ճիշտ ա աշխատում:

armen9494
07.04.2011, 21:21
լավ. թեման ակտիվացնեմ :)
առաջարկում եմ հետևյալ խնդիրը
հաշվել և 2^n (n>=500)
այս խնդիրը դժվար կլինի բլոկ սխեմայով պատկերել. ցանկալի կլինի վոր տեղադրվի աշխատող ծրագրի կոդը կամ հենց աշխատող ծրագիրը
բարի ժամանց :)

Էս էլ քո խնդրի լուծումը
var p,s,i,m,j,k:integer; b:string; c1:string[2];
x,d:array[1..250] of integer;
c:array[1..4] of integer;
n,l:longint;
begin
readln(n);
c[1]:=2;
b:='2';
for l:=1 to n-1 do
begin
j:=length(b);
k:=length(b)+4;
for i:=1 to length(b) do
begin
val(b[i],d[j],m); j:=j-1;
end;
for i:=1 to k do
x[i]:=0;
for i:=1 to length(b) do
for j:=1 to 4 do
x[i+j-1]:=c[j]*d[i]+x[i+j-1];
for i:=1 to k do
begin
x[i+1]:=x[i+1]+x[i] div 10;
x[i]:=x[i] mod 10;
end;
while x[k]=0 do k:=k-1;
b:='';
for i:=k downto 1 do
begin
str(x[i],c1);
b:=b+c1;
end;
end;
writeln(b);
end.