34
ปปปปปป ปปปปปปป [email protected] 418115: ปปปปปปปปปป ปปปปปปปปป ปปปปปปป while (2)

418115: การโปรแกรมโครงสร้าง คำสั่ง while (2)

  • Upload
    isha

  • View
    39

  • Download
    4

Embed Size (px)

DESCRIPTION

418115: การโปรแกรมโครงสร้าง คำสั่ง while (2). ประมุข ขันเงิน [email protected]. โปรแกรมเช็คจำนวนเฉพาะ. ให้ผู้ใช้ป้อนจำนวนเต็มบวกมาหนึ่งตัว แล้วบอกว่ามันเป็นจำนวนเฉพาะหรือไม่ Enter n: 2 2 is a prime number. Enter n: 7 7 is a prime number. Enter n: 6 6 is not a prime number. - PowerPoint PPT Presentation

Citation preview

Page 1: 418115:  การโปรแกรมโครงสร้าง คำสั่ง  while (2)

ประมข ขนเงน[email protected]

418115: การโปรแกรมโครงสราง คำาสง while (2)

Page 2: 418115:  การโปรแกรมโครงสร้าง คำสั่ง  while (2)

โปรแกรมเชคจำานวนเฉพาะใหผใชปอนจำานวนเตมบวกมาหนงตวแลวบอกวามนเปนจำานวนเฉพาะหรอไม

Enter n: 22 is a prime number.

Enter n: 77 is a prime number.

Enter n: 66 is not a prime number.

Page 3: 418115:  การโปรแกรมโครงสร้าง คำสั่ง  while (2)

จำานวนเฉพาะจำานวนเฉพาะคออะไร?

จำานวนเตมบวก ( ฉะนนไมนบ 0 หรอจำานวนเตมลบ)ไมใชจำานวนเตมลบแยกตวประกอบไมได กลาวคอ จำานวนเตมบวกทหารมนลงตวมเพยงแคสองตว คอ 1 กบตวมนเอง

เชควาจำานวนเปนจำานวนเฉพาะไดอยางไร? สมมตวาจำานวนทเราตองการเชคคอ n จำานวนทหารมนไดมแคสองตวคอ 1 กบ n ดงนน 2, 3, 4, …, n-1 ตองหารมนไมลงตว ฉะนนเราเชค 2, 3, 4, …, n-1 ทละตววาหาร n ลงตวหรอไม?

มสกตวทหารลงตว ไมใชจำานวนเฉพาะ ไมมสกตวทหารลงตว เปนจำานวนเฉพาะ

Page 4: 418115:  การโปรแกรมโครงสร้าง คำสั่ง  while (2)

ออกแบบโปรแกรม รบ n ตงลปโดยใช k เปนตวแปร counterk มคา 2 ถง n-1 สำาหรบ k แตละคาเชควา n % k == 0 หรอไม? ถาใช ใหจำาไววามเลขหารลงตว

หลงจากลปเสรจการทำางาน ใหไปเชความเลขหารลงตวหรอไม ถาใช แสดงวาไมเปนจำานวนเฉพาะ ถาไมใช แสดงวาเปนจำานวนเฉพาะ

Page 5: 418115:  การโปรแกรมโครงสร้าง คำสั่ง  while (2)

ลปint is_prime = 1;int k = 2;while (k < n){ if (n % k == 0) is_prime = 0; k++;}

Page 6: 418115:  การโปรแกรมโครงสร้าง คำสั่ง  while (2)

ทงโปรแกรม#include <stdio.h>int main(){ int n; printf("Enter n: "); scanf("&d", &n); int is_prime = 1; int k = 2; while (k < n) { if (n % k == 0) is_prime = 0; k++; } if (is_prime && n != 1) printf("%d is a prime number.\n", n); else printf("%d is not a prime number.\n", n); return 0;}

Page 7: 418115:  การโปรแกรมโครงสร้าง คำสั่ง  while (2)

คำาสง break เคยเจอมาแลวในคำาสง switchสามารถใสไวตรงในกไดในสวนทเปนคำาสงทตองการวนซำา

ใน คำาสง while เมอเจอคำาสง break แลวลป while จะเลกการทำางานทนท

มกใชควบคกบคำาสง if เสมอ

Page 8: 418115:  การโปรแกรมโครงสร้าง คำสั่ง  while (2)

โปรแกรมเชคจำานวนเฉพาะ เราไมจำาเปนตองให k มคาตงแต 2 ถง n-1 เสมอ ถามเลขสกตวหารลงตว แสดงวาไมใชจำานวนเฉพาะแลวดงนนไมมความจำาเปนตองเชคจำานวนอนอก

เราตองการหยดการทำางานของลปทนทท n%k == 0 สามารถใชคำาสง break ไดในกรณน

Page 9: 418115:  การโปรแกรมโครงสร้าง คำสั่ง  while (2)

ลปใหมทเรวขนint is_prime = 1;int k = 2;while (k < n){ if (n % k == 0) { is_prime = 0; break; } k++;}

Page 10: 418115:  การโปรแกรมโครงสร้าง คำสั่ง  while (2)

โปรแกรมสำาหรบแยกตวประกอบรบจำานวนเตมหนงตวจากผใชแยกตวประกอบของจำานวนเตมทผใชใหมา

Enter a positive integer: 128128 = 2 * 2 * 2 * 2 * 2 * 2 * 2

Enter a positive integer: 365365 = 5 * 73

Enter a positive integer: 9797 = 97

Page 11: 418115:  การโปรแกรมโครงสร้าง คำสั่ง  while (2)

การแยกตวประกอบแยกตวประกอบคออะไร?

การเขยนจำานวนเตมอยในรปผลคณของจำานวนเฉพาะ

ทำาอยางไรดถงจะแยกได สมมตวาเลขทเราตองการจะแยกตวประกอบคอ n สมมตให n > 1 ( กรณ n = 1 ไมมอะไร) หาจำานวนเฉพาะมาสกตวทหาร n ลงตว

สมมตวาจำานวนเฉพาะนคอ p ถาจำานวนเฉพาะนนหาร n ลงตว เรากพมพมน แลวลบมนออกจากตวประกอบของ n ดวยการสง n = n/p

Page 12: 418115:  การโปรแกรมโครงสร้าง คำสั่ง  while (2)

การแยกตวประกอบ48

หาร 2 ลงตว48 24

24 หาร 2 ลงตว24 12

12 หาร 2 ลงตว12 6

6 หาร 2 ลงตว6 3

3 หาร 3 ลงตว3 1

จบการทำางาน

Page 13: 418115:  การโปรแกรมโครงสร้าง คำสั่ง  while (2)

หาจำานวนเฉพาะทหาร n ลงตว สมมตวา n > 1 ลองเปลยนคำาถามเปนวา

“ จำานวนเฉพาะทนอยทสดทหาร n ลงตวคออะไร?” สงเกต คำาถามนมคำาตอบเดยวกบคำาถามทวา

“ จำานวนทนอยทสดทมากกวา 1 ทหาร n ลงตวคออะไร?”

Page 14: 418115:  การโปรแกรมโครงสร้าง คำสั่ง  while (2)

หาจำานวนเฉพาะทหาร n ลงตวทำาไม?

สมมตวา m เปนจำานวนทนอยทสดทมากกวา 1 ทหาร n ลงตว

สมมตอกวา m ไมใชจำานวนเฉพาะ แสดงวา m ตวแยกตวประกอบได สมมตให p เปนจำานวน

เฉพาะทหาร m ลงตว เรารวา p < m และ p > 1 แต p กหาร n ลงตว ฉะนน m ไมใชจำานวนทนอยทสดทมากกวา 1 ทหาร n ลงตวเกดขอขดแยง

Page 15: 418115:  การโปรแกรมโครงสร้าง คำสั่ง  while (2)

หาจำานวนเฉพาะทหาร n ลงตว หาจำานวนเฉพาะทนอยทสดทหาร n ลงตว

คอการหาจำานวนทมากกวา 1 ทนอยทสดทหาร n ลงตวหาอยางไร?

เรมจาก p = 2 เชควา n%p == 0 หรอไม?ถาใชกจบ ถาไมใชกเพมคา p ขนหนง

Page 16: 418115:  การโปรแกรมโครงสร้าง คำสั่ง  while (2)

หาจำานวนเฉพาะทหาร n ลงตวint p = 2;while (n % p != 0) p++;

Page 17: 418115:  การโปรแกรมโครงสร้าง คำสั่ง  while (2)

ลป หา p หนงตวทหาร n ลงตว พมพ p ลบ p ออกจากความเปนตวประกอบของ n

n = n/pหยดเมอไหร?

n == 1

Page 18: 418115:  การโปรแกรมโครงสร้าง คำสั่ง  while (2)

ลปprintf("%d = ", n);while (n > 1){ int p = 2; while (n % p != 0) p++; if (n/p==1) printf("%d\n", p); else printf("%d * ", p); n = n/p;}

Page 19: 418115:  การโปรแกรมโครงสร้าง คำสั่ง  while (2)

ทงโปรแกรม#include <stdio.h>int main(){ int n; printf("Enter a positive integer: "); scanf("&d", &n); if (n == 1) printf("1 = 1\n"); else { printf("%d = ", n); while (n > 1) { int p = 2; while (n % p != 0) p++; if (n/p==1) printf("%d\n", p); else printf("%d * ", p); n = n/p; } } return 0;}

Page 20: 418115:  การโปรแกรมโครงสร้าง คำสั่ง  while (2)

เลขพาลนโดรมเลขพาลนโดรมคอเลขทเขยนจากหลงไปหนาแลวมคาเทาเดม เชน 12321 เปนเลขพาลนโดรม แต 123 ไมใช เพราะ 123 ไมเทากบ 321

สงเกตวาเลขพาลนโดรมจะตอทายดวย 0 ไมได

Page 21: 418115:  การโปรแกรมโครงสร้าง คำสั่ง  while (2)

โปรแกรมตรวจสอบเลขพาลนโดรมอานจำานวนเตมบวกจากผใชหนงตว

ชนด int ไมเกน 6 หลก

แลวบอกวาเลขนนเปนพาลนโดรมหรอไม

Enter n: 1232112321 is a palindrome

Enter n: 45674567 is not a palindrome

Page 22: 418115:  การโปรแกรมโครงสร้าง คำสั่ง  while (2)

ออกแบบโปรแกรมพาลนโดรมคออะไร?

เขยนกลบหลงแลวไดตวเตมจะทดสอบพาลนโดรมอยางไร?

กลองเขยนกลบหลงดแลวเทยบวาเทากบตวเดมหรอไม

Page 23: 418115:  การโปรแกรมโครงสร้าง คำสั่ง  while (2)

เขยนกลบหลง สมมตวามเลข n =123456 สามารถเขยนกลบหลงโดยการมเลขอก 1 ตว ตอนแรก

เปน 0กระบวนการ

n = 123456 m = 0n = 12345 m = 6n = 1234 m = 65n = 123 m = 654n = 12 m = 6543n = 1 m = 65432n = 0 m = 654321

Page 24: 418115:  การโปรแกรมโครงสร้าง คำสั่ง  while (2)

เขยนกลบหลงในแตละขน

ดงตวหลงของ n ออกมา เอาตวหลงของ n ไปตอทาย m ลบตวหลงออกจาก n

กลาวคอint d = n % 10;n = n / 10;m = m*10 + d;

หยดเมอใด? เมอ n = 0

Page 25: 418115:  การโปรแกรมโครงสร้าง คำสั่ง  while (2)

เขยนกลบหลงint m = 0;while (n > 0){ int d = n % 10; n = n / 10; m = m*10 + d;}

Page 26: 418115:  การโปรแกรมโครงสร้าง คำสั่ง  while (2)

ทงโปรแกรม#include <stdio.h>int main(){ int n; printf("Enter n: "); scanf("%d", &n); int nn = n; int m = 0; while (n > 0) { int d = n % 10; n = n / 10; m = m*10 + d; } if (m == nn) printf("%d is a palindrome\n", nn); else printf("%d is not a palindrome\n", nn); return 0;}

Page 27: 418115:  การโปรแกรมโครงสร้าง คำสั่ง  while (2)

คำาถาม ในจำานวนเตมตงแต 1 ถง 1,000,000 มจำานวนเตมกตวทเปนทง จำานวนเฉพาะ และพาลนโดรม?

จำานวนเตมเหลานนคออะไรบาง?

Page 28: 418115:  การโปรแกรมโครงสร้าง คำสั่ง  while (2)

ออกแบบโปรแกรมเรารวธเชคพาลนโดรมเรารวธเชคจำานวนเฉพาะฉะนนเอาจำานวนเตมมาทละตวแลวเชความนเปนทงสองอยางหรอไม

แลวกนบจำานวนทใช

Page 29: 418115:  การโปรแกรมโครงสร้าง คำสั่ง  while (2)

ลปint n = 2;while (n <= 999999){ [ ตรวจวา n เปนพาลนโดรมหรอไม] [ ตรวจวา n เปนจำานวนเฉพาะหรอไม] [ ถาใชทงคพมพ n] }

Page 30: 418115:  การโปรแกรมโครงสร้าง คำสั่ง  while (2)

ลป (ฉบบเตม) int n = 2; while (n <= 999999) { int m = 0; int nn = n; while (nn > 0) { int d = nn % 10; nn = nn / 10; m = m*10 + d; } int is_palindrome = (m == n); int is_prime = 1; int k = 2; while (k < n) { if (n % k == 0) { is_prime = 0; break; } k++; } if (is_palindrome && is_prime) printf("%d\n", n); n++; }

Page 31: 418115:  การโปรแกรมโครงสร้าง คำสั่ง  while (2)

ปญหามนชาทำาไม?

การเชคจำานวนเฉพาะ ถาจะเชควา 983,139 เปนจำานวนเฉพาะหรอไมจะตองวนรอบทงหมดกรอบ?

อาจจะถง 983,137 รอบ! ฉะนนกรณเลวสดโปรแกรมจะตองวนรอบประมาณ

1,000,000 * 1,000,000 (แตความจรงนอยกวานมาก)

Page 32: 418115:  การโปรแกรมโครงสร้าง คำสั่ง  while (2)

ทำาใหมนเรวขน?การเชคจำานวนเฉพาะชาตองพยายามหลกเลยง

เราสนใจเฉพาะเลขทเปนทงพาลนโดรมและจำานวนเฉพาะดงนนถาเลขใดไมเปนพาลนโดรมแลวเรากไมตองไปเชความนเปนจำานวนเฉพาะกได

Page 33: 418115:  การโปรแกรมโครงสร้าง คำสั่ง  while (2)

คำาสง continueเมอสงแลวจะไปเรมตนลปใหมอกครงหนงขามคำาสงสวนทเหลอของลปไป มกใชควบคกบคำาสง if

Page 34: 418115:  การโปรแกรมโครงสร้าง คำสั่ง  while (2)

หลกเลยงการเชคจำานวนเฉพาะint n = 2;while (n <= 999999) { int m = 0; int nn = n; while (nn > 0) { int d = nn % 10; nn = nn / 10; m = m*10 + d; } int is_palindrome = (m == n); if (!is_palindrome) { n++; continue; }

int is_prime = 1; int k = 2; while (k < n) { if (n % k == 0) { is_prime = 0; break; } k++; } if (is_palindrome &&

is_prime) printf("%d\n", n); n++;}