Շնորհակալ եմ շատ:
Մի հատ էս խնդիրն էլ նայեք էլի ճիշ տեմ գրել թէ չէ
Հշավել և արտածել այն բնական թվերի քանակը, որոնց վրա առանց մնացորդի բաժանվում է տրված n բնական թիվը:
#include <iostream>
void main ()
{
int n,i,qanak;
cout<<"n=";
cin>>n;
i=1;
qanak=0;
while (n%i==0)
{
i++;
qanak++;
}
cout<<"qanak="<<qanak<<endl;
}
հա կարելի է
Էդ դեպքում առաջարկում եմ հետևյալ ալգորիթմը.
վերցնում ենք էդ թիվը ու for ցիկլով 1-ով պակասացնելով բաժանում իրեն նախորդող թվերի վրա՝ մինչև 1:
Ցիկլի մեջ ստուգում ենք տրված պայմանը:
Բացվում ա ցիկլ, հետևյալ պայմանով՝ քանի դեռ i-ն մեծ է կամ հավասար մեկից, և յուրաքանչյուր թվի համար ստուգվում՝ արդյո՞ք n-ը բաժանվում է այդ թվին, թե ոչ:
- #include <iostream.h>
- void main ()
- {
- int n,i,qanak=0;
- cout<<"n=";
- cin>>n;
- for(i=n-1;i>=1;i--)
- if(n%i==0) ++qanak;
- cout<<"qanak="<<qanak<<endl;
- }
Շատ պարզ ու մատչելիՄերսի
Ժողովուրդ մի քիչ շտապ ա պետք, եթե հնարավոր ա, կօգնե՞ք:
Գրածս ծրագիրը չեմ բացատրի, որովհետև հարցս էդքնա էլ դրա մասին չի:
Լավ, գրեմ հարցս, ինքներդ կհասկանաք:
Նախ լուծածս խնդիրը՝
Լավ, միանգամից էջը մի փակեք, էդքան էլ ահավոր բան չի
- #include <iostream.h>
- void baz(int[][40],int[][40],int[][40],int);
- void main()
- {
- int n,m,j,a[40][40], b[40][40], s[40][40];
- do {cout<<"n="; cin>>n;} while(n<1 || n>40);
- for( int i=1; i<=n; i++)
- for( int j=1; j<=n; j++)
- {
- a[i][j]=0;
- b[i][j]=0;
- s[i][j]=0;
- }
- do {cout<<"m="; cin>>m;} while(m<1);
- cout<<"artarceq tver@"<<endl;
- for( int k=1; k<=m; k++)
- {
- cin>>i>>j;
- cout<<endl;
- a[i][j]=1;
- b[i][j]=1;
- s[i][j]=1;
- }
- k=0;
- bool t=false;
- do
- {
- for( i=1; i<=n; i++)
- for( j=1; j<=n; j++)
- if(b[i,j]!=0)
- {
- t=true;
- k++;
- break;
- }
- if(true==t)
- break;
- if(true==t)
- baz(a,b,s,n);
- // for( i=1; i<=n; i++)
- // for( j=1; j<=n; j++)
- // cout<<b[i][j];
- } while( true==t);
- cout<<k;
- for( i=1; i<=n; i++)
- {
- for( j=1; j<=n; j++)
- cout<<s[i][j];
- cout<<endl;
- }
- }
- void baz(int a[][40], int b[][40], int s[][40], int n)
- {
- int c[40][40];
- for( int i=1; i<=n; i++)
- for( int j=1; j<=n; j++)
- {
- c[i][j]=0;
- for( int k=1; k<=n; k++)
- c[i][j]+=a[i][k]*b[k][j];
- }
- for( i=1; i<=n; i++)
- for( int j=1; j<=n; j++)
- {
- b[i][j]=c[i][j];
- s[i][j]+=c[i][j];
- }
- }
Ուրեմն ծրագրի 20,21,22-րդ տողերում ես ստեղծում եմ a, b և s մատրիցները, որի տարրերը կամ 1 են, կամ 0 (սկզբում (տող 10-12)բոլորը 0 եմ սարքել, իսկ հիմա որը պետք ա 1 եմ դնում):
Ուրեմն a մատրիցը խնդրի լուծման ընթացքում չի փոփոխվում:
Խնդրիս մեջ ունեմ baz ֆունկցիան (տող 2-նախատիպ, տող 52-ֆունկցիա):
Ուրեմն այդ ֆունկցիայի մեջ a մատրիցը բազմապատկվում է b-ով, ստացվում c մատրիցը: Հետո c-ի մեջի եղածը գրվում է b-ի մեջ: Այնուհետև s մատրիցին գումարվում է b մատրիցը:
Դե ցիկլերս որոշ ժամանակ հետո վերջանում են (այն ժամանակ, երբ b մատրիցի բոլոր տարրերը 0 են դառնում) և ես ուզում եմ տպել ստացված s մատրիցը (տող 45-49), բայց արդյունքում տպում ա էն հին՝ տող 22-րդի արդյունքում ստացածս (կարող եք չստուգել՝ a մատրիցը հաստատ չի):
Ծրագիրս pascal-ով գրել եմ, չոտկի աշխատում ա, էս ա՝
Հ.Գ. Վարզոր ջան քեզ կարող ա ծանոթ լինի, խնդիրը կառավարման հիմունքներից ա
- type matric=array[1..40,1..40] of integer;
- var a,b,s:matric;
- i,j,n,m,k:integer; t:boolean;
- procedure baz(var a,b,s:matric; n:integer);
- var i,j,k:integer; c:matric;
- begin
- for i:=1 to n do
- for j:=1 to n do
- begin
- c[i,j]:=0;
- for k:=1 to n do
- c[i,j]:=c[i,j]+a[i,k]*b[k,j];
- end;
- for i:=1 to n do
- for j:=1 to n do
- begin
- b[i,j]:=c[i,j];
- s[i,j]:=s[i,j]+b[i,j]
- end
- end;
- begin
- repeat
- write('n=');
- read(n);
- writeln;
- until(n>1) and (n<=40);
- for i:=1 to n do
- for j:=1 to n do
- begin
- a[i,j]:=0;
- b[i,j]:=0;
- s[i,j]:=0;
- end;
- repeat
- write('m=');
- read(m);
- writeln;
- until(m>1);
- write('mutqagreq tver@');
- writeln;
- for k:=1 to m do
- begin
- read(i,j);
- writeln;
- a[i,j]:=1;
- b[i,j]:=1;
- s[i,j]:=1;
- end;
- k:=0;
- repeat
- t:=false;
- for i:=1 to n do
- begin
- for j:=1 to n do
- if b[i,j]<>0 then
- begin
- t:=true;
- k:=k+1;
- break
- end;
- if t=true then break
- end;
- if t=true then
- baz(a,b,s,n)
- until t=false;
- write(k)
- end.
Հ.Հ.Գ. ի դեպ՝ ես մտածված եմ զանգվածը 1-ին տարրից սկսել արժեքավորելը, կարծում եմ դա ինչ-որ պռոբլեմի առաջ չպիտի բերի
Վերջին խմբագրող՝ armen9494: 23.02.2012, 22:38:
Վայ, ներողություն եմ խնդրում, էն վերևի տեղադրածս խնդրի pascal-ի տարբերակը սխալն եմ տեղադրել![]()
ճիշտը էս ա
- uses crt;
- type matric=array[1..40,1..40] of integer;
- var a,b,s:matric;
- i,j,n,m,k:integer; t:boolean;
- procedure baz(var a,b,s:matric; n:integer);
- var i,j,k:integer; c:matric;
- begin
- for i:=1 to n do
- for j:=1 to n do
- begin
- c[i,j]:=0;
- for k:=1 to n do
- c[i,j]:=c[i,j]+a[i,k]*b[k,j];
- end;
- { readkey; }
- for i:=1 to n do
- begin
- for j:=1 to n do
- begin
- { write(b[i,j]);}
- b[i,j]:=c[i,j];
- s[i,j]:=s[i,j]+b[i,j]
- end;
- { writeln; }
- end;
- end;
- begin
- repeat
- write('n=');
- read(n);
- until(n>1) and (n<=40);
- for i:=1 to n do
- for j:=1 to n do
- begin
- a[i,j]:=0;
- b[i,j]:=0;
- s[i,j]:=0;
- end;
- repeat
- write('m=');
- read(m);
- until(m>1);
- write('mutqagreq tver@');
- writeln;
- for k:=1 to m do
- begin
- read(i,j);
- { writeln;}
- a[i,j]:=1;
- b[i,j]:=1;
- s[i,j]:=1;
- end;
- k:=0;
- repeat
- t:=false;
- for i:=1 to n do
- begin
- for j:=1 to n do
- if b[i,j]<>0 then
- begin
- t:=true;
- k:=k+1;
- break
- end;
- if t=true then break
- end;
- if t=true then
- baz(a,b,s,n)
- until t=false;
- writeln('k=',k);
- for i:=1 to n do
- begin
- for j:=1 to n do
- write(s[i,j]);
- writeln;
- end;
- readkey;
- end.
armen9494 (24.02.2012)
Արմեն ջան էս վերևում սխալդ թույն սխալ ա:
Նախախես ասեմ որ C++ համարյա չգիտեմ: Բայց ոնց որ թե գիտեմ ինչումն ա սխալդ: Ուրեմն մեթոդ կանչելուց երկու տարբերակ կա պարամետրեր փոխանցելու: Փոխանցում արժեքով (pass by value) ու փոխանցում ցուցիչով(pass by reference):
Արժեքով փոխանցում կատարելուց հիշողության մեջ ստեղծվում է փոխանցվողի կրկնօրինակը ու մեթոդի մեջ հետը ինչ ուզում ես արա սկզբնականի վրա չի ազդի քանի որ բոլոր գործողությունները կատարվում են կրկնօրինակի վրա:
Ցուցիչով փոխանցում կատարելիս փոխանցվում է փոխանցվող պարամետրի ցուցիչը ու բոլոր գործողություննը փոխում են սկզբնականը:
Օրինակ Պասկալում արվում ա սենց
procedure baz(var n:integer); //Փոխանցում ցուցիչով
procedure baz(n:integer); //Փոխանցում արժեքով
որ սկսեցի գրառումս գրել ասեցի ինտերնետում կնայեմ մի քիչ կգրեմ Սիով ոնց ա, էն էլ հիմա պիտի գնամ: Հնարավոր ա իմ ասածի հետ կապ չունի, որովհետև ոնց ասեցի Սի չգիտեմ:
armen9494 (24.02.2012)
Ներսես ջան էդքանը հաշվի առել եմ, c++-ում զանգվածը հենց հասցեով էլ փոխանցվում ա ֆունկցիային, դրա համար ուրիշ ոչինչ անել պետք չի, սխալը ըտեղ չի:
soultaker ջան մերսի, չէի նկատել, ասելուցդ էլ հետո մի 5 րոպե նայում էի ու չէի ջոկում, թե ինչն ա սխալ. Պասկալը նստել ա մեջս
բա ինչի՞ էր ծրագրիս էդ մասը ճիշտ աշխատում
Հ.Գ. լավ, էս կարգի անիմաստ սխալ անեմ, որ չկարողանամ գտնեմ![]()
Վերջին խմբագրող՝ armen9494: 24.02.2012, 11:28:
Էտ մասը սինտաքսով ճիշտա համարվում, գրածա`
if(b[i,j]!=0)
Սրա մեջ i,j իրենից ներկայացնումա արտահայտություն: Կամայական ստորակետով իրարից բաժանված արժեքների հաջորդականությունը մշակվումա հետևյալ կերպ` հերթով հաշվումա ամեն մասի արժեքը (տվյալ դեպքում i ու j), վերջում արտահայտության ընդհանուր արժեքը լինումա վերջին մասի արժեքը, իսկ մնացած մասերի արժեքները անտեսվում են: Ասենք եթե գրեյիր i+=j,j էտ դեպքում սկզբում մի հատ i-ին կգումարեր j, հետո կվերադարձներ j-ի արժեքը: Այսինքն i,j արժեքով համարժեք է j-ին, ու նույնը կլիներ եթե
if(b[i,j]!=0)
փոխարեն գրեյիր
if(b[j]!=0)
Varzor (24.02.2012)
Այս պահին թեմայում են 2 հոգի. (0 անդամ և 2 հյուր)
Էջանիշներ