1.setprecision控制输出流显示浮点数的有效数字个数
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
float a = 0, b = 0;
a = 123456.789e5;
b = a + 20;
cout << setprecision(20) << b << endl;
return 0;
}
手算结果是12345678920
但这段代码结果是12345678848
因为浮点数精度只有7位,超过7位就不准确-用浮点数运算时应避免大+小(数位相差过多)
IEEE754,浮点数
作业题
1.年龄与疾病
描述
某医院想统计一下某项疾病的获得与否与年龄是否有关,需要对以前的诊断记录进行整理。
输入
共2行,第一行为过往病人的数目n(0 < n <= 100),第二行为每个病人患病时的年龄。
输出
每个年龄段(分四段:18以下,19-35,36-60,大于60注意看样例输出的格式)的患病人数占总患病人数的比例,以百分比的形式输出,精确到小数点后两位(double)。关于c++的格式化的输入输出,请参考:http://www.cplusplus.com/reference/iomanip。也可以在网上搜索一下,资料很多的。
#include <iostream>
#include <iomanip>
//输出可以用 cout<<fixed<<setprecision(2) << f; 来保留f后面的两位小数
using namespace std;
int main()
{
int n, age;
int a, b, c, d, i,f;
cin >> n;
a = 0;
b = 0;
c = 0;
d = 0;
for (i = 0; i < n; i++) {
//逐个输入判断
cin >> age;
if (age > 60)d++;
else if (age >= 36)c++;
else if (age >= 19)b++;
else a++;
//这里从60往下比从1-18往上要好看点
}
cout << "1-18: " << fixed << setprecision(2) << a*100.0 / n << "%\n";
//注意%在c++中可以直接打出来,\n会换行
cout << "19-35: " << fixed << setprecision(2) << b*100.0 / n << "%\n";
cout << "36-60: " << fixed << setprecision(2) << c*100.0 / n << "%\n";
cout << "60-: " << fixed << setprecision(2) << d*100.0 / n << "%";
cin >> f;
//这个cin是为了debug中看结果,没有实际含义,防止闪退出来,记得有其他办法的,这个简单.
return 0;
}
3.找出第k大的数
描述
用户输入N和K,然后接着输入N个正整数(无序的),程序在不对N个整数排序的情况下,找出第K大的数。注意,第K大的数意味着从大到小排在第K位的数。
输入
N
K
a1 a2 a3 a4 ….. aN
输出
b
#include <iostream>
using namespace std;
//http://blog.sina.com.cn/xqfphd参考这个的解法五
int main()
{
int n, k, i, num,f;//f仍然是为了debug用的
cin >> n;
cin >> k;
int a[1000] = { 0 };//长度1000的数组初始化为0
for (i = 0; i < n; i++) {
cin >> num;
a[num - 1] += 1;
}
//a[i]存的是i这个数出现的次数
int sumCount, v;
for (sumCount = 0, v = 999; v >= 0; v--) {
sumCount += a[v-1];
if (sumCount >= k)
break;
}
//sumCount是从大到小的数的序号,加到大于等于k的时候,v就是第k大的
cout << v <<endl;
cin >> f;
return 0;
}
//这个实现既浪费时间也浪费空间,只不过自己写的简单...
4.人民币支付
描述
从键盘输入一指定金额(以元为单位,如345),然后输出支付该金额的各种面额的人民币数量,显示100元,50元,20元,10元,5元,1元各多少张,要求尽量使用大面额的钞票。
输入
一个小于1000的正整数。
输出
输出分行,每行显示一个整数,从上到下分别表示100元,50元,20元,10元,5元,1元人民币的张数
#include <iostream>
using namespace std;
int main()
{
int m,rest;
cin >> m;
int a, b, c, d, e, f;
//100,50,20,10,5,1六种面值,感觉下面的代码不用一个一个重复写下来
a = m / 100;
rest = m % 100;
b = rest / 50;
rest = rest % 50;
c = rest / 20;
rest = rest % 20;
d = rest / 10;
rest = rest % 10;
e = rest / 5;
rest = rest % 5;
cout << a<<endl << b<<endl << c<<"\n" << d<<"\n" << e<<"\n" << f<<"\n";
//这里试了下打换行,endl可以,"\n"也可.有更简单点的输出方式吗,这里太多<<
return 0;
}
不得不说这段代码丑爆了,大晚上的先A了再说,你先丑着吧..
前几个小时把第2题写上来了,还有个最大公约数的欧几里得算法实现,但草稿不知怎搞的丢了,引以为戒,注意随手保存。