C語言:發工資

南淮北安發表於2019-03-30

注意

  1. 不論什麼語言,它的資料在機器中都是以二進位制儲存和運算的,但是二進位制並不能完全精確表示所有十進位制小數。就像三進位制的0.1用十進位制表示是0.33333…無限迴圈小數。所以就有書上說的浮點數只能保證有限位的精確。
  2. 浮點運算儘量轉換成整數,再進行運算,不然會出現誤差性錯誤
void main() {
	double m[5] = {786.98,1038.76,1053.72,1234.98,1653.33};
	int a,i,b_int;
	float b;
	//將整數與小數分隔開,進行運算
	for(i=0; i<5; i++) {
//		由於小數運算出現問題,一般把小數,整數分離開,再把小數換成整數進行運算 
		a = m[i];
		b = (m[i] -a);
		b_int = b*100;
		printf("金額%.2lf需要:",a+b);
		money_num(a,b_int);
	}
}

上面這種換算,存在問題,而且麻煩,需要雙精度的m,單精度的b才好使
可以按照下面方法進行分割小數和整數

void main(){
	double money[n]={786.98,1038.76,1053.72,1234.98,1653.33};
	int i,data_1,data_2; 
	for(i=0;i<n;i++){
//		使用data_1接收整數部分 
		data_1=money[i];
//		將整體乘以100,變為整數,然後減去整數部分乘以100,既得小數部分 
		data_2=money[i]*100-data_1*100;
		printf("%d,%d\n",data_1,data_2);
	}	
}

1. 題目

輸入幾名職工工資金額,統計最少須領多少個100元,50元,20元,10元,5元,2元,1元,5角,2角,1角,5分,2分,1分才能實現順利發放?
假設職工數n=5,工資分別為:786.98,1038.76,1053.72,1234.98,1653.33

2. 程式碼

#include "stdio.h"

void money_num(int a,int b) {
		int i,n,j;
//	儲存錢幣的種類
	float money[13] = {100,50,20,10,5,2,1,0.5,0.2,0.1,0.05,0.02,0.01};
//	將小數均轉換成整數單獨存放 
	int money_int[6] = {50,20,10,5,2,1};
//	num陣列,用來記錄每種錢幣的個數,初始都為0
	int num[13]={0};
//由於需要最少的錢幣個數,所以最大的越多越好,因此從大到小,依次選擇直到錢數為工資總額
//	先進行整數運算 
	for(i=0; i<7; i++) {
		n=0;
//		n代表當前選擇的錢幣張數
		while(a>=money[i]) {
			a = a-money[i];
			n++;
		}
		num[i] = n;
	}
//	再進行小數運算 
	for(j=0; j<6; j++) {
		n=0;
//		n代表當前選擇的錢幣張數
		while(b>=money_int[j]) {
			b = b-money_int[j];
			n++;
		}
		num[i++] = n;
	}

	for(i=0; i<13; i++) {
		if(num[i]!=0)
			printf("%d張%.2f ",num[i],money[i]);
	}
	printf("\n\n");
}

void main() {
	double m[5] = {786.98,1038.76,1053.72,1234.98,1653.33};
	int i,data1,data2,temp;
	for(i=0; i<5; i++) {
		data1= m[i];
		data2=m[i]*100-data1*100;
		printf("金額%.2lf需要:",m[i]);
		money_num(data1,data2);
	}
}

相關文章