Jump to content

Pascal - 1000 skaitļu ciparu summa


ExDec
 Share

Recommended Posts

Sveiki!

 

Esmu atdūries pret vienu uzdevumu, kuru uzdēva skolā programmēšanas pamatos (Pascal). It kā saprotu, kas jāizdara, idejas ir, bet izpildīt neizdodas. Ir vajadzīgs iegūt skaitļu no 1 līdz 1000 ciparu summu (respektīvi paņemt katra skaitļa ciparus, saskaitīt un tad visus iegūtos rezultātus saskaitīt kopā). Tā kā mācāmies pašlaik par FOR... TO... DO, tad pieņemu, ka šī funkcija noteikti būs jāizmanto.:D Būtu jau arī labi, ja zinātu, cik tā summa ir, bet atrast neizdodas.

 

Pašlaik esmu mēģinājis dažādus variantus ar a MOD b un a DIV b funkcijām, kā arī zinu, ka visu laiku tomēr atkārtojas skaitļi no 1-9. Bija doma, ka iespējams saskaitot 1+2+3+...+9 un attiecīgi pareizi sareizinot varētu iegūt rezultātu, bet, nezinot pareizo, nevaru pateikt vai pareizi izdomāju.:D Varbūt kāds var ar savām idejām padalīties vai vismaz rezultātu?

 

P.S. Pašlaik iznāk 4546, taču es pieļauju, ka varētu nebūt pareizi.

Link to comment
Share on other sites

kas liedz izmantot ciklu kurā skaitlis maniās no 1 līdz 1000 un saskaitīt visu kopā?

Ja jau tiek mācīti FOR TO DO tad tie arī jāizmanto

 

P.S. Rezultātām jābūt 500500

P.P.S. andza paspēja ātrāk

Labots - mickys
Link to comment
Share on other sites

Nav jāsaskaita katrs skaitlis! Ir jāsaskaita cipari, kas ir katrā skaitlī un tad jāsaskaita tie rezultāti. Piemēram, 1+2+3+4+5+6+7+8+9=45    1+0+1+1+1+2+1+3+1+4+1+5+1+6+1+7+1+8+1+9=54  54+45=99   Tas ir skaitļiem no 1-19. Un šādi vajag no 1-1000. Principā jau ir te sava veida sistēma kaut kāda, bet es īsti netieku skaidrībā, kā tur īsti tikt galā.

Link to comment
Share on other sites

            var total = 0;
            for (var i = 1; i <= 1000; i++)
            {
                var num = i;
                do
                {
                    total += num % 10;
                } while ((num /= 10) > 0);
            }

C#. Konvertācija uz Pascal paliek studenta ziņā.

Labots - girts2
Link to comment
Share on other sites

procedure TForm1.Button1Click(Sender: TObject);
var
  i, j, k, l: integer;
begin
  k:=0;
  l:=0;
  for i:=1 to StrToInt(Edit1.text) do
  begin
    for j:=1 to length(IntToStr(i)) do
    begin
      k:=k+StrToInt(copy(IntToStr(i),j,1));
      l:=l+1;
    end;
  end;
  ShowMessage('rezultāts: '+IntToStr(k)+#13#10+'iteraciju skaits: '+IntToStr(l));
end;

:)

 

2013-02-20 boot.lv.zip

 

uupss..

šo gribēju pievienot (izpildes fails):

2013-02-20_exe.zip

Link to comment
Share on other sites

Yeah, about this - mums vēl tik kruti kodi nav jāraksta. Mums vēl pats sākums pamatā, tāpēc tādas lietas kā IntToStr, ShowMessage u.c. netiek lietotas. Bet nu paldies par palīdzību! Katrā ziņā ir izdevies atrast risinājumu, tā kā viss kārtībā.:)

Link to comment
Share on other sites

Kāds risinājums tika atrasts? :)

Kaut kas no visa noderēja? Te jau 100% neviens priekšā nesaka, tikai pasniedz puslīdz loģiskā veidā.



Mums vēl tik kruti kodi nav jāraksta. Mums vēl pats sākums pamatā, tāpēc tādas lietas kā IntToStr, ShowMessage u.c. netiek lietotas. Bet nu paldies par palīdzību!

 

Šie jau arī paši, paši pamati. Ar kaut ko jau jāsāk.

Minētais kods veidots Delphi7, kas ir Pascal 'radinieks'. Uz Delphi ir vērts pāriet ar minimālām Pascal zināšanām, jo piesaista ar uzbūves un lietošanas vienkāršumu.

Link to comment
Share on other sites

Principā šādi:

program summa;
uses crt;
var i, x, a, b :longint;
begin
clrscr;
writeln('Skaitļu no 1 līdz 1000 ciparu summa ir:');
i:=1+2+3+4+5+6+7+8+9;
x:=i*10;
a:=x*10;
b:=a*3+1;
writeln(b);
readln;
end.

 

Protams, visu var vienā darbībā ielikt, bet nu šoreiz prasīts arī, lai parāda visas darbības, tad atdalīju uz vairākām, bet pamatā te arī ar 2 pietiktu. Īstenībā ideja par šādu variantu radās, kad pabakstīju to visu ar pildspalvu uz papīra un kalkulatoru rokā, kā arī mazliet piepalīdzēja tas, ka daži čaļi atrada rezultātu, jo vismaz zināju, kam ir jāsanāk.

Link to comment
Share on other sites

Nu tev jau ir vienkārši ierakstīts tas skaitlis, bet es vismaz ar reāliem aprēķiniem to ieguvu un pilnīgu loģiku. Respektīvi:

Skaitļi no 1-9 ir katrā desmitā. Simtā ir 10 desmiti (tātad tā rindiņa x:=i*10). Tūkstotī ir 10 simti (rindiņa a:=x*10), un visbeidzot rindiņa b:=a*3+1 <--- tā kā ir katrā simtā ir 3 vietas, kur tie skaitļi var izvietoties, ir jāreizina ar 3, kā arī jāpieskaita 1, jo skaitlis 1000 sāk jaunu simtu, kas nav iekļauts iepriekš, bet tur tomēr ir vēl 1 cipars, kas jāpieskaita. Rezultāts sanāk pareizs, tātad pagaidām man šis variants der, tiesa, vēl padomāšu par variantu ar FOR... TO... DO un citām funkcijām.

Link to comment
Share on other sites

Iepazīstoties ar atrisinājumu, ko piedāvā jaunais censonis un viņa kolēģi, visu cieņu, bet godīgi, biju ļoti vīlies.

Tika pārkāpts primārais programmētāju bauslis, kā no anekdotes:

 

Ar ko atšķiras politiķi/deputāti no programmētājiem? Programmētāju rakstītās programmas strādā.

 

Un te arī viss beidzas. Programmai ir jābūt universālai, protams, ar robežām. Manis piedāvātam variantam robeža ir Integer vērtība -2147483648 .. 2147483647. Ja nekļūdos.

Pagalam švaki, ja komandrindas apstrādā tikai skaitli 1000. Tos soļus, jo sevišķi: b:=a*3+1; skolotājs var nesaprast...

:download:


Atzīstu kļūdas. Godīgi, pats Pascal nepārzinu un nemāku. Pascal neinteresē, jo DOS veidā tas praktiski nekur nav lietojams.

Labots - Sanchus
Link to comment
Share on other sites

#5 ir 100% strādājošs kods, kas der jebkuram skaitlim. Gribēju iekļaut arī kādu kļūdu, lai autors iedziļinātos kodā, bet uzdevums un risinājums ir tik triviāls, ka to pat nevarēja īsti izdarīt.

 

Autora risinājums ir ļoti labs un optimāls (un arī domāšanas veids ir apsveicams!), bet der tikai skaitļiem, no kā var izvilkt logaritmu ar bāzi 10 (vai nu ar kādu autors ir izvēlējies operēt) - pārējais vienalga ir jāsarēķina citā veidā. Starp citu, tas 3 autora kodā ir log(1000).

 

#8, acīmredzot, ir rakstījis kāds, kas nekad nav mācījies programmēšanas pamatus. Par to liecina neoptimālais kods, kas balstīts uz simbolu virkņu konvertācijām un manipulācijām ar tām.

Link to comment
Share on other sites

Protams, zinu, ka nav mans variants ideāls un labākais, taču konkrētais uzdevums izpildās un šeit nekas cits man netiek prasīts. Bet, kā jau teicu, es vēl pameklēšu pats kādu variantu, kurā man būs iekļautas attiecīgās funkcijas. Tā kā laiks līdz piektdienas rītam, tad ir pilnīgi iespējams, ka rīt būs svaigāka galva un vēl ko izdomāšu. Kā jau teicu, paldies visiem, kas palīdzēja!:) Ja nu radīsies vēl kāds risinājums, iekopēšu arī šeit.:)

Link to comment
Share on other sites

#8, acīmredzot, ir rakstījis kāds, kas nekad nav mācījies programmēšanas pamatus.

 

Pamatus mācījos. Tikai, kad sāka čakarēt smadzenes, līdzīgi, kā rakstā #5, sapratu, ka tas nav priekš manis. Galvenais, lai strādā un ir doma saprotama, atbildot uz jautājumu-kāpēc šādi? Optimizācija un matemātika kodā lai paliek lietpratējiem.

Link to comment
Share on other sites

ieleja, miljonam kods neder :). Tad jau labāk stringos nulles pa pliko skaitīt, kā rakstīts uzdevumā #1 :)

Link to comment
Share on other sites

Леший

A man liekas, ka risinājums ir banāls. Mums ir skaitļi no 0 līdz 999, vai, lai vieglāk saprāstu, no 000 līdz 999. Šajā intervalā, uz katras pozīcijas katrs cipars no 0 līdz 9 parādās 100 reizes. Rezultāts būs summa no 0 līdz 9 (45) reiz cik reizes parādās katrs cipars (100) reiz poziciju skaits (3), jeb 13500.

Protams, pareizāk to simtnieku izrēķināt šādi: 10^(poziciju skaits-1). Tas ir, lai paredzētu, ka to pašu algoritmu var izmantot intervāliem no 0 līdz 10000 utt.

function calcSum(power = 3){
  return 45 * pow(10, power-1) * power;
}
Link to comment
Share on other sites

Lūk ir variants, pie kura nonācu šodien:

program summa2;
uses crt;
var i, count, n1, n2, n3:integer;
begin
clrscr;
for i:=1 to 999 do
begin
n1:=i div 100;
n2:=(i mod 100) div 10;
n3:=(i mod 100) mod 10;
count:=count+n1+n2+n3;
end;
count:=count+1;
writeln('Skaitļu no 1 līdz 1000 ciparu summa ir ', count);
readln;
end.

 

:)

Link to comment
Share on other sites

Kā jau teicu - šeit nekur netika prasīts kas cits, šis ir konkrēts uzdevums, kas bija jāizpilda un jāizveido tā, lai notiktu prasītā darbība, nevis "ja nu notiks tas vai tas". Attiecīgi, ja būtu teikts, ka jāievada skaitlis un tad jāaprēķina ciparu summa, tad arī būtu cits variants jāmeklē! Lasīt dažiem te jāpamācās!

Link to comment
Share on other sites

Lūdzu nerunā, ja neko nezini par mani. Jā, es varbūt nezinu ne Paskālu, ne C++, ne arī ko citu no šāda veida programmēšanas valodām, taču zinu pietiekami daudz no php, html un css, kurus pašlaik arī apgūstu. Kā arī, ja nu nepamanīji, tad šī ir vidusskola, es TIKAI MĀCOS. Lasi to, ko esmu rakstījis iepriekš un varbūt sapratīsi.

 

VAJADZĪGAIS ATRASTS, SLĒDZAM CIET, LAI LASĪT NEPRATĒJI NEPIEDI*Š!

Labots - ExDec
Link to comment
Share on other sites

Леший

Autor, tā intereses pēc - tu apjēdz starpību starp manu kodu un tavu?

Man ir ļoti lielas aizdomas, ka esi izvēlējies nepareizo profesiju  :moil:

Link to comment
Share on other sites

Johaidī, te daži tiešām nemāk lasīt! Tā ir VIDUSSKOLA un man tas ir OBLIGĀTAIS PRIEKŠMETS, nevis izvēles priekšmets. Un es arī minēju, ka sākās tikai šogad un vēl nezinu visas funkcijas. Tiešām tik grūti saprast šīs lietas? Kā jau minēju, slēdzam ciet, citādi te lasītnepratēja visu piedi*sīs vēl vairāk.

 

Tik tiešām, ja nu nav nekas, ko teikt, tad lūdzu muti ciet. Ļoti šaubos, ka kāds no šeit esošajiem cilvēkiem sāka ar sarežģītākajām lietām un bija uzreiz profesionālis. Klauni... :jester:

Labots - ExDec
Link to comment
Share on other sites

Piedod, ka nelietoju šo forumu ikdienā un nepārzinu visas iespējas. Jāiet laikam būs nošauties tagad...

 

Kā arī man ļoti patīk šis variants, kad tiek ierakstīta atbilde, kura ātri vien tiek izlabota uz kaut ko nejēdzīgu. Interesanti, kāpēc tā? Kā arī, piedod, bet nu neredzu es nekur pogu, kas ļautu man slēgt tēmu. Ja nu vienīgi viņa ir kaut kur smuki paslēpta, jo man šādas pogas nav.

Labots - ExDec
Link to comment
Share on other sites

Primārt! Klauna kungs!

 

Kā cilvēku kuris vidusskolu ir beiguši 15-30 gadus atpakaļ, var zināt kās par buļā kakām tagad notiek vidusskolā.

 

Viena lieta izpildīt keksīša pēc, cita lieta sports: vesels bars ar programmētājiem to arī izdarīja un tev palīdzēja. Un tāda ir tava pateicība? Klauni. Tulīt atnāks ļaunais atmis un aizvērs tēmu ciet un bonusā vēl tev banaū iedos. Cieni citus un citi arī tevi cienīs. Tas ka tu kaut ko nezini, tās ir tavas porblēmas. Pasaki paldies ka tavā vietā cilvēki mājadarbu izpildīja. Ķēms tāds!

Link to comment
Share on other sites

Izveido kontu, vai pieraksties esošajā, lai komentētu

Jums ir jābūt šī foruma biedram, lai varētu komentēt tēmas

Izveidot jaunu kontu

Piereģistrējies un izveido jaunu kontu, tas būs viegli!

Reģistrēt jaunu kontu

Pierakstīties

Jums jau ir konts? Pierakstieties tajā šeit!

Pierakstīties tagad!
 Share

×
×
  • Izveidot jaunu...