ปาสคาล: ผลรวมของตัวเลขภายในช่วง

จำนวนเต็มบวกที่น้อยกว่า 1,000 มีกี่จำนวนที่มีผลรวมของหลักเท่ากับ 6?

ไม่รู้ว่าจะเริ่มสิ่งนี้โดยใช้ Pascal ได้อย่างไร บน Python สคริปต์ของฉันจะมีลักษณะดังนี้:

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

ฉันไม่รู้ว่าจะเข้าถึงตัวเลขได้อย่างไร หากมีใครช่วยบอกฉันได้ ฉันควรจะก้าวหน้าไปจากที่นี่ได้


person Cloud    schedule 19.12.2013    source แหล่งที่มา
comment
ฉันกำลังพยายามเรียนรู้การใช้ภาษาปาสคาลเพื่อการแข่งขัน ฉันต้องเรียนรู้ที่จะรับมือกับสถานการณ์เช่นนี้ เพราะข้อสอบจะมีปัญหาคล้าย ๆ กัน   -  person Cloud    schedule 19.12.2013
comment
ว้าว. ฉันไม่เห็นรหัสปาสคาลในช่วง 15 หรือ 20 ปีที่ผ่านมา คำถามของคุณคือระเบิดจากอดีต! ด้วยความอยากรู้อยากเห็น วันนี้คุณมาโปรแกรมที่ Pascal ได้อย่างไร?   -  person thb    schedule 19.12.2013
comment
ฉันเห็นคำตอบของคุณต่อ @MrPhi ฉันเคยเรียนหลักสูตรวิทยาลัยที่ปาสคาลครั้งหนึ่ง แต่ในปีนั้นคือปี 1986 หวังว่าคงมีคนที่นี่จำปาสคาลได้ ฉันลืมมันไปแล้ว   -  person thb    schedule 19.12.2013
comment
มีใครพอจะแนะนำโค้ด Python ให้กับผู้เริ่มต้นได้บ้างเป็นอย่างน้อย   -  person Cloud    schedule 19.12.2013
comment
@Cloud คิดวิธีรับเลขหลักสุดท้ายของจำนวนเต็มใดๆ จากนั้นให้คิดหาวิธีแปลงตัวเลขโดยการลบหลักสุดท้ายออก ลองคิดดูสิว่าจะคำนวณทางคณิตศาสตร์ได้อย่างไร ตัวอย่างเช่น วิธีรับ 72 จาก 720 หรือ 725   -  person Ingo    schedule 19.12.2013


คำตอบ (3)


นี่คือวิธีแก้ปัญหา โดยไม่ต้องแปลงเป็นสตริงโดยไม่จำเป็น มันทำงานโดยการหาหลักขวาสุด เพิ่มค่าของมันให้กับตัวสะสม Total จากนั้นลบหลักขวาสุดออกโดยหารจำนวนเต็มด้วย 10 และทำซ้ำขั้นตอนนี้จนกว่าเราจะไม่มีอะไรเหลือ

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
นั่นให้คำตอบที่ถูกต้องคือ 28 ถ้าใครสนใจก็แก้ด้วยมือจนเข้าใจรูปแบบง่ายๆ ตรงนี้ มีตัวเลข 7 ตัวที่รวมกันได้ 6 ระหว่าง 06-60 คือตัวเลข 6 ตัวที่บวกเข้ากับ 6 ตั้งแต่ 105-150, 5 ตัวระหว่าง 204-240 เป็นต้น รูปแบบคือ 7+6+5+4+3+2+1=28 นั่นเป็นเพียงเพื่อยืนยันว่าฉันไม่ได้ใช้สิ่งนี้เป็นวิธีเดียวในการทำการบ้านให้เสร็จ ฉันรู้คำตอบ แต่ต้องการจำลองอัลกอริทึมของฉัน และต้องการความช่วยเหลือจากคุณเพื่อที่จะทำเช่นนั้น - person Cloud; 20.12.2013

โดยพื้นฐานแล้วคำถามของคุณเป็นเพียง "for loop ทำอย่างไรใน Pascal" ... เพียงตรวจสอบเอกสารประกอบเช่น ที่นี่: http://pascal-programming.info/lesson4.php#JUMP3

ฉันได้กลิ่นการบ้านด้วย ;)

person Draugr    schedule 19.12.2013
comment
ขอบคุณสำหรับลิงค์ แต่อัลกอริทึมจะเป็นอย่างไร? - person Cloud; 19.12.2013
comment
ฉันจะไม่ตอบคำถาม Australian Informatics Olympiad ให้คุณ ;) สำหรับทุกตัวเลข คุณต้องตรวจสอบว่าผลรวมของตัวเลขนั้นเท่ากับ 6 หรือไม่ หากคุณไม่สามารถดำเนินการกับข้อมูลนั้นได้ คุณจะประสบปัญหาที่ใหญ่กว่ามากในภายหลัง - person Draugr; 19.12.2013

โดยไม่สนใจความคิดเห็นที่เยาะเย้ยเกี่ยวกับปาสคาล (ยังคงเป็นภาษาที่ใช้งานได้และเป็นหัวใจของเดลฟี ไวยากรณ์ของมันถูกยืมมาสำหรับภาษา 'สมัยใหม่' หลายภาษา) คำถามนี้มีความซับซ้อนมากกว่าที่คิด ก่อนอื่นผมจะแสดงโปรแกรมก่อน แล้วผมจะอธิบาย

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.

กุญแจสำคัญคือการแปลงหมายเลขดัชนี (i) เป็นสตริง (นั่นคือบรรทัด 'inttostr (i)') จากนั้นวนซ้ำตัวเลขของสตริงแล้วรวมเข้าด้วยกัน

person No'am Newman    schedule 19.12.2013
comment
น่าเสียดายที่คำถามไม่รวมถึงอย่าใช้สตริง - person Ingo; 19.12.2013