1.5 แบบฝึกหัด
เขียนแต่ละข้อเป็นไฟล์ใหม่ใน Code::Blocks รันแล้วเทียบกับผลลัพธ์ที่ต้องได้ให้ตรงทุกตัวอักษร รวมถึงช่องว่างและการขึ้นบรรทัด ติดจริงๆ ค่อยเปิดคำใบ้ และเปิดเฉลยหลังทำเสร็จแล้วเท่านั้น
ข้อ 1 พื้นที่และเส้นรอบรูป
ห้องเรียนเป็นสี่เหลี่ยมผืนผ้า กว้าง W เมตร ยาว H เมตร ครูอยากรู้ว่าต้องซื้อพื้นยางกี่ตารางเมตร และต้องใช้เส้นขอบยาวกี่เมตร ให้หาพื้นที่และเส้นรอบรูปของห้อง
ข้อมูลเข้า
บรรทัดเดียว มีจำนวนเต็ม W และ H คั่นด้วยช่องว่าง โดยที่ 1 ≤ W, H ≤ 10000
ข้อมูลออก
บรรทัดแรกพิมพ์พื้นที่ บรรทัดที่สองพิมพ์เส้นรอบรูป
12 784
38ดูคำใบ้
พื้นที่คือกว้างคูณยาว เส้นรอบรูปคือผลรวมของด้านทั้งสี่ ด้านกว้างสองด้าน ด้านยาวสองด้าน
ดูเฉลย
#include <stdio.h>
int main()
{
int width, height;
scanf("%d %d", &width, &height);
printf("%d\n", width * height);
printf("%d\n", 2 * (width + height));
return 0;
}ข้อ 2 ตัวอักษรลำดับที่ N
ห้องสอบมีโต๊ะ 26 แถว ติดป้ายเป็นตัวอักษรภาษาอังกฤษเรียงจาก A ถึง Z แถวที่ 1 คือ A แถวที่ 2 คือ B ไปเรื่อยๆ ให้บอกว่าแถวที่ N ติดป้ายตัวอะไร ทั้งตัวพิมพ์ใหญ่และตัวพิมพ์เล็ก
ข้อมูลเข้า
จำนวนเต็ม N หนึ่งตัว โดยที่ 1 ≤ N ≤ 26
ข้อมูลออก
บรรทัดเดียว พิมพ์ตัวพิมพ์ใหญ่ ช่องว่างหนึ่งช่อง แล้วตามด้วยตัวพิมพ์เล็ก
3C cดูคำใบ้
ตัวอักษรเรียงกันมีรหัส ASCII เรียงกัน ตัวที่ 1 คือ 'A' ตัวที่ 2 คือ 'A' + 1 ตัวที่ N จึงเป็น 'A' บวกเท่าไร แล้วพิมพ์ด้วย %c
ดูเฉลย
#include <stdio.h>
int main()
{
int n;
scanf("%d", &n);
printf("%c %c\n", 'A' + n - 1, 'a' + n - 1);
return 0;
}ข้อ 3 คะแนนเฉลี่ย
น้องสอบสามวิชา ได้คะแนน A B และ C ให้หาคะแนนเฉลี่ยของทั้งสามวิชา
ข้อมูลเข้า
บรรทัดเดียว มีจำนวนเต็ม A B C คั่นด้วยช่องว่าง โดยที่ 0 ≤ A, B, C ≤ 100
ข้อมูลออก
คะแนนเฉลี่ย พิมพ์ด้วย %f ของ printf ซึ่งจะได้ทศนิยม 6 ตำแหน่ง
70 85 9081.66666760 60 9070.000000ดูคำใบ้
ผลรวมของคะแนนเป็น int ถ้าหารด้วย 3 จะได้จำนวนเต็ม ลองหารด้วย 3.0 หรือแปลงชนิดเป็น double ก่อนหาร
ดูเฉลย
#include <stdio.h>
int main()
{
int a, b, c;
scanf("%d %d %d", &a, &b, &c);
printf("%f\n", (a + b + c) / 3.0);
return 0;
}ข้อ 4 แปลงวินาที
นาฬิกาจับเวลาแสดงเวลาเป็นวินาทีล้วน เช่น 3725 วินาที อ่านแล้วไม่รู้ว่านานแค่ไหน ให้แปลง S วินาทีเป็นชั่วโมง นาที และวินาที จำนวนชั่วโมงเกิน 24 ได้ ไม่ต้องแปลงเป็นวัน
ข้อมูลเข้า
จำนวนเต็ม S หนึ่งตัว โดยที่ 0 ≤ S ≤ 1000000000
ข้อมูลออก
บรรทัดเดียว มีจำนวนชั่วโมง นาที และวินาที คั่นด้วยช่องว่าง นาทีและวินาทีต้องอยู่ระหว่าง 0 ถึง 59
37251 2 5ดูคำใบ้
หนึ่งชั่วโมงมี 3600 วินาที หาชั่วโมงด้วย / 3600 วินาทีที่เหลือคือ % 3600 แล้วแบ่งที่เหลือเป็นนาทีกับวินาทีด้วย 60 แบบเดียวกับตัวอย่างแปลงนาทีในหน้า 1.2
ดูเฉลย
#include <stdio.h>
int main()
{
int total;
scanf("%d", &total);
int hours = total / 3600;
int minutes = total % 3600 / 60;
int seconds = total % 60;
printf("%d %d %d\n", hours, minutes, seconds);
return 0;
}ข้อ 5 กลับหลักเลขสามหลัก
ป้ายทะเบียนเลขสามหลักสะท้อนในกระจกแล้วอ่านกลับหลัง ให้กลับลำดับหลักของเลขสามหลัก N แล้วพิมพ์ออกมาเป็นตัวเลข ถ้าผลมีเลข 0 นำหน้า ให้ตัดทิ้ง เช่น 120 กลับแล้วได้ 021 ต้องพิมพ์เป็น 21
ข้อมูลเข้า
จำนวนเต็ม N หนึ่งตัว โดยที่ 100 ≤ N ≤ 999
ข้อมูลออก
ตัวเลขที่กลับหลักแล้ว ไม่มีเลข 0 นำหน้า
47227412021ดูคำใบ้
แยกหลักร้อย หลักสิบ หลักหน่วยด้วย / กับ % ก่อน แล้วประกอบกลับเป็นตัวเลขใหม่ด้วยการคูณ 100 และ 10 ไม่ต้องพิมพ์ทีละหลัก เพราะ %d ไม่พิมพ์ 0 ข้างหน้าให้อยู่แล้ว
ดูเฉลย
#include <stdio.h>
int main()
{
int n;
scanf("%d", &n);
int hundreds = n / 100;
int tens = n / 10 % 10;
int ones = n % 10;
printf("%d\n", ones * 100 + tens * 10 + hundreds);
return 0;
}ข้อ 6 ลูกอมในกล่อง
โรงงานบรรจุลูกอม N กล่อง กล่องละ M เม็ด แล้วแจกไปให้โรงเรียนต่างๆ รวม K เม็ด ให้หาว่าเหลือลูกอมกี่เม็ด
ข้อมูลเข้า
บรรทัดเดียว มีจำนวนเต็ม N M K คั่นด้วยช่องว่าง โดยที่ 1 ≤ N, M ≤ 1000000000 และ 0 ≤ K ≤ N × M
ข้อมูลออก
จำนวนลูกอมที่เหลือ
3 20 1545ดูคำใบ้
N กับ M มากได้ถึง 109 ผลคูณจึงถึง 1018 เกิน int ไปมาก ใช้ long long ทุกตัว และรับกับพิมพ์ด้วย %lld ระวังกับดัก int คูณ int ในหน้า 1.3
ดูเฉลย
#include <stdio.h>
int main()
{
long long boxes, per_box, given;
scanf("%lld %lld %lld", &boxes, &per_box, &given);
printf("%lld\n", boxes * per_box - given);
return 0;
}ข้อ 7 แผงไข่
ฟาร์มเก็บไข่ได้ N ฟอง แผงไข่หนึ่งแผงใส่ได้ไม่เกิน K ฟอง ให้หาว่าต้องใช้แผงไข่อย่างน้อยกี่แผงจึงจะใส่ไข่ได้ครบทุกฟอง แผงสุดท้ายไม่จำเป็นต้องเต็ม
ข้อนี้ทำได้ด้วยตัวดำเนินการที่เรียนในบทนี้ ไม่ต้องใช้ if
ข้อมูลเข้า
บรรทัดเดียว มีจำนวนเต็ม N และ K คั่นด้วยช่องว่าง โดยที่ 1 ≤ N, K ≤ 1000000000
ข้อมูลออก
จำนวนแผงที่น้อยที่สุด
65 30360 302ดูคำใบ้
N / K ปัดเศษทิ้ง ถ้าหารไม่ลงตัว จะขาดไปหนึ่งแผง ลองคิดว่าถ้าบวกอะไรเข้าไปที่ N ก่อนหาร จะทำให้ผลปัดขึ้นเฉพาะตอนหารไม่ลงตัว ลองกับ N = 60, 61 และ 90 เมื่อ K = 30 แล้วตรวจขอบเขตด้วยว่าค่าที่บวกแล้วยังไม่เกิน int
ดูเฉลย
#include <stdio.h>
int main()
{
int eggs, per_tray;
scanf("%d %d", &eggs, &per_tray);
printf("%d\n", (eggs - 1) / per_tray + 1);
return 0;
}ข้อ 8 ผลรวมตั้งแต่ A ถึง B
บันไดขึ้นหอคอยมีขั้นหมายเลข 1, 2, 3 ไปเรื่อยๆ ขั้นที่ i สูง i เซนติเมตร น้องเดินจากขั้น A ขึ้นไปจนถึงขั้น B รวมทั้งสองขั้นนั้นด้วย ให้หาว่าความสูงของทุกขั้นที่เดินผ่านรวมกันเป็นกี่เซนติเมตร หรือก็คือ A + (A + 1) + ... + B
ข้อมูลเข้า
บรรทัดเดียว มีจำนวนเต็ม A และ B คั่นด้วยช่องว่าง โดยที่ 1 ≤ A ≤ B ≤ 1000000000
ข้อมูลออก
ผลรวมตั้งแต่ A ถึง B
3 7251 1005050ดูคำใบ้
จับคู่ตัวแรกกับตัวสุดท้าย ตัวที่สองกับตัวรองสุดท้าย ทุกคู่มีผลรวมเท่ากันคือ A + B และมีตัวเลขทั้งหมด B - A + 1 ตัว ผลรวมจึงเป็น (A + B) × (B - A + 1) / 2 ผลนี้ใหญ่ถึงประมาณ 5 × 1017 ต้องใช้ long long และต้องคูณก่อนหาร
ดูเฉลย
#include <stdio.h>
int main()
{
long long first, last;
scanf("%lld %lld", &first, &last);
long long count = last - first + 1;
printf("%lld\n", (first + last) * count / 2);
return 0;
}