原题链接:发工资咯
解题思路:
1.要为所有员工工资准备的钱的张数最少,则发给每个员工的工资里钱的张数要最少;
2.要发给每个员工的工资里钱的张数要最少,则要先发面值最大的钱,再发次大的,再发次次大的;
3.假设某员工薪水为121;(则有以下递归关系)
(1):薪水大于100,先发给面值为100的钱,所发张数为:121/100=1张......21元;(还需发21元)
(2):21>大于10,小于50,故发面值为10的钱,所发张数为:21/10=2张......1元;(还需发1元)
(3):1等于1,故发面值为1的钱,所发张数为:1/1=1张......0元;
4.1张+2张+1张=4张 :即该员工所需最少的钱的张数为4张;
6.求出每个员工所需张数再加起来,就是总的所需最少张数;
参考代码:
#include <stdio.h> void fun_ction( int salary, int *Count ); int main() { int num_ofpeople; int salary; int Count; while ( scanf( "%d", &num_ofpeople ) != EOF && num_ofpeople != 0 ) { //因为之前有题目以0结束,但是提交输出超限,加上EOF正确,所以这里也加了一个以文件结束符结束避免出错 Count = 0; for ( int i = 0; i < num_ofpeople; i++ ) { scanf( "%d", &salary ); fun_ction( salary, &Count ); } printf( "%d\n", Count ); } return(0); } /*---------------------------------------------------------------*/ void fun_ction( int salary, int *Count ) { if ( salary == 0 )//发完返回 return; if ( salary == 1 ) {//直接加1,并返回,不用再递归到:fun_ction(salary%1,Count); (*Count)++; return; }else if ( salary >= 2 && salary < 5 ) { (*Count) += (salary / 2); fun_ction( salary % 2, Count ); }else if ( salary >= 5 && salary < 10 ) { (*Count) += (salary / 5); fun_ction( salary % 5, Count ); }else if ( salary >= 10 && salary < 50 ) { (*Count) += (salary / 10); fun_ction( salary % 10, Count ); }else if ( salary >= 50 && salary < 100 ) { (*Count) += (salary / 50); fun_ction( salary % 50, Count ); }else if ( salary >= 100 ) { (*Count) += (salary / 100); fun_ction( salary % 100, Count ); } return; }
别忘点赞哦-.-
非递归
(在使用非递归方法的时候,每个if条件之间不能用else连接,因为上一个if中salary改变后的值,要作为后面的判断条件,加了else的话,执行一个后,其后面的就都不执行了。)
#include <stdio.h> void fun_ction( int salary, int *Count ); int main() { int num_ofpeople; int salary; int Count; while ( scanf( "%d", &num_ofpeople ) != EOF && num_ofpeople != 0 ) { Count = 0; for ( int i = 0; i < num_ofpeople; i++ ) { scanf( "%d", &salary ); fun_ction( salary, &Count ); } printf( "%d\n", Count ); } return(0); } /*---------------------------------------------------------------*/ void fun_ction( int salary, int *Count ) { if ( salary >= 100 ) { (*Count) += (salary / 100); salary%=100; } if ( salary >= 50 && salary < 100 ) { (*Count) += (salary / 50); salary%=50; } if ( salary >= 10 && salary < 50 ) { (*Count) += (salary / 10); salary%=10; } if ( salary >= 5 && salary < 10 ) { (*Count) += (salary / 5); salary%=5; } if ( salary >= 2 && salary < 5 ) { (*Count) += (salary / 2); salary%=2; } if ( salary == 1 ) { (*Count)++; } return; }
别忘点赞哦-.-
0.0分
16 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复