Bootstrap

OpenJudge题解——1.5编程基础之循环控制


01:求平均年龄

提示:见代码。

#include<bits/stdc++.h>
using namespace std;
int main(){
	int n,a,num=0;
	float ave;
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a;
		num=num+a;
	}
	ave=num*1.0/n;
	printf("%.2f",ave);		
	return 0;
} 

02:财务管理

提示:见代码。

#include<bits/stdc++.h>
using namespace std;
int main(){
	float a,sum=0;
	for(int i=0;i<12;i++){
		cin>>a;
		sum=sum+a;	
	}
	printf("$%.2f",sum/12);	
	return 0;
} 

03:均值

提示:见代码。

#include<bits/stdc++.h>
using namespace std;
int main(){
	int n;
	float a,sum=0;
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>a;
		sum=sum+a;	
	}
	printf("%.4f",sum/n);	
	return 0;
} 

04:求整数的和与均值

提示:见代码。

#include<bits/stdc++.h>
using namespace std;
int main(){
	int n,a,sum=0;
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>a;
		sum=sum+a;	
	}
	printf("%d %.5f",sum,sum*1.0/n);	
	return 0;
} 

05:最高的分数

提示:见代码。

#include<bits/stdc++.h>
using namespace std;
int main(){
	int n,a,mx=0;
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>a;
		if(a>mx) mx=a;	
	}
	printf("%d",mx);	
	return 0;
} 

06:整数序列的元素最大跨度值

提示:见代码。

#include<bits/stdc++.h>
using namespace std;
int main(){
	int n,a[1005],mx,mn;
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>a[i];
	}
	mn=a[0]; //假设a[0]是最小值 
	mx=a[0]; //假设a[0]是最大值
	for(int i=0;i<n;i++){
		if(a[i]>mx) mx=a[i];
		if(a[i]<mn) mn=a[i];
	}
	printf("%d",mx-mn);	
	return 0;
} 

07:奥运奖牌计数

提示:注意数组要定义在主函数外,不然会有初始值。写在里面就要将数组各项都初始化为0。

#include<bits/stdc++.h>
using namespace std;
int n,j,y,t,a[5];  
int main(){
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>j>>y>>t;
		a[1]+=j;
		a[2]+=y;
		a[3]+=t;
		a[4]+=(j+y+t);
	}
	printf("%d %d %d %d",a[1],a[2],a[3],a[4]);
	return 0;
}

08:多边形内角和

提示:将输入的n-1个角都累加起来,再通过公式一减,结果就出来了。

#include<bits/stdc++.h>
using namespace std;
int n,a,sum;  
int main(){
	cin>>n;
	for(int i=0;i<n-1;i++){
		cin>>a;
		sum+=a;
	}
	printf("%d",(n-2)*180-sum);
	return 0;
}

09:奇数求和

提示:见代码。

#include<bits/stdc++.h>
using namespace std;
int m,n,sum;  
int main(){
	cin>>m>>n;
	for(int i=m;i<=n;i++){
		if(i%2!=0) sum+=i;
	}
	printf("%d",sum);
	return 0;
}

10:满足条件的数累加

提示:见代码。

#include<bits/stdc++.h>
using namespace std;
int m,n,sum;  
int main(){
	cin>>m>>n;
	for(int i=m;i<=n;i++){
		if(i%17==0) sum+=i;
	}
	printf("%d",sum);
	return 0;
}

11:整数的个数

提示:注意数组是从0开始的,开10就只能到9,尽量大一些。

#include<bits/stdc++.h>
using namespace std;
int k,n,a[15];  
int main(){
	cin>>k;
	for(int i=0;i<k;i++){
		cin>>n;
		a[n]+=1;
	}
	printf("%d\n%d\n%d",a[1],a[5],a[10]);
	return 0;
}

12:与指定数字相同的数的个数

提示:见代码。

#include<bits/stdc++.h>
using namespace std;
int n,m,a,sum;  
int main(){
	cin>>n>>m;
	for(int i=0;i<n;i++){
		cin>>a;
		if(a==m) sum++;
	}
	printf("%d",sum);
	return 0;
}

13:乘方计算

提示:定义一个变量s为1,从1开始乘。

#include<bits/stdc++.h>
using namespace std;
int a,n,s=1;  
int main(){
	cin>>a>>n;
	for(int i=0;i<n;i++){
		s=s*a;
	}
	printf("%d",s);
	return 0;
}

14:人口增长问题

提示:要用double不然只能得9分。

#include<bits/stdc++.h>
using namespace std;
int x,n;
double num;
int main(){
	cin>>x>>n;
	num=x;
	for(int i=0;i<n;i++){
		num*=1+0.001;
	}
	printf("%.4lf",num);
	return 0;
}

15:银行利息

提示:使用int强制类型装换,去掉小数部分。

#include<bits/stdc++.h>
using namespace std;
int r,y,m;
double num;
int main(){
	cin>>r>>m>>y;
	num=m;
	for(int i=0;i<y;i++){
		num*=1+r*0.01;
	}
	cout<<int(num);
	return 0;
}

16:买房子

提示:注意英文别打错了。房子价格的计算要放在循环的末尾,因为第一年放假是不变的。

#include<bits/stdc++.h>
using namespace std;
double n,k,num=200,money;
int main(){
	cin>>n>>k;
	for(int i=1;i<=20;i++){
		money=money+n;
		if(money>=num){
			cout<<i;
			return 0;
		}
		num=num*(k/100+1);
	}	
	cout<<"Impossible";
	return 0;
}

17:菲波那契数列

提示:见代码。

#include<bits/stdc++.h>
using namespace std;
int a[100],k;
int main(){
	a[1]=1;
	a[2]=1;
	cin>>k;
	for(int i=3;i<=k;i++){
		a[i]=a[i-1]+a[i-2];
	}	
	cout<<a[k];
	return 0;
}

18:鸡尾酒疗法

提示:效果的计算是用有效案例除以总案例。

#include<bits/stdc++.h>
using namespace std;
int n;
float a[100],x,y;
int main(){
	cin>>n;
	cin>>x>>y; //x:总案例 y:有效案例
	a[0]=y/x; //计算效果
	for(int i=1;i<n;i++){
		cin>>x>>y; //x:总案例 y:有效案例
		a[i]=y/x; //计算效果
		if(a[i]-a[0]>0.05) cout<<"better"<<endl;
		else if(a[0]-a[i]>0.05) cout<<"worse"<<endl;
		else cout<<"same"<<endl;
	}	
	return 0;
}

19:救援

提示:题目描述容易看漏,样例只给了一个,但是有可能求多个数据,所以时间要进行累加。

#include<bits/stdc++.h>
using namespace std;
int n,f;
double x,y,s,t;
int main(){
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>x>>y>>f;
		s=sqrt(x*x+y*y)*2;
		t+=(s/50)+(f*1.5);	
	} 
	cout<<ceil(t);
	return 0;
} 

20:球弹跳高度的计算

提示:h的结果为0.0195312,原题给的示例为0.0195313,应该是给错了。这个代码一样能过。

#include<bits/stdc++.h>
using namespace std;
double sum,h;
int main(){
	cin>>h;
	for(int i=1;i<=10;i++){
		sum+=1.5*h; //计算每一次下落加上反弹起来的高度 
		h/=2;
	} 
	sum=sum-h; //减去最终上升的高度 
	cout<<sum<<endl;
	cout<<h<<endl;
	return 0;
} 

21:角谷猜想

提示:注意数据要开long long 格式化输出注意格式,也可以用cincout

#include<bits/stdc++.h>
using namespace std;
long long n; 
int main(){
	cin>>n;
	while(n!=1){
		if(n%2==0){
			printf("%lld/2=%lld\n",n,n/2);
//			cout<<n<<"/2="<<n/2<<endl;
			n/=2; 	
			
		} 
		else{
			printf("%lld*3+1=%lld\n",n,n*3+1);
//			cout<<n<<"*3+1="<<n*3+1<<endl;
			n=n*3+1;
		} 
		
	}
	if(n==1) cout<<"End";
	return 0;
} 

22:津津的储蓄计划

提示:见代码。

#include<bits/stdc++.h>
using namespace std;
int money,cun,ys,cun_money; //money:余额 cun:每月能存的钱 ys:每月预算 cun_money:总存钱数 
int main(){
	for(int i=1;i<=12;i++){
		cin>>ys;
		money+=300; //先加上妈妈给的300 
		if(money<ys){ //判断是否小于预算 
			cout<<-1*i; //输出负的月数 
			return 0;
		}else{
			cun=100*((money-ys)/100); //计算每月存钱数 
			money-=ys+cun; //减去预算和存的钱就是余下来的钱 
			cun_money+=cun; //加上每个月存的钱 
		}		
	}
	cout<<cun_money*1.2+money;
	return 0;
} 

23:药房管理

提示:注意是大于等于的判断。

#include<bits/stdc++.h>
using namespace std;
int num,n,s,a;
int main(){
	cin>>num>>n;
	for(int i=0;i<n;i++){
		cin>>s;
		if(num>=s) num-=s;
		else a+=1;
	}
	cout<<a;
	return 0;
}

24:正常血压

提示:有可能会出现前面连续,最后一个不满足的情况,所以用一个容器mx来存储最大值。

#include<bits/stdc++.h>
using namespace std;
int n,a,b,t,mx;
int main(){
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>a>>b;
		if(a>=90&&a<=140 && b>=60&&b<=90){
			t+=1;
			if(t>mx) mx=t;
		}
		else t=0;
	}
	cout<<mx;
	return 0;
}

25:求特殊自然数

提示:
题目要求一个十进制数,它的七进制与九进制表示都是三位数,
那么可以先确定查找的范围,最小的7进制三位数100的十进制数是49,最小的9进制三位数100的十进制数是81;最大的7进制三位数666的十进制数是342,最大的9进制三位数888的十进制数是728。要满足7进制和9进制都是三位数,那么范围就是81~342。
十位数转任意进制的方式:除积倒取余
可以通过i/7/7%7i/9/9%9求得7进制和9进制的百位数;
可以通过i/7%7i/9%9求得7进制和9进制的十位数;
可以通过i%7i%9求得7进制和9进制的个位数。

#include<bits/stdc++.h>
using namespace std;
int main(){
    int i;
    for(i=81;i<=342;i++){
        if((i%9==i/7/7%7)&&(i/9%9==i/7%7)&&(i/9/9%9==i%7)){
            cout<<i<<endl; //248
            cout<<i/7/7%7<<i/7%7<<i%7<<endl; //503
            cout<<i/9/9%9<<i/9%9<<i%9<<endl; //305
            break;
        }
    }
    return 0;
}

26:统计满足条件的4位数个数

提示:见代码。

#include<bits/stdc++.h>
using namespace std;
int n,m,g,s,b,q,ans=0;
int main(){
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>m;
		g=m%1000%100%10;
		s=m%1000%100/10;
		b=m%1000/100;
		q=m/1000;
		if(g-q-b-s>0){
			ans++;
		}
	}
	cout<<ans;
	return 0;
}

27:级数求和

提示:注意除法计算的时候,用1.0不然得到的不是浮点数。

#include<bits/stdc++.h>
using namespace std;
double sn,k;
int n=1;
int main(){
	cin>>k;
	while(1){
		sn+=1.0/n;
		if(sn>k){
			cout<<n;
			break;
		}
		n++;
	}
	return 0;
}

28:分离整数的各个数位

提示:见代码。

#include<bits/stdc++.h>
using namespace std;
long long n;
int a;
int main(){
	cin>>n;
	while(n!=0){ //n为0时结束
		a=n%10; //取每一次的个位
		n/=10; //每循环一次,整除10,n的位数不断变少
		cout<<a<<" ";
	}
	return 0;
}

29:数字反转

提示:见代码,在上面代码的基础上做了修改。

#include<bits/stdc++.h>
using namespace std;
long long n;
int a,flag=0;
int main(){
	cin>>n;
	if(n==0) cout<<n; //为0时,直接输出
	if(n<0){
		cout<<"-"; //先输出负号 
		n=-1*n; //变成整数 
	}
	while(n!=0){ 
		a=n%10; //逐个取个位 
		n/=10; //舍去个位 
		if(a!=0||flag!=0){
			cout<<a; //输出个位
			flag++;
		}
	}
	return 0;
}

30:含k个3的数

提示:见代码。

#include<bits/stdc++.h>
using namespace std;
int m,k,num,n;
int main(){
	cin>>m>>k;
	num=m;
	while(num!=0){
		if(num%10==3) n++;
		num/=10;
	}
	if(m%19==0 && n==k) cout<<"YES";
	else cout<<"NO"; 
	return 0;
}

31:开关灯

提示:通过0,1来模拟灯关闭和打开的状态。

#include <bits/stdc++.h>
using namespace std;
int a[5005],n,m;
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++) a[i]=0; //为0时,灯关闭 
    for(int k=2;k<=m;k++){ //从第二个人开始操作都一样 
    	for(int i=k;i<=n;i+=k) a[i]=!a[i]; //取反 
	}
	int flag=0;		
	for(int i=1;i<=n;i++){
		if(!a[i]){
			if(flag==0) cout<<i;
			else cout<<","<<i;
			flag++;
		}
	}	
    return 0;
}

32:求分数序列和

提示:根据题意进行模拟。

#include<bits/stdc++.h>
using namespace std;
double q[35],p[35],sum;
int n; 
int main(){
    cin>>n;
    p[1]=1;
    q[1]=2;
    sum=q[1]/p[1];
    for(int i=1;i<n;i++){
    	p[i+1]=q[i];
    	q[i+1]=q[i]+p[i];
    	sum+=q[i+1]/p[i+1];
	}
	printf("%.4lf",sum);
    return 0;
}

33:计算分数加减表达式的值

提示:见代码。

#include<bits/stdc++.h>
using namespace std;
double sum;
int n; 
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
    	sum+=pow(-1,i-1)/i;
	}
	printf("%.4lf",sum);
    return 0;
}

34:求阶乘的和

提示:见代码。

#include<bits/stdc++.h>
using namespace std;
int n,sum; 
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
    	int temp=1; //每换一个数就初始化为1
    	for(int j=1;j<=i;j++){
    		temp*=j; //计算阶乘
		}
		sum+=temp;
	}
	cout<<sum;
    return 0;
}

35:求出e的值

提示:见代码。

#include<bits/stdc++.h>
using namespace std;
double n,sum=1; 
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
    	double temp=1; //每换一个数就初始化为1
    	for(int j=1;j<=i;j++){
    		temp*=j; //计算阶乘
		}
		sum+=1/temp;
	}
	printf("%.10lf",sum);
    return 0;
}

36:计算多项式的值

提示:见代码。

#include<bits/stdc++.h>
using namespace std;
float x,sum;
int n;
int main(){
	cin>>x>>n;
	for(int i=n;i>=0;i--){
		sum+=pow(x,i);
	} 
	printf("%.2f",sum);
    return 0;
}

37:雇佣兵

提示:这道题,题意需要理解一下。
1.雇佣兵的初始体力是0,最大体力是M;
2.战斗力为N,每战斗N天,战斗力提升1点;
3.拥有X个能量元素,每一个能量元素,能恢复的体力值不超过当前的战斗力N,且每次要恢复到最大体力M(比如现在战斗力为2,最大体力为5,每一个能量元素最多恢复2点体力,要恢复到5,就是2+2+2,至少需要3个能量元素)
4.M天为一个战斗周期,这个M天内,每过N天雇佣兵的战斗力就会上升一点,N为开始时的战斗力(比如开始时的战斗力是2,M为5,则5/2=2,M天结束,战斗力上涨2点)

#include<bits/stdc++.h>
using namespace std;
int m,n,x; 
int main(){
	cin>>m>>n>>x;
	while(x>0){ //循环直到没有能量元素
		for(int i=0;i<m;i+=n){ //每循环一次,增加n点体力,直到大于m
			if(x>=1){ //如果能量元素大于等于1,则减少
				x--; //能量元素减一
			}else{ //否则表示能量元素耗尽了,还没有恢复到最大体力M
				cout<<n; //直接输出之前的n
				return 0; //结束程序
			}	
		}
		n+=m/n; //累加战斗力
	} 
	cout<<n; //正常结束,输出n
	return 0;
}

38:计算多项式的导函数

提示:这题样例有点问题。

#include<cstdio>
int main()
{
        int n,c;
        scanf("%d",&n);
        if(!n)
        {
            printf("0");
            return 0;
        }
        for(int i=n;i>0;i--)
        {
            scanf("%d",&c);
            printf("%d ",c*i);
        } 
        return 0;
}

39:与7无关的数

提示:见代码。

#include<bits/stdc++.h>
using namespace std;
int n,sum,flag,temp;
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
    	temp=i;
    	flag=0;
    	while(temp!=0){
    		if(temp%10==7){
    			flag=1;
    			break;
			}
			temp/=10;
		}
    	if(i%7!=0 && flag==0){
    		sum+=i*i;
		}
	}
    cout<<sum;
    return 0;
}

40:数1的个数

提示:见代码。

#include<bits/stdc++.h>
using namespace std;
int n,sum,temp;
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
    	temp=i;
    	while(temp!=0){
    		if(temp%10==1){
    			sum++;
			}
			temp/=10;
		}
	}
    cout<<sum;
    return 0;
}

41:数字统计

提示:见代码。

#include<bits/stdc++.h>
using namespace std;
int L,R,sum,temp;
int main(){
    cin>>L>>R;
    for(int i=L;i<=R;i++){
    	temp=i;
    	while(temp!=0){
    		if(temp%10==2){
    			sum++;
			}
			temp/=10;
		}
	}
    cout<<sum;
    return 0;
}

42:画矩形

提示:见代码。

#include<bits/stdc++.h>
using namespace std;
int h,l,f;
char c;
int main(){
    cin>>h>>l>>c>>f;
    for(int i=1;i<=h;i++){
    	for(int j=1;j<=l;j++){
    		if(i>1&&i<h && j>1&&j<l){
    			if(f==0) cout<<" ";
    			else cout<<c;
			}
			else cout<<c;
		}
		cout<<endl;
	}
    return 0;
}

43:质因数分解

提示:枚举小因子,小因子最大sqrt(x)

#include<bits/stdc++.h>
using namespace std;
long long n,flag;
int main(){
    cin>>n;
    for(int i=2;i<=sqrt(n);i++){
    	flag=0;
    	for(int j=2;j<sqrt(i);j++){
    		if(i%j==0){
    			flag=1;
				break;
			} 				
		}
		if(flag==0 && n%i==0){
			cout<<n/i;
			return 0;
		}
	}
    return 0;
}

44:第n小的质数

提示:见代码。

#include <stdio.h>
#include <math.h>
int main(){
	int i,j,n,count=0;
	scanf("%d",&n);
	for(i=2;;i++){
		for(j=2;j<=sqrt(i);j++){
			if(i%j==0)break;
		}
		if(j>sqrt(i))count++;
		if(count==n){
			printf("%d\n",i);
			return 0;
		}
	}
}

45:金币

提示:见代码。

#include<bits/stdc++.h>
using namespace std;
int n,sum,temp=1;
int main(){
    cin>>n;
    while(n>0){
    	for(int i=0;i<temp;i++){
    		sum+=temp;
    		n--;
    		if(n==0){
    			cout<<sum;
    			return 0;
			}
		}
		temp++;	
	}
    cout<<sum;
    return 0;
}

以上为个人见解,欢迎指正!

;