4.1 for语句和while语句

例 4-1

Apples。八尾勇今天又吃掉了 L (1<=L<=100)个苹果。她从吃第 1 个苹果开始,每吃一个苹果都会在纸上记录下来,在纸上写出一行“Today,I ate x apples.”,其中 x 是指吃到第几个苹果。在她吃第一个苹果时,别忘了 apple 这个单词后面不用加上代表复数的 s。她吃完苹果后,在纸上记录了什么内容?

解答

#include<iostream>
using namespace std;

int main()
{
    int L,i;
    cin>>L;
    for(int i=1;i<=L;i++)
    {
        cout<<"Today,I ate "<<i<<" apple";
        if(i!=0&&i!=1)
            cout<<"s";
        cout<<"."<<endl;
    }
    return 0;
}

例 4-2

找最小值(洛谷P5718)。

给出 n(n≤100) 和 n 个整数 a(0≤a≤1000),求这 n 个整数中最小值是什么。

输入输出样例

输入 输出
8
1 9 2 6 0 8 1 7
0

解答

#include<bits/stdc++.h>
using namespace std;

int m,n,s;

int main()
{
    s=1001;
    cin>>m;
    for(int i=0;i<m;i++)
    {
        cin>>n;
        if(n<s)
            s=n;
    }
    cout<<s;
}

例 4-3

分类平均(洛谷P5719)

给定 n(n≤10000) 和 k(k≤100),将从 1 到 n 之间的所有正整数可以分为两类:A 类数可以被 k 整除(也就是说是 k 的倍数),而 B 类数不能。请输出这两类数的平均数,精确到小数点后 1 位,用空格隔开。

数据保证两类数的个数都不会是 0。

输入输出样例

输入 输出
100 16 56.0 50.1

解答

解法一:

相加再除

#include<bits/stdc++.h>
using namespace std;

int n,k,n1c=0,n2c=0;
double n1=0.0,n2=0.0;

int main()
{
    cin>>n>>k;
    for(int i=1;i<=n;i++)
    {
        if(i%k==0)
        {
            n1+=i;
            n1c++;
        }
        else
        {
            n2+=i;
            n2c++;
        }
    }
    cout<<setprecision(1)<<fixed<<n1/n1c<<' '<<n2/n2c;
    
    return 0;
}

解法二

利用等差数列公式

Sn=n(a1+an)/2

#include <bits/stdc++.h>
using namespace std;
double a,b;
int n,k,c;

int main()
{
  cin>>n>>k;
  
  c=n/k; //n个数里面有n/k个k的倍数
  
  a=c*(k+c*k)/2; //求c个k的和
  b=n*(1+n)/2-a; //n个数的和减c个k的和则是剩下数的和
  
  cout<<setprecision(1)<<fixed<<a/c<<' '<<b/(n-c);
  return 0;
}

例 4-4

一尺之棰(洛谷P5720)

《庄子》中说到,“一尺之棰,日取其半,万世不竭”。第一天有一根长度为 a(a≤109) 的木棍,从第二天开始,每天都要将这根木棍锯掉一半(每次除2,向下取整)。第几天的时候木棍会变为 1?

输入输出样例

输入 输出
100 7

解答

模拟过程,整型默认向下取整。

#include<bits/stdc++.h>
using namespace std;

long long m,n=0;
int main()
{
    cin>>m;
    while(m!=1)
    {
        m=m/2;
        n++;
    }
    cout<<n+1; //砍木头是从第二天开始的,这是个坑 
    
    return 0;
}

例 4-5

猜数游戏。小洛机器人和你玩猜数游戏!小洛随机选择并默默记下一个 1~100 的整数,你需要不断地猜测这个数字是什么并输入验证。如果你输入的数字比小洛选择的数字小,小洛会输出“Too small”;如果比小洛选择的数字大,小洛输出“Too large”;如果刚好猜对,小洛输出“You are right!!”。如果一次都没有猜中,则继续猜,知道猜中为止。

解答

#include<iostream>
#include<cstdlib>
#include<ctime>
using namespace std;

int main()
{
	int ans,guess;
	srand(time(0));
	ans = rand()%100+1;
	
	do
	{
		cin>>guess;
		if(guess<ans)
			cout<<"Too small"<<endl;
		if(guess>ans)
			cout<<"Too large"<<endl;
	} while(ans != guess);
	cout<<"You are right!!"<<endl;
    return 0;
}
posted @ 2021-04-22 10:44  CodeSpark  阅读(530)  评论(0)    收藏  举报