Pascal: Jumlah digit dalam jangkauan

Berapa banyak bilangan bulat positif yang kurang dari 1000 yang jumlah angka-angkanya sama dengan 6?

Tidak tahu bagaimana memulainya menggunakan Pascal. Di Python, skrip saya akan terlihat seperti:

a = 1
b = 1000
for i in range(a,b):
........

Saya tidak tahu cara mengakses angka tersebut. Jika seseorang dapat memberi tahu saya, saya seharusnya dapat membuat beberapa kemajuan dari sini.


person Cloud    schedule 19.12.2013    source sumber
comment
Saya mencoba belajar menggunakan Pascal untuk sebuah kompetisi. Saya perlu belajar menghadapi situasi seperti ini, karena akan ada masalah serupa dalam ujian.   -  person Cloud    schedule 19.12.2013
comment
Wow. Saya belum melihat kode Pascal dalam 15 atau 20 tahun terakhir. Pertanyaan Anda adalah ledakan dari masa lalu! Penasaran, bolehkah saya bertanya, bagaimana kabar Anda tentang program dalam Pascal hari ini?   -  person thb    schedule 19.12.2013
comment
Saya melihat jawaban Anda untuk @MrPhi. Saya pernah kuliah di Pascal, tapi saat itu tahun 1986. Semoga ada yang ingat Pascalnya. Saya sudah melupakannya.   -  person thb    schedule 19.12.2013
comment
Adakah yang bisa menyarankan kode Python setidaknya sebagai permulaan?   -  person Cloud    schedule 19.12.2013
comment
@Cloud Pikirkan cara untuk mendapatkan digit terakhir dari bilangan integral apa pun. Kemudian pikirkan cara untuk mengubah suatu bilangan dengan menghilangkan digit terakhirnya. Pikirkan tentang bagaimana hal ini dapat dilakukan secara aritmatika. Misalnya cara mendapatkan 72 dari 720 atau 725.   -  person Ingo    schedule 19.12.2013


Jawaban (3)


Inilah solusinya, tanpa konversi ke string yang tidak perlu. Ia bekerja dengan mendapatkan digit paling kanan, menambahkan nilainya ke akumulator Total, lalu menghapus digit paling kanan dengan melakukan pembagian bilangan bulat dengan 10, dan mengulangi proses tersebut hingga tidak ada yang tersisa.

var
  Value, Digit, Total, NumValues: Integer;
  i: Integer;
begin
  NumValues := 0;

  for i := 1 to 1000 do
  begin
    Value := i;
    Total := 0;

    repeat
      Digit := Value mod 10;
      Total := Total + Digit;
      Value := Value div 10;
    until Value = 0;

    if Total = 6 then
      Inc(NumValues);
  end;

  WriteLn ('I found ', NumValues, ' numbers whose digits add up to six');
  ReadLn;
end.
person Ken White    schedule 19.12.2013
comment
Itu memberikan jawaban yang benar yaitu 28. Jika ada yang tertarik, saya menyelesaikannya dengan menyadari pola sederhana di sini. Ada 7 angka yang dijumlahkan menjadi 6 antara 06-60. Yaitu 6 angka yang dijumlahkan menjadi 6 dari 105-150, 5 angka antara 204-240 dan seterusnya. Polanya adalah 7+6+5+4+3+2+1=28. Itu hanya untuk memastikan bahwa aku tidak menggunakan ini sebagai satu-satunya sarana untuk menyelesaikan pekerjaan rumahku. Saya tahu jawabannya, tapi ingin mensimulasikan algoritma saya dan membutuhkan bantuan Anda untuk melakukannya. - person Cloud; 20.12.2013

Pertanyaan Anda pada dasarnya hanyalah "bagaimana perulangan for dilakukan dalam Pascal"... Periksa saja dokumentasinya, mis. di sini: http://pascal-programming.info/lesson4.php#JUMP3

Aku juga mencium bau pekerjaan rumah. ;)

person Draugr    schedule 19.12.2013
comment
Terima kasih untuk tautannya, tetapi algoritma apa yang akan digunakan? - person Cloud; 19.12.2013
comment
Saya tidak akan menyelesaikan soal Olimpiade Informatika Australia untuk Anda ;) Untuk setiap angka, Anda harus memeriksa apakah jumlah digitnya sama dengan 6 atau tidak. Jika Anda tidak berhasil melakukannya dengan informasi tersebut, Anda akan menghadapi masalah yang jauh lebih besar di kemudian hari. - person Draugr; 19.12.2013

Mengabaikan komentar sinis tentang Pascal (bahasa ini masih layak digunakan dan berada di jantung Delphi; sintaksisnya telah dipinjam untuk beberapa bahasa 'modern'), pertanyaan ini sebenarnya lebih rumit dari yang diperkirakan. Pertama saya akan tunjukkan programnya, lalu saya jelaskan.

var
 i, j, found, total: integer;
 s: string;

begin
 found:= 0;  // how many numbers whose digits add up to six
 for i:= 1 to 1000 do
  begin
   s:= inttostr (i);
   total:= 0;
   for j:= 1 to length (s) do
    total:= total + ord (s[j]) - ord ('0');
   if total = 6 then found:= found + 1;
  end;
 writeln ('I found ', found, ' numbers whose digits add up to six');
 readln
end.

Kuncinya adalah mengubah nomor indeks (i) menjadi string (itulah baris 'inttostr (i)'), lalu mengulangi digit string tersebut dan menjumlahkannya.

person No'am Newman    schedule 19.12.2013
comment
Sayang sekali pertanyaannya tidak menyertakan jangan gunakan string. - person Ingo; 19.12.2013