1. 程式人生 > >hdu 2021 發工資咯:)(c語言)

hdu 2021 發工資咯:)(c語言)

hdu 2021 發工資咯:)

點選做題網站連結

題目描述

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)

Problem Description
作為杭電的老師,最盼望的日子就是每月的8號了,因為這一天是發工資的日子,養家餬口就靠它了,呵呵
但是對於學校財務處的工作人員來說,這一天則是很忙碌的一天,財務處的小胡老師最近就在考慮一個問題:如果每個老師的工資額都知道,最少需要準備多少張人民幣,才能在給每位老師發工資的時候都不用老師找零呢?
這裡假設老師的工資都是正整數,單位元,人民幣一共有100元、50元、10元、5元、2元和1元六種。

Input
輸入資料包含多個測試例項,每個測試例項的第一行是一個整數n(n<100),表示老師的人數,然後是n個老師的工資。
n=0表示輸入的結束,不做處理。

Output
對於每個測試例項輸出一個整數x,表示至少需要準備的人民幣張數。每個輸出佔一行。

Sample Input
3
1 2 3
0

Sample Output
4

問題解答一

這是最初的構想和邏輯,但明顯該程式碼太低長,很多都是重複內容,寫起來不方便,太幼稚了

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int
n,a[100]; while( scanf("%d",&n)!=EOF && n!=0 ) { for(int i=0;i<n;++i)//錄入工資 scanf("%d",&a[i]); int sum=0; for(int i=0;i<n;++i)//遍歷每個老師的工資 { if( a[i]>=100 ) { sum+=a[i]/100; a[i]%=100
; } if( a[i]>=50 ) { sum+=1; a[i]-=50; } if( a[i]>=10 ) { sum+=a[i]/10; a[i]%=10; } if( a[i]>=5 ) { sum+=1; a[i]-=5; } if( a[i]>=2 ) { sum+=a[i]/2; a[i]%=2; } if( a[i]!=0 ) { sum+=a[i]; } } printf("%d\n",sum); } return 0; }

問題解答二

上面那種繁複的程式碼執行成功後,這是簡化版的改版,邏輯演算法是一樣的

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int n,salary,a[6]={100,50,10,5,2,1};
    while( scanf("%d",&n)!=EOF && n!=0 )
    {
        int sum=0;
        for(int j=0;j<n;++j)
        {
            scanf("%d",&salary);
            for(int i=0;salary>0;++i)
                if( salary>=a[i] )
                {
                    sum+=salary/a[i];
                    salary%=a[i];
                }
        }

        printf("%d\n",sum);
    }
    return 0;
}