[土狗之路]coursera上C语言基础第七周作业

描述

某医院想统计一下某项疾病的获得与否与年龄是否有关,需要对以前的诊断记录进行整理。

输入

共2行,第一行为过往病人的数目n(0 < n <= 100),第二行为每个病人患病时的年龄。

输出

每个年龄段(分四段:18以下,19-35,36-60,大于60注意看样例输出的格式)的患病人数占总患病人数的比例,以百分比的形式输出,精确到小数点后两位(double)。关于c++的格式化的输入输出,请参考:http://www.cplusplus.com/reference/iomanip。也可以在网上搜索一下,资料很多的。

样例输入

10
1 11 21 31 41 51 61 71 81 91

样例输出

1-18: 20.00%
19-35: 20.00%
36-60: 20.00%
60-: 40.00%

提示

注意最后一行的输出是“60-: ”,而不是“61-: ”。

每个冒号之后有一个空格。

输出可以用 cout<<fixed<<setprecision(2) << f; 来保留f后面的两位小数。


先说说我最原始解决方案:


#include<iostream>
#include <iomanip>
using namespace std;
int main() {
int patient[100];
int n;
cin >> n;
for (int i = 0; i<n; i++) {
cin >> patient[i];
}
double a;
double b;
double c;
double d;
a = 0;
b = 0;
c = 0;
d = 0;
for (int i = 0; i<n; i++) {
if (patient[i] <= 18) {
a++;
}
else if (patient[i] <= 35 && patient[i] >= 19) {
b++;
}
else if (patient[i] <= 60 && patient[i] >= 36) {
c++;
}
else if (patient[i]>60) {
d++;
}
}
cout << "1-18: " << fixed << setprecision(2) << a / n * 100 << "%" << endl;
cout << "19-35: " << fixed << setprecision(2) << b / n * 100 << "%" << endl;
cout << "36-60: " << fixed << setprecision(2) <<c / n * 100 << "%" << endl;
cout << "60-: " << fixed << setprecision(2) << d / n * 100 << "%" << endl;
return 0;
}


再说说改进完的:

#include<iostream>
#include <iomanip>
using namespace std;
int main() {
int patient=-1;
int n;
cin >> n;
double a = 0;
double b = 0;
double c = 0;
double d = 0;
for (int i = 0; i<n; i++) {
cin >> patient;
if (patient <= 18)
a++;


if (patient <= 35 && patient >= 19)
b++;
if (patient <= 60 && patient >= 36)
c++;
if (patient>60)
d++;
}
cout << "1-18: " << fixed << setprecision(2) << a / n * 100 << "%" << endl;
cout << "19-35: " << fixed << setprecision(2) << b / n * 100 << "%" << endl;
cout << "36-60: " << fixed << setprecision(2) <<c / n * 100 << "%" << endl;
cout << "60-: " << fixed << setprecision(2) << d / n * 100 << "%" << endl;
return 0;
}


改进之后,就不需要建立数组了,所以减少了占用内存,而且,所有的年龄段没有交叉点,只用if就可以了,不用多层的IF ELSE

然后说下一题

编程题#3:找出第k大的数

来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩。)

注意: 总时间限制: 1000ms 内存限制: 65536kB

描述

用户输入N和K,然后接着输入N个正整数(无序的),程序在不对N个整数排序的情况下,找出第K大的数。注意,第K大的数意味着从大到小排在第K位的数。

输入

N

K

a1 a2 a3 a4 ..... aN

输出

b

样例输入

5
2
32 3 12 5 89

样例输出

32

提示

这是一道很经典的算法问题,是公司面试的常见考题。以后学习递归之后再回头看看这道题,或许有新解法。


#include<iostream>
using namespace std;
int main() {
int n, k;
cin >> n >> k;
int back;
int number[300];
int larger;//比当前数据更大的数据的个数,原谅我不会命名
for (int i = 0; i < n; i++) {
cin >>number[i];//初始化数组
}
for (int i = 0; i < n; i++) {
larger = 0;
for (int j = 0; j < n; j++ ) {
if (number[j] > number[i]) 
larger++;
if (j == n-1 && larger == k - 1)//前半部分确定已经遍历结束,后半部分表示,第K大数,就应该有K-1个数比他大
back = number[i];
}
}
cout << back << endl;
return 0;
}


因为我没有学递归,所以暂时只写这一种方法。

最后一题

编程题#4:人民币支付

来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩。)

注意: 总时间限制: 1000ms 内存限制: 65536kB

描述

从键盘输入一指定金额(以元为单位,如345),然后输出支付该金额的各种面额的人民币数量,显示100元,50元,20元,10元,5元,1元各多少张,要求尽量使用大面额的钞票

输入

一个小于1000的正整数。

输出

输出分行,每行显示一个整数,从上到下分别表示100元,50元,20元,10元,5元,1元人民币的张数

样例输入

735

样例输出

7
0
1
1
1
0

先来一个最为简单粗暴的方式,题上怎么要求,就走直线。

#include<iostream>
using namespace std;
int main() {
int pay;
int a=0;//100
int b=0;//50
int c=0;//20
int d=0;//10
int e=0;//5
int f=0;//1
cin >> pay;
a = pay / 100;
b = (pay - a * 100) / 50;
c = (pay - a * 100 - b * 50) / 20;
d = (pay - a * 100 - b * 50 - c * 20) / 10;
e = (pay - a * 100 - b * 50 - c * 20 - d * 10)/5;
f = pay - a * 100 - b * 50 - c * 20 - d * 10 - e * 5;
cout << a << b << c << d << e << f<<endl;
return 0;
}


后来度娘之后发现自己做的有点蠢,发一个别人先进方法:


#include<iostream>  
using namespace std;  
int main()  
{  
    int sum;  
    int a[6] = { 0 };//a[0]:100,a[1]:50,a[2]:20,a[3]:10,a[4]:5,a[5]:1;  
    cin >> sum;  
    int piao[6] = {100,50,20,10,5,1};  
    for (int i = 0; i < 6; i++)  
    {  
        a[i] = sum / piao[i];  
        sum = sum % piao[i];  
        cout << a[i] << endl;  
    }  
    return 0;  
}  



最后说说今天写这篇日志的心得,一道题目的解决方案有很多,如何才能让程序简单易懂,才是真正好坏程序猿之间的区别,虽然我这只土狗才接触编程不久,但是这些作业让我思考问题,会在我未来的学习之路上有所助力


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值