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
ประมข ขนเงน[email protected]
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.
จำานวนเฉพาะจำานวนเฉพาะคออะไร?
จำานวนเตมบวก ( ฉะนนไมนบ 0 หรอจำานวนเตมลบ)ไมใชจำานวนเตมลบแยกตวประกอบไมได กลาวคอ จำานวนเตมบวกทหารมนลงตวมเพยงแคสองตว คอ 1 กบตวมนเอง
เชควาจำานวนเปนจำานวนเฉพาะไดอยางไร? สมมตวาจำานวนทเราตองการเชคคอ n จำานวนทหารมนไดมแคสองตวคอ 1 กบ n ดงนน 2, 3, 4, …, n-1 ตองหารมนไมลงตว ฉะนนเราเชค 2, 3, 4, …, n-1 ทละตววาหาร n ลงตวหรอไม?
มสกตวทหารลงตว ไมใชจำานวนเฉพาะ ไมมสกตวทหารลงตว เปนจำานวนเฉพาะ
ออกแบบโปรแกรม รบ n ตงลปโดยใช k เปนตวแปร counterk มคา 2 ถง n-1 สำาหรบ k แตละคาเชควา n % k == 0 หรอไม? ถาใช ใหจำาไววามเลขหารลงตว
หลงจากลปเสรจการทำางาน ใหไปเชความเลขหารลงตวหรอไม ถาใช แสดงวาไมเปนจำานวนเฉพาะ ถาไมใช แสดงวาเปนจำานวนเฉพาะ
ลปint is_prime = 1;int k = 2;while (k < n){ if (n % k == 0) is_prime = 0; k++;}
ทงโปรแกรม#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;}
คำาสง break เคยเจอมาแลวในคำาสง switchสามารถใสไวตรงในกไดในสวนทเปนคำาสงทตองการวนซำา
ใน คำาสง while เมอเจอคำาสง break แลวลป while จะเลกการทำางานทนท
มกใชควบคกบคำาสง if เสมอ
โปรแกรมเชคจำานวนเฉพาะ เราไมจำาเปนตองให k มคาตงแต 2 ถง n-1 เสมอ ถามเลขสกตวหารลงตว แสดงวาไมใชจำานวนเฉพาะแลวดงนนไมมความจำาเปนตองเชคจำานวนอนอก
เราตองการหยดการทำางานของลปทนทท n%k == 0 สามารถใชคำาสง break ไดในกรณน
ลปใหมทเรวขนint is_prime = 1;int k = 2;while (k < n){ if (n % k == 0) { is_prime = 0; break; } k++;}
โปรแกรมสำาหรบแยกตวประกอบรบจำานวนเตมหนงตวจากผใชแยกตวประกอบของจำานวนเตมทผใชใหมา
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
การแยกตวประกอบแยกตวประกอบคออะไร?
การเขยนจำานวนเตมอยในรปผลคณของจำานวนเฉพาะ
ทำาอยางไรดถงจะแยกได สมมตวาเลขทเราตองการจะแยกตวประกอบคอ n สมมตให n > 1 ( กรณ n = 1 ไมมอะไร) หาจำานวนเฉพาะมาสกตวทหาร n ลงตว
สมมตวาจำานวนเฉพาะนคอ p ถาจำานวนเฉพาะนนหาร n ลงตว เรากพมพมน แลวลบมนออกจากตวประกอบของ n ดวยการสง n = n/p
การแยกตวประกอบ48
หาร 2 ลงตว48 24
24 หาร 2 ลงตว24 12
12 หาร 2 ลงตว12 6
6 หาร 2 ลงตว6 3
3 หาร 3 ลงตว3 1
จบการทำางาน
หาจำานวนเฉพาะทหาร n ลงตว สมมตวา n > 1 ลองเปลยนคำาถามเปนวา
“ จำานวนเฉพาะทนอยทสดทหาร n ลงตวคออะไร?” สงเกต คำาถามนมคำาตอบเดยวกบคำาถามทวา
“ จำานวนทนอยทสดทมากกวา 1 ทหาร n ลงตวคออะไร?”
หาจำานวนเฉพาะทหาร n ลงตวทำาไม?
สมมตวา m เปนจำานวนทนอยทสดทมากกวา 1 ทหาร n ลงตว
สมมตอกวา m ไมใชจำานวนเฉพาะ แสดงวา m ตวแยกตวประกอบได สมมตให p เปนจำานวน
เฉพาะทหาร m ลงตว เรารวา p < m และ p > 1 แต p กหาร n ลงตว ฉะนน m ไมใชจำานวนทนอยทสดทมากกวา 1 ทหาร n ลงตวเกดขอขดแยง
หาจำานวนเฉพาะทหาร n ลงตว หาจำานวนเฉพาะทนอยทสดทหาร n ลงตว
คอการหาจำานวนทมากกวา 1 ทนอยทสดทหาร n ลงตวหาอยางไร?
เรมจาก p = 2 เชควา n%p == 0 หรอไม?ถาใชกจบ ถาไมใชกเพมคา p ขนหนง
หาจำานวนเฉพาะทหาร n ลงตวint p = 2;while (n % p != 0) p++;
ลป หา p หนงตวทหาร n ลงตว พมพ p ลบ p ออกจากความเปนตวประกอบของ n
n = n/pหยดเมอไหร?
n == 1
ลป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;}
ทงโปรแกรม#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;}
เลขพาลนโดรมเลขพาลนโดรมคอเลขทเขยนจากหลงไปหนาแลวมคาเทาเดม เชน 12321 เปนเลขพาลนโดรม แต 123 ไมใช เพราะ 123 ไมเทากบ 321
สงเกตวาเลขพาลนโดรมจะตอทายดวย 0 ไมได
โปรแกรมตรวจสอบเลขพาลนโดรมอานจำานวนเตมบวกจากผใชหนงตว
ชนด int ไมเกน 6 หลก
แลวบอกวาเลขนนเปนพาลนโดรมหรอไม
Enter n: 1232112321 is a palindrome
Enter n: 45674567 is not a palindrome
ออกแบบโปรแกรมพาลนโดรมคออะไร?
เขยนกลบหลงแลวไดตวเตมจะทดสอบพาลนโดรมอยางไร?
กลองเขยนกลบหลงดแลวเทยบวาเทากบตวเดมหรอไม
เขยนกลบหลง สมมตวามเลข 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
เขยนกลบหลงในแตละขน
ดงตวหลงของ n ออกมา เอาตวหลงของ n ไปตอทาย m ลบตวหลงออกจาก n
กลาวคอint d = n % 10;n = n / 10;m = m*10 + d;
หยดเมอใด? เมอ n = 0
เขยนกลบหลงint m = 0;while (n > 0){ int d = n % 10; n = n / 10; m = m*10 + d;}
ทงโปรแกรม#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;}
คำาถาม ในจำานวนเตมตงแต 1 ถง 1,000,000 มจำานวนเตมกตวทเปนทง จำานวนเฉพาะ และพาลนโดรม?
จำานวนเตมเหลานนคออะไรบาง?
ออกแบบโปรแกรมเรารวธเชคพาลนโดรมเรารวธเชคจำานวนเฉพาะฉะนนเอาจำานวนเตมมาทละตวแลวเชความนเปนทงสองอยางหรอไม
แลวกนบจำานวนทใช
ลปint n = 2;while (n <= 999999){ [ ตรวจวา n เปนพาลนโดรมหรอไม] [ ตรวจวา n เปนจำานวนเฉพาะหรอไม] [ ถาใชทงคพมพ n] }
ลป (ฉบบเตม) 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++; }
ปญหามนชาทำาไม?
การเชคจำานวนเฉพาะ ถาจะเชควา 983,139 เปนจำานวนเฉพาะหรอไมจะตองวนรอบทงหมดกรอบ?
อาจจะถง 983,137 รอบ! ฉะนนกรณเลวสดโปรแกรมจะตองวนรอบประมาณ
1,000,000 * 1,000,000 (แตความจรงนอยกวานมาก)
ทำาใหมนเรวขน?การเชคจำานวนเฉพาะชาตองพยายามหลกเลยง
เราสนใจเฉพาะเลขทเปนทงพาลนโดรมและจำานวนเฉพาะดงนนถาเลขใดไมเปนพาลนโดรมแลวเรากไมตองไปเชความนเปนจำานวนเฉพาะกได
คำาสง continueเมอสงแลวจะไปเรมตนลปใหมอกครงหนงขามคำาสงสวนทเหลอของลปไป มกใชควบคกบคำาสง if
หลกเลยงการเชคจำานวนเฉพาะ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++;}