7-1计算值控制的循环 求π的近似值
用公式求π的近似值:π2/6=1+1/22+1/32+1/42+。。。
当求和项小于误差时,结束求和。
输入格式:
在一行输入误差范围
输出格式:
在一行输出π的近似值(保留6位小数)。
输入样例:
在这里给出一组输入。例如:
0.00000001
输出样例:
在这里给出相应的输出。例如:
3.141497
#include<bits/stdc++.h>
using namespace std;
int main(){
double s,x,a;
cin>>a;
for(int i=1;;i++){
x=1.0/(i*i);
if(x<a)break;
s+=x;
}printf("%.6f",sqrt(s*6));
return 0;
}
7-2计算值控制的循环 π的近似值
本题目要求编写程序,利用4π=1−31+51−71+...计算π的近似值,直到最后一项的绝对值小于eps时为止,输出π的值。
输入格式:
在一行中键盘输入精度eps(eps<=1e-2)。
输出格式:
在一行中输出pi=S,S为eps精度下π的近似值,结果保留小数点后6位。
输入样例:
0.0001
输出样例:
pi=3.141793
#include<bits/stdc++.h>
using namespace std;
int main(){
double s=1,x=1,a;int k=-1;
cin>>a;
for(int i=3;;i+=2){
if(abs(x)<a)break;
x=1.0*k/i;
s+=x;
k=-k;
}printf("pi=%.6f",s*4);
return 0;
}
7-3计算值控制的循环 泰勒展开式求sinx近似
用泰勒展开式求sinx近似值的多项式为:
。
输入x求sinx的近似值,要求误差不大于0.00001。
输入格式:
直接输入一个实型数据。没有其它任何附加字符。
输出格式:
直接输出保留3位小数的实型结果。
输入样例:
2.5
输出样例:
0.598
#include<bits/stdc++.h>
using namespace std;
int main(){
double x,y,s,z=1;int i,j=1,k=1;
cin>>x;
do{
z=1;
for(i=1;i<=j;i++)
z*=i;
y=pow(x,j)*k/z;
s+=y;
j+=2;k*=-1;
}while(abs(y)>=0.00001);
printf("%.3f",s);
return 0;
}
7-4 break 求最小的n,满足n的阶乘大于等于x。
求最小的n,满足n的阶乘大于等于x,其中x为非负整数,由用户输入。例如,当输入110时,输出5 120 , 其中 5 为最小的n,120 为5的阶乘
输入格式:
请在这里写输入格式。例如:输入一个正整数 110。
输出格式:
请在这里描述输出格式。例如:输出最小的n 和n的阶乘,即 5 120。
输入样例:
在这里给出一组输入。例如:
110
输出样例:
在这里给出相应的输出。例如:
5 120
#include<bits/stdc++.h>
using namespace std;
int main(){
long int n,x=1,y=1;
cin>>n;
while(y<n){
x++;
y*=x;
}cout<<x<<' '<<y;
return 0;
}
7-6 break 爬动的蠕虫
一条蠕虫长1寸,在一口深为N寸的井的底部。已知蠕虫每1分钟可以向上爬U寸,但必须休息1分钟才能接着往上爬。在休息的过程中,蠕虫又下滑了D寸。就这样,上爬和下滑重复进行。请问,蠕虫需要多长时间才能爬出井?
这里要求不足1分钟按1分钟计,并且假定只要在某次上爬过程中蠕虫的头部到达了井的顶部,那么蠕虫就完成任务了。初始时,蠕虫是趴在井底的(即高度为0)。
输入格式:
输入在一行中顺序给出3个正整数N、U、D,其中D<U,N不超过100。
输出格式:
在一行中输出蠕虫爬出井的时间,以分钟为单位。
输入样例:
12 3 1
输出样例:
11
#include<bits/stdc++.h>
using namespace std;
int main(){
int a,b,c,x=1,y=0;
cin>>a>>b>>c;
while(1){
x+=b;
y++;
x-=c;
y++;
if(x>=a)break;
}cout<<y-1;
return 0;
}
7-6输入值控制循环 统计一批学生的平均成绩与不及格人数
本题要求编写程序,计算学生们的平均成绩,并统计不及格(成绩低于60
分)的人数。题目保证输入与输出均在双精度范围内。
输入格式:
输入在一行中给出一系列非负实数,其间以空格分隔。当读到负实数时,表示输入结束,该数字不要处理。
输出格式:
按照以下格式输出:
Average = 成绩均值
Count = 不及格人数
其中平均值精确到小数点后两位,等号的左右各有一个空格。
输入样例1:
67 88 73 54 95 60 0 -1
输出样例1:
Average = 62.43
Count = 2
输入样例2:
-100 90 80 0
输出样例2:
Average = 0.00
#include<bits/stdc++.h>
using namespace std;
int main(){
int a,x=0,y;double s=0;
while(cin>>a){
if(a<0)break;
if(a<60)x++;
y++;
s+=a;
}
if(y==0)cout<<"Average = 0.00";
else printf("Average = %.2f\nCount = %d",s*1.0/y,x);
return 0;
}
7-7输入值控制循环 一批数中最大值最小值
从键盘输入若干学生的成绩,统计并输出最高成绩和最低成绩,当输入负数时循环结束。。
输入格式:
在一行中输入若干个用空格间隔的整数(不要超过15个数),最后输入负数结束输入,数据之间只能用1个空格间隔。
输出格式:
在一行中按照“max=最高分,min=最低分”的格式输出结果,最高分和最低分均原样输出,没有列宽控制。
输入样例:
58 78 95 65 86 -1
输出样例:
max=95,min=58
#include<bits/stdc++.h>
using namespace std;
int main(){
int a,x=0,y=100;
while(cin>>a){
if(a<0)break;
if(x<a)x=a;
if(y>a)y=a;
}
cout<<"max="<<x<<",min="<<y;
return 0;
}
7-8输入值控制循环 统计奇偶
从键盘输入一批正整数(输入-1结束),统计有多少奇数,多少偶数。
输入格式:
输入一批正整数,以空格分隔,以-1结束,-1 仅仅代表结束标志,不算作真正数据,一批数据中仅仅会在最后出现-1。
输出格式:
分别统计奇数和偶数的个数,然后输出,按如下格式:
Odds=4
Evens=5
输入样例:
在这里给出一组输入。例如:
5 2 8 9 4 7 6 3 10 -1
输出样例:
在这里给出相应的输出。例如:
Odds=4
Evens=5
#include<bits/stdc++.h>
using namespace std;
int main(){
int a,x=0,y=0;
while(cin>>a){
if(a==-1)break;
if(a%2)x++;
else y++;
}
cout<<"Ddds="<<x<<endl<<"Evens="<<y;
return 0;
}
7-9计算值控制的循环 统计一个整数的位数
本题要求编写程序,对于给定的整数N,求它的位数。
输入格式:
输入在一行中给出一个绝对值不超过109的整数N。
输出格式:
在一行中输出N的位数。
输入样例1:
12534
输出样例1:
5
输入样例2:
-987600321
输出样例2:
9
输入样例3:
0
输出样例3:
1
#include<bits/stdc++.h>
using namespace std;
int main(){
string s;
cin>>s;
if(s[0]=='-')cout<<s.size()-1;
else cout<<s.size();
return 0;
}
7-10计算值控制的循环 输出一个整数的逆序数
对于给定的整数N,输出其逆序数。
输入格式:
输入在一行中给出一个绝对值不超过109的整数N。
输出格式:
在一行中输出N的逆序数。
输入样例:
-12340
输出样例:
-4321
#include<bits/stdc++.h>
using namespace std;
int main(){
string s;int n;
cin>>n;
if(n==0){cout<<"0";return 0;}
s=to_string(n);
int k=0;
if(s[0]=='-')cout<<"-";
for(int i=s.size()-1;i>=0;i--){
if(s[i]=='-')continue;
if(s[i]=='0'&&k==0)continue;
if(s[i]!='0')k=1;
cout<<s[i];
}
return 0;
}
7-11 break 判断一个整数是否为素数
本题要求编写程序,判断一个给定的整数是否为素数。素数就是只能被1和自身整除的正整数,1不是素数,2是素数。
输入格式:
输入在一行中给出一个需要判断的整数 M(−231≤M≤231−1)。
输出格式:
如果M是素数,则在一行中输出Yes
,否则输出No
。如果输入了非正整数,也要输出No
。
输入样例1:
11
输出样例1:
Yes
输入样例2:
9
输出样例2:
No
输入样例3:
-2
输出样例3:
No
#include<bits/stdc++.h>
using namespace std;
int main(){
int m,i,k=0;
cin>>m;
if(m<=1)k=1;
for(i=2;i<=sqrt(m);i++)
if(m%i==0)k=1;
if(k==0)cout<<"Yes";
else cout<<"No";
return 0;
}
7-12 迭代 兔子繁殖问题
已知有一对兔子,每个月可以生一对兔子,而小兔子一个月后又可以生一对小兔子(比如:2月份出生的小兔子4月份可以生育)。也就是说,兔子的对数为:第一个月1对,第二个月2对,第三个月3对,第四个月5对.....假设兔子的生育期为两年,且不死。那么问题来了,你能说出每个月的兔子数么?
输入格式:
输入一个数n,表示第n个月,1<=n<=24。
输出格式:
输出这个月兔子的数目。
输入样例:
4
输出样例:
5
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,i,a[25];
cin>>n;
a[1]=1;a[2]=2;
for(i=3;i<=n;i++)a[i]=a[i-2]+a[i-1];
cout<<a[n];
return 0;
}
7-13 穷举 穷举问题-搬砖
某工地需要搬运砖块,已知男人一人搬3
块,女人一人搬2
块,小孩两人搬1
块。如果想用n
人正好搬n
块砖,问有多少种搬法?
输入格式:
输入在一行中给出一个正整数n
。
输出格式:
输出在每一行显示一种方案,按照"men = cnt_m, women = cnt_w, child = cnt_c
"的格式,输出男人的数量cnt_m
,女人的数量cnt_w
,小孩的数量cnt_c
。请注意,等号的两侧各有一个空格,逗号的后面也有一个空格。
如果找不到符合条件的方案,则输出"None
"
输入样例:
45
输出样例:
men = 0, women = 15, child = 30
men = 3, women = 10, child = 32
men = 6, women = 5, child = 34
men = 9, women = 0, child = 36
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,i,j,k,x=0;
cin>>n;
for(i=0;i<=n/3;i++){
for(j=0;j<=n/2;j++){
for(k=0;k<=2*n;k++){
if(((i*3+2*j+k/2.0)==n)&&(i+j+k==n))
{ printf("men = %d, women = %d, child = %d\n",i,j,k);x=1;}
}
}
}if(x==0)cout<<"None";
return 0;
}
7-14穷举 百钱买百鸡问题(升级版-N钱买N鸡)
百钱买百鸡问题:公鸡五文钱一只,母鸡三文钱一只,小鸡三只一文钱,用100文钱买100只鸡,公鸡、母鸡、小鸡各买多少只?
本程序要求解的问题是:给定一个正整数n,用n文钱买n只鸡,问公鸡、母鸡、小鸡各买多少只?
输入格式:
输入一个正整数n(n<=100)。
输出格式:
如果有解,种组合占一行,包含公鸡、母鸡、小鸡的个数,用正整数表示,每个数据占4列。公鸡母鸡小鸡个数均大于等于0,按公鸡数目从小到大输出,公鸡数目相同按母鸡数目从小到大输出,以此类推。如果无解,输出No Answer
。
输入样例:
在这里给出一组输入。例如:
100
输出样例:
在这里给出相应的输出。例如:
0 25 75
4 18 78
8 11 81
12 4 84
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,i,j,k,x=0;
cin>>n;
for(i=0;i<=n/5;i++){
for(j=0;j<=n/3;j++){
for(k=0;k<=3*n;k++){
if(((i*5+3*j+k/3.0)==n)&&(i+j+k==n))
{ printf("%4d%4d%4d\n",i,j,k);x=1;}
}
}
}if(x==0)cout<<"No Answer";
return 0;
}
7-15 穷举 韩信点兵
在中国数学史上,广泛流传着一个“韩信点兵”的故事:韩信是汉高祖刘邦手下的大将,他英勇善战,智谋超群,为汉朝建立了卓越的功劳。据说韩信的数学水平也非常高超,他在点兵的时候,为了知道有多少兵,同时又能保住军事机密,便让士兵排队报数:
- 按从1至5报数,记下最末一个士兵报的数为1;
- 再按从1至6报数,记下最末一个士兵报的数为5;
- 再按从1至7报数,记下最末一个士兵报的数为4;
- 最后按从1至11报数,最末一个士兵报的数为10;
请编写程序计算韩信至少有多少兵。
输入格式:
本题无输入
输出格式:
输出韩信至少拥有的士兵人数。
#include<bits/stdc++.h>
using namespace std;
int main(){
for(int i=1;;i++){
if(i%5==1&&i%6==5&&i%7==4&&i%11==10){
cout<<i;break;
}
}
return 0;
}
7-16嵌套循环 打印九九口诀表
下面是一个完整的下三角九九口诀表:
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
1*4=4 2*4=8 3*4=12 4*4=16
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
本题要求对任意给定的一位正整数N
,输出从1*1
到N*N
的部分口诀表。
输入格式:
输入在一行中给出一个正整数N
(1≤N
≤9)。
输出格式:
输出下三角N*N
部分口诀表,其中等号右边数字占4位、左对齐。
输入样例:
4
输出样例:
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
1*4=4 2*4=8 3*4=12 4*4=16
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,i,j;
cin>>n;
for(i=1;i<=n;i++){
for(j=1;j<=i;j++){
printf("%d*%d=%-4d",j,i,i*j);
}
cout<<endl;
}
return 0;
}
7-17嵌套循环 数字金字塔
输入正整数n,输出n层数字金字塔。
输入格式:
正整数n,1<=n<=9。
输出格式:
n层的金字塔,其中第1层的“1”在第1行的第39列(列从1开始计数)。
输入样例:
5
输出样例:
1
121
12321
1234321
123454321
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,i,j;
cin>>n;
for(i=0;i<n;i++){
for(j=1;j<=38-i;j++)cout<<' ';
for(j=1;j<=i+1;j++)cout<<j;
for(j=i;j>=1;j--)cout<<j;
cout<<endl;
}
return 0;
}
7-18穷举 换硬币
将一笔零钱换成5分、2分和1分的硬币,要求每种硬币至少有一枚,有几种不同的换法?
输入格式:
输入在一行中给出待换的零钱数额x∈(8,100)。
输出格式:
要求按5分、2分和1分硬币的数量依次从大到小的顺序,输出各种换法。每行输出一种换法,格式为:“fen5:5分硬币数量, fen2:2分硬币数量, fen1:1分硬币数量, total:硬币总数量”。最后一行输出“count = 换法个数”。
输入样例:
13
输出样例:
fen5:2, fen2:1, fen1:1, total:4
fen5:1, fen2:3, fen1:2, total:6
fen5:1, fen2:2, fen1:4, total:7
fen5:1, fen2:1, fen1:6, total:8
count = 4
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,i,j,k,x=0;
cin>>n;
for(i=n/5;i>=1;i--){
for(j=n/2;j>=1;j--){
for(k=n;k>=1;k--){
if(((i*5+2*j+k)==n))
{ printf("fen5:%d, fen2:%d, fen1:%d, total:%d\n",i,j,k,i+j+k);x++;}
}
}
} cout<<"count = "<<x;
return 0;
}
7-19 念数字
输入一个整数,输出每个数字对应的拼音。当整数为负数时,先输出fu
字。十个数字对应的拼音如下:
0: ling
1: yi
2: er
3: san
4: si
5: wu
6: liu
7: qi
8: ba
9: jiu
输入格式:
输入在一行中给出一个整数,如:1234
。
提示:整数包括负数、零和正数。
输出格式:
在一行中输出这个整数对应的拼音,每个数字的拼音之间用空格分开,行末没有最后的空格。如yi er san si
。
输入样例:
-600
输出样例:
fu liu ling ling
#include<bits/stdc++.h>
using namespace std;
int main(){
string s,a[10]={"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
cin>>s;
for(int i=0;i<s.size();i++){
if(s[i]=='-')cout<<"fu";
else
cout<<a[s[i]-'0'];
if(i!=s.size()-1)cout<<' ';
}
return 0;
}
7-20嵌套循环 猜算式?2*7?=3848中的数字
算式:?2*7?=3848中缺少一个十位数和一个个位数。编程求出使该算式成立时的这两个数,并输出正确的算式。
输出格式:
在一行中输出A2*B7=C的值。
输出样例:
52*74=3848
#include<bits/stdc++.h>
using namespace std;
int main(){
for(int i=1;i<10;i++){
for(int j=1;j<10;j++){
if(((i*10+2)*(70+j))==3848)
cout<<i*10+2<<"*"<<7*10+j<<"=3848"<<endl;
}
}
return 0;
}
7-21 最大公约数和最小公倍数
本题要求两个给定正整数的最大公约数和最小公倍数。
输入格式:
输入在一行中给出两个正整数M和N(≤1000)。
输出格式:
在一行中顺序输出M和N的最大公约数和最小公倍数,两数字间以1空格分隔。
输入样例:
511 292
输出样例:
73 2044
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,m,a,x,y;
cin>>n>>m;x=n,y=m;
if(n%m==0)a=n/m;
while(1){
a=abs(n-m);
n=m;
m=a;
if(n%m==0)break;
}
cout<<a<<' '<<x/a*y;;
return 0;
}