การเขียนโปรแกรมหารจุดทศนิยม ที่รองรับทศนิยมสุงสุด มากกว่า50 ตำแหน่ง และห้ามใช้เครื่องหมายหาร
เริ่มเขียนโดย การ สร้างส่วนหารปรกติก่อน
จากโปรแกรมจะเห็นว่า นี้คือส่วนของการ หารแบบปรกติ
Method นี้อาศัยหลักการหารแบบมนุษย์ โดยเวลาเราคิดหารเลขจริงๆ แบบไม่มีเครื่องหมายหาร
ก่อนอื่นเราจะหารตัวเลขใดๆ ได้จำเป็นต้องมี 2 ตัวเลขคือ เลขที่จะหาร กับตัวหาร(ตัวตั้ง, ตัวหาร)
โดยใน method นี้เรารับ พารามิเตอร์มา 2 ตัว line 50 (int a, int b) โดยที่ int a เป็นตัวตั้ง int b เป็นตัวหาร
Line 51 , line 52 เป็นตัวแปรที่เป็นผลของการหาร คือมือหารแล้วจะเกิดผลหารและเศษ ถ้าหารลงตัวเศษจะเป็น 0
เช่น 10/2 ตัวตั้งคือ 10 หารด้วย 2 คำตอบ คือ ผลหารได้5 และเศษ เป็น 0
แต่หากเป็น 7/3 ผลหารจะได้ 2 และเศษจากการหารอิก 1
การหารโดยที่ไม่ใช้ Operation หาร เราจะให้วิธีการดังนี้
แนวคิดคือ เมือคุณหารเลขโดยห้ามคิดโดยใช้เครื่องหมายหารคุณจะยังไง....
การหารคือการแบ่งออกเท่าๆกัน โดยส่วนที่เหลือน้อยกว่าส่วนที่ต้องแบ่งคือเศษ
หากไม่เข้าใจ ลองคิดตามนี้
20 หาร ด้วย 3 คือเราจะแบ่ง 20 ออกเป็นส่วนๆ โดยจำนวนที่แบ่งได้คือผลหาร และแต่ละส่วนเราจะแบ่งเท่ากับ 3
ดังนั้น เราจะแบ่งได้ ส่วนละ 3 ทั้งหมด 6 ส่วน และเหลือเศษ อิก 2
โดยการจะแบ่งเราจะคิดจาก แบ่ง 20 ออก มา 1 ส่วนส่วนละ 3 เหลือ 20 อยู่ 17 (20 – (1*3) =17)
โดย 17 คือเศษ แต่ 17 ยังสามารถแบ่งออกทีละ 3 ได้อิกดังนั้นเราจะทำต่อไป
ขั้นแรก เราจะหาร โดยการแบ่ง 20 ออก คือ แบ่ง 20 ออกมา 3 ได้ 1 ส่วน เหลือทั้งหมด 17 (20-(3*1 =3) =17)
ต่อมา เมื่อเราแบ่ง ออกอิก โดย แบ่ง 20 ออก 3 เป็น 2 ส่วน เหลือทั้งหมด 14 (20 –(3*2=6) = 14)
และเมื่อเราแบ่งไปเรื่อยๆ จนได้ 6 ส่วน เราจะได้ว่า
แบ่ง 20 ออก 3 เป็น 6 ส่วน เหลือ 2 (20-(3*6 =18) = 2)
และเราจะรู้ว่าเราไม่สามาร แบ่ง 20 ออกเป็น 7 ส่วนโดย แต่ละส่วนคือ 3 ได้ เพราะ เมื่อได้ 6 แล้ว จะเหลือเพียง 2
จากทั้งหมด เราจะไม่ได้ใช้เครื่องหมายหารเลย ดังนั้น โปรเกรมเราจะคิดตามนี้ โดยทำหารหาเศษไปเรื่อยๆ
จะทำจนกว่า เศษ จะน้อยกว่า ส่วนที่เอามาหาร
Line ที่ 55 เป้นการหาผลหาร line 56 เป็นการหาเศษที่เหลือ และ line53 เป็นเงือนไขของการ ทำ
เมือทำไปจยจบ เราจะได้ ผลหารและเศษ โดย method จะ return 2ค่าไม้ได้ ดังนั้น เราจึงสร้าง Class Vector
มาเพื่อการที่จะ เอาทั้งผลหารและเศษไส่รวมกัน และ return ออกไป
Line 62,63 เป็นชนิดข้อมุลที่เอาไว้เก็บ ค่า โดย เมือจะ เก็บ หรือ Get ก็สามารถ
ใช้ Instance ของ Class Vector. Attribute ได้เลย
เนื่องจาก โจทย์เราไม่ใช่เพียงการหารโดยที่ไม่ใช้เครืองหมายหารอย่างดียว แต่เป็นการหารเลข ที่ต้องสามารถ รองรับการหาทศนิยมได้มากกว่า 50 ตำแหน่ง
ดังนั้น เมื่อเราได้ ส่วนการทำงานที่จะหารแล้ว เราต้อง สร้างส่วนการทำงานที่ จะหารให้ได้ทศนิยมอิก
Method div
การหารเอาทศนิยมคือ เราจะหารไปเรื่อยๆ จนกว่าจะมีเศษเป็น 0 หรือ จนกว่าเราจะหยุด
(ในกรณี ทศนิยมซ้าไม่รู้จบ ทศนิยมจะไม่สามารถการลงตัวได้เช่น 10/3 ) เราจะใช้วิธีเรียก method devider
ไปเรื่อยๆ จนกว่า ผลที่ได้.Y จะเท่ากับ0 (เศษ0) เช่น 7/2
1 . 2 หาร 7 ได้ 3
3*2 ได้ 6
2. 7-6 เหลือ 1 คือเศษ
3. เศษน้อยกว่า 2 หารไม่ได้
ไส่. ที่คำตอบ เติม 0
ผลที่ได้คือ เศษ = 10
10 มากกว่า 2 หารได้
4. 10 หาร 2 ได้ 5 เศษ 0
เศษเป็น 0 หยุด
ตอบ 3.5
Line 28 คือ m ตัวตั้ง(และเป้นทั้งเศษในการหาร) n ตัวหาร
Line 29 เราจะเอาค่าที่รับจากพารมมิตเอร์มาเก็บไว้ใน m,n
Line 30 คือ ตัวที่บอกว่าเราเติม . (จุดทศนิยมแล้วหรือยัง)
Line 31 คือ คำตอบเนื้องจาก เราต้องการถึง 50 หลัก ในชนิดข้อมูลตัวเลขทั่วไปอาจไม่สามารถเก้บได้ ดังนั้น
เราจึงใช้ String และรวมทั้งให้ง่ายในการต่อตัวเลข
ขั้นแรก
เราจะเขียนโปรแกรมตามนี้ คือ ถ้า จะ หารโดยการเรียก method divider(a,b) จากเงื่อนไขที่
เศษของการหาร ต้องไม่เป็น 0 และทำซ่าไปเรื่อยๆ จนเท่ากับจำนวนหลักที่อยากได้
Div( ตัวตั้ง, ตัวหาร , จำนวนหลักสูงสุดที่รองรับ)
Line 33 คือ เงือนไขดังกล่าว
Line 34 คือ ถ้า ตัวตั้งมากกว่าตัวการเราจะทำการหาร แล้ว
นำผลหารไปไส่ในคำตอบ line 35-36
Line 37 คือเอ้เศษ ไปเก็บไว้ที่ m เพื่อตรวจสอบในรอบต่อไป
Line 39 คือ ถ้า ตัวตั้ง(เศษที่เหลืออยู่) น้อยกว่าตัวหาร
Line 44 ในเติม 0 ที่คำตอบ
Line 40 เราจะ ตรวจดูว่า ไส่จุดหรือยังหากยังให้ไส หากไส่แล้วให้เติมตัวเลขต่อได้เลย
Line 48 เมือเสร็ดเงื่อนไข Return ค่า String คำตอบออกไป
Main program
Line 7 สร้าง instance ของ การรับค่าขึ้นมา
Line 9 m คือ ตัวตั้ว n คือตัวหาร long คือ จำนวนทศนิยมที่จะรองรับ
Line 10 – 15 รับค่าและแสดง ให้ผู้ใช้ ป้อนค่า ตัวตั้ง ตัวหาร และ ความยาวของ หลักสูงสุด
Line 16 ,17 ถ้าผู้ใช้ป้อน ตัวตั้ง เป็น 0 ก็ให้โปรแกรม ตอบ 1 ไปเลย เพราะ 0 หารอะไรก็ได้ 1
Line 20 ,21 ถ้าผู้ใช้ป้อน ตัวหาร เป็น 0 ก็ให้โปรแกรม ตอบ ข้อความ "คำตอบ : จำนวนใดๆ หาร 0 ไม่ได้ อย่ามั่วหลาย"
เพราะ ตัวเลขใดๆ หาร 0 ไม่ได้ - -*
Line 23 แสดงคำตอบโดยการ ส่ง m,n, และ line ไปใน metod div( ตัวตั้ง, ตัวหาร , จำนวนหลักสูงสุดที่รองรับ)
และแสดงคำตอบออกทาง text line
ส่วนตัวเลขที่ใช้ทดสอบ สุดฮิต ของทศนิยมซ้ำ ไมรู้จบคงจะเป็น 22/7
หรือค่า pry นั้นละ
ผลของการรัน 22 /7 จำนวน 50 หลัก output
ผลของการรัน 10 /3 จำนวน 100 หลัก output
จบ ^^
ส่วนนี้เป็นส่วนของ CODE ค่ะ
package javaapplication3;
import java.util.Scanner;
public class Main {
static Scanner kb = new Scanner(System.in);
public static void main(String[] args) {
int m,n,lang;
System.out.print("ตัวตั้ง : ");
m = kb.nextInt();
System.out.print("ตัวหาร : ");
n = kb.nextInt();
System.out.print("จำนวนหลักรวมทศนิยมสูงสุดที่จะให้แสดง : ");
lang = kb.nextInt();
if(m == 0){
System.out.print("คำตอบ : 1");
}
else{
if(n==0)
System.out.print("คำตอบ : จำนวนใดๆ หาร 0 ไม่ได้ อย่ามั่วหลาย");
else
System.out.print("คำตอบ : "+div(m, n,lang));
}
}
private static String div(int a,int b,int lang){//ในรูปแบบ aตั้ง bหาร
int m,n;
m =a;n=b;
boolean dot =true;
String outPut ="";
for(int c =0 ;c<lang&&m!=0;c+=0){
if(m>n){
c++;
int out=divider(m, n).X;
outPut+=out;
m=divider(m, n).Y;
//System.out.println(m+ " : "+n+":index :"+c);
}else{
if(dot){
outPut +=".";
dot =false;
}
String temp = m+"0";
m = Integer.parseInt(temp);
}
}
return outPut;
}
private static Vector divider(int a,int b){// a คือตั้วตั้ง b คือตัวหารเช่น 10/5 a= 10 b =5
int over =0;// เศษ
int mod = 0;// ผลหาร
while(a-(b*mod) >=b ){
// System.out.println(mod);
mod ++;
over =a-(mod*b);
}
return new Vector(mod,over); // mod เป็นผลหาร over เป็นเศษ
}
}
class Vector {
public int X;
public int Y;
public Vector(){
}
public Vector(int X, int Y) {
this.X = X;
this.Y = Y;
}
}







0 ความคิดเห็น:
แสดงความคิดเห็น