如何整理网站/网页生成app
信息学编程基础练习(9)
循环控制三
1:药房管理
【问题描述】
随着信息技术的蓬勃发展,医疗信息化已经成为医院建设中必不可少的一部分。计算机可以很好地辅助医院管理医生信息、病人信息、药品信息等海量数据,使工作人员能够从这些机械的工作中解放出来,将更多精力投入真正的医疗过程中,从而极大地提高了医院整体的工作效率。对药品的管理是其中的一项重要内容。现在药房的管理员希望使用计算机来帮助他管理。假设对于任意一种药品,每天开始工作时的库存总量已 知,并且一天之内不会通过进货的方式增加。每天会有很多病人前来取药,每个病人希望取走不同数量的药品。如果病人需要的数量超过了当时的库存量,药房会拒 绝该病人的请求。管理员希望知道每天会有多少病人没有取上药。
输入
共3行
第一行是每天开始时的药品总量m
第二行是这一天取药的人数n(0 < n <= 100)
第三行共有n个数,分别记录了每个病人希望取走的药品数量(按照时间先后的顺序),两数之间以空格分隔
输出
只有1行,为这一天没有取上药品的人数。
【样例输入】
30
6
10 5 20 6 7 8
【样例输出】
2
#include using namespace std;int main(){ int m,n,i,sum=0; int a[105]; cin>>m>>n; for(i=1;i<=n;i++) cin>>a[i]; for(i=1;i<=n;i++) { if(m>=a[i]) m-=a[i]; else { sum++; continue; } } cout< return 0;}
2:正常血压
【问题描述】
监护室每小时测量一次病人的血压,若收缩压在90 - 140之间并且舒张压在60 - 90之间(包含端点值)则称之为正常,现给出某病人若干次测量的血压值,计算病人保持正常血压的最长小时数。
输入
第一行为一个正整数n,n < 100
其后有n行,每行2个正整数,分别为一次测量的收缩压和舒张压,中间以一个空格分隔。
输出
输出仅一行,血压连续正常的最长小时数。
【样例输入】
4
100 80
90 50
120 60
140 90
【样例输出】
2
#include #include #include using namespace std;bool isNormal(int high, int low){ if (high>=90&&high<=140&&low>=60&&low<=90) return true; return false;}int main(){ int n, high, low, temp=0, x=0; bool last=false; // 记录上一个小时是否正常 cin >> n; for (int i=0; i if (!last) temp = 0; cin >> high >> low; last = isNormal(high, low); if (last){ temp++; if (temp > x) x = temp; } } cout << x << endl; return 0;}
3:求特殊自然数
【问题描述】
一个十进制自然数,它的七进制与九进制表示都是三位数,且七进制与九进制的三位数码表示顺序正好相反。编程求此自然数,并输出显示。
输入
无。
输出
三行:
第一行是此自然数的十进制表示;
第二行是此自然数的七进制表示;
第三行是此自然数的九进制表示。
【样例输入】
(无)
【样例输出】
(不提供)
#include using namespace std;int main(){ int i; for (i = 65; i <= 342; i++) { if ((i % 9 == i / 49) && (i / 9 % 9 == i / 7 % 7) && (i / 81 == i % 7)) { cout << i << endl; cout << i / 49 << i / 7 % 7 << i % 7 << endl; cout << i / 81 << i / 9 % 9 << i % 9 << endl; break; } } return 0;}
4:统计满足条件的4位数个数
【问题描述】
给定若干个四位数,求出其中满足以下条件的数的个数:个位数上的数字减去千位数上的数字,再减去百位数上的数字, 再减去十位数上的数字的结果大于零。
输入
输入为两行,第一行为四位数的个数n,第二行为n个的四位数,数与数之间以一个空格分开。(n <= 100)
输出
输出为一行,包含一个整数,表示满足条件的四位数的个数。
【样例输入】
5
1234 1349 6119 2123 5017
【样例输出】
3
#include using namespace std;int main(){ int n,i,sum=0; int b,c,d,e; int a[105]; cin>>n; for(i=0;i cin>>a[i]; for(i=0;i { e=a[i]%10; a[i]=a[i]/10; d=a[i]%10; a[i]=a[i]/10; c=a[i]%10; a[i]=a[i]/10; b=a[i]%10; if((e-b-c-d)>0) sum++; } cout< return 0;}
5:级数求和
【问题描述】
已知:Sn= 1+1/2+1/3+…+1/n。显然对于任意一个整数K,当n足够大的时候,Sn大于K。现给出一个整数K(1<=k<=15),要求计算出一个最小的n;使得Sn>K。
输入
一个整数K。
输出
一个整数n。
【样例输入】
1
【样例输出】
2
#include using namespace std;int main(){ int k,i=1; double s,sum=0; cin>>k; while(sum<=k) { s=1.0/i; sum+=s; i++; } cout<-1; return 0;}
6:分离整数的各个数位
【问题描述】
给定一个整数,要求从个位开始分离出它的每一位数字。
输入
输入一个整数,整数在1到100000000之间。
输出
从个位开始按照从低位到高位的顺序依次输出每一位数字。数字之间以一个空格分开。
【样例输入】
123
【样例输出】
3 2 1
#include using namespace std;int main(){ long n; int i,a; cin>>n; while(n!=0) { a=n%10; n/=10; cout<" "; } return 0;}
7:数字反转
【问题描述】
给定一个整数,请将该数各个位上数字反转得到一个新数。新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零(参见样例2)。
输入
输入共 1 行,一个整数N。
-1,000,000,000 ≤ N≤ 1,000,000,000。
输出
输出共 1 行,一个整数,表示反转后的新数。
【样例输入】
样例 #1:
123
样例 #2:
-380
【样例输出】
样例 #1:
321
样例 #2:
-83
#include#includeusing namespace std;int main(){ int n; int s=0; cin>>n; if(n<0) cout<<"-"; n=abs(n); do { s=s*10+n%10; n/=10; }while(n>0); cout< return 0;}
8:含k个3的数
【问题描述】
输入两个正整数 m 和 k,其中1 < m < 100000,1 < k < 5 ,判断 m 能否被19整除,且恰好含有k个3,如果满足条件,则输出YES,否则,输出NO。
例如,输入:43833 3满足条件,输出YES。如果输入:39331 3尽管有3个3,但不能被19整除,也不满足条件,应输出NO。
输入
m 和 k 的值,中间用单个空格间隔。
输出
满足条件时输出 YES,不满足时输出 NO。
【样例输入】
43833 3
【样例输出】
YES
#includeusing namespace std;int main(){ int m,k,a,sum=0; cin>>m>>k; int p=m; for(;m>0;m/=10) { a=m%10; if(a==3) sum++; } if((sum==k)&&(p%19==0)) cout<<"YES"; else cout<<"NO"; return 0;}
9:开关灯
【问题描述】
假设有N盏灯(N为不大于5000的正整数),从1到N按顺序依次编号,初始时全部处于开启状态;有M个人(M为不大于N的正整数)也从1到M依次编号。第一个人(1号)将灯全部关闭,第二个人(2号)将编号为2的倍数的灯打开,第三个人(3号)将编号为3的倍数的灯做相反处理(即,将打开的灯关闭,将关闭的灯打开)。依照编号递增顺序,以后的人都和3号一样,将凡是自己编号倍数的灯做相反处理。请问:当第M个人操作之后,哪几盏灯是关闭的,按从小到大输出其编号,其间用逗号间隔。
输入
输入正整数N和M,以单个空格隔开。
输出
顺次输出关闭的灯的编号,其间用逗号间隔。
【样例输入】
10 10
【样例输出】
1,4,9
#include using namespace std;int main(){ int n,m,i,j,flag; cin>>n>>m; cout<<1; for(i=2;i<=n;i++) { flag=1; for(j=1;j<=m;j++) { if(i%j==0) { if(flag==0) flag=1; else flag=0; } else continue; } if(flag==0) cout<<","< } return 0;}
10:求分数序列和
【问题描述】
有一个分数序列 q1/p1,q2/p2,q3/p3,q4/p4,q5/p5,.... ,其中qi+1= qi+ pi, pi+1=qi, p1= 1, q1= 2。比如这个序列前6项分别是2/1,3/2,5/3,8/5,13/8,21/13。求这个分数序列的前n项之和。
输入
输入有一行,包含一个正整数n(n <= 30)。
输出
输出有一行,包含一个浮点数,表示分数序列前n项的和,精确到小数点后4位。
【样例输入】
2
【样例输出】
3.5000
#include #include using namespace std;int main(){ int n,i; double sum=0; double a[35],b[35],c[35]; cin>>n; a[0]=2; b[0]=1; for(i=1;i { a[i]=a[i-1]+b[i-1]; b[i]=a[i-1]; c[i]=a[i]/b[i]; sum+=c[i]; } sum=sum+2.0; printf("%.4lf",sum); return 0;}
11:计算分数加减表达式的值
【问题描述】
编写程序,输入n的值,求 1/1 - 1/2 + 1/3 - 1/4 + 1/5 - 1/6 + 1/7 - 1/8 + ... + (-1)n-1·1/n 的值。
输入
输入一个正整数n。1 <= n <= 1000。
输出
输出一个实数,为表达式的值,保留到小数点后四位。
【样例输入】
2
【样例输出】
0.5000
#include #include using namespace std;int main(){ int n,i; double s=0; cin>>n; for(i=1;i<=n;i++) { if(i%2==0) s=s-1/double(i); else s=s+1/double(i); } printf("%.4lf",s); return 0;}