PRELOADER

当前文章 : 《洛谷学习笔记——循环循环》

12/2/2019 —— 

洛谷学习笔记——循环循环

P1008 三连击

题目背景

本题为提交答案题,您可以写程序或手算在本机上算出答案后,直接提交答案文本,也可提交答案生成程序。

题目描述

将1,2,⋯,9共9个数分成3组,分别组成3个三位数,且使这3个三位数构成1:2:3的比例,试求出所有满足条件的3个三位数。

输入输出格式

输入格式:

木有输入

输出格式:

若干行,每行3个数字。按照每行第1个数字升序排列。

输入输出样例

输入样例#1:

输出样例#1:

192 384 576
* * *
...

* * *
(输出被和谐了)

解题思路:

1:最小的三位数123(百位是1,十位2,个位是3)由于题目要求不能有重复的数字,所以类比推理最大三位数987,我们假设最小数字是i,

又因为3*i最大为987,所以需要控制循环3i<=987.

2:题目中需要的是9个数字,并且不能够重复的使用,所以第一个,第二个,第三个数字加起来的和要为9,我们可以使用数组进行存储,

每一次使用的数字:a[10],一开始给这个数组的每个元素都赋值为0,然后a[0]=0一直不变,a[1]对于1这个数字,

a[2]对于2这个数字,以此类推,如果这个数字被用过了,则这个数字对应的数组元素就赋值为1.如果在循环结束后,

数组中a[1]-a[9]的元素之和等于9(只有当每个数字都使用了一次,和才会为9,否则都是小于9的),这时我们就可以判定1-9中的元素使用了有且仅用一次

给出源代码:

#include<bits/stdc++.h>
using namespace std;
int main() {
int i,j,k,s,h;
int a[10]; 
for(i=123; 3*i<=987; i++) {  //控制循环的条件 
    for(h=0; h<10; h++)//重置每一次使用的数组,防止影响下一次的计数 
    a[h]=0;
    a[i/100]=1;     //求出百位数字 
    a[i/10%10]=1;   //求出十位数字 
    a[i%10]=1;      //求出个位数字 
    j=2*i;     //j k类似上面的过程 
    a[j/100]=1;
    a[j/10%10]=1;
    a[j%10]=1;
    k=3*i;
    a[k/100]=1;
    a[k/10%10]=1;
    a[k%10]=1;
    for(s=0,h=1; h<10; h++)
        s=s+a[h];   //计算辅助数组的和,即为使用的元素个数 
    if(s==9) {   //使用的个数等于9,即可进行输出操作 
    cout<<i<<' '<<j<<' '<<k<<endl;
    }
}
return 0;
}

P1035 级数求和

题目描述

输入输出格式

输入格式:

一个正整数KK

输出格式:

一个正整数NN

输入输出样例

输入样例#1:

1

输出样例#1:

2

解题思路:

这一题需要考虑两个问题:

1:精度的问题:1.0,需要卡出来;

2:分数的表示,使用循环如何表示分数:1.0/i;

给出源代码:

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int i=1,n,k;
    double s=0;
    cin>>k;
    for(i=1;s<=k;i++)
    {
        s=s+1.0/i;//这个地方考察两个知识点,1:精度问题 2:分数构造问题 
        n=i;
    }
    cout<<n<<endl;
    return 0;
}

P1423 小玉在游泳

题目描述

小玉开心的在游泳,可是她很快难过的发现,自己的力气不够,游泳好累哦。已知小玉第一步能游2米,可是随着越来越累,

力气越来越小,她接下来的每一步都只能游出上一步距离的98%。现在小玉想知道,如果要游到距离x米的地方,她需要游多少步呢。请你编程解决这个问题。

输入输出格式

输入格式:

输入一个数字(不一定是整数,小于100m),表示要游的目标距离。

输出格式:

输出一个整数,表示小玉一共需要游多少步。

输入输出样例

输入样例#1:

4.3

输出样例#1:

3

解题思路:

这一题当然也是需要卡精度的,其实给出的栗子已经有相应的提示了,但是需要注意的是如何使用上一个的值计算下一步游出的距离,

这是一个问题,当然使用sum=sum*0.98就可以解决了,但是这里出现一个问题就是,为什么需要把2这个数字单独使用一个变量进行命名呢

给出不可以通过的源代码:

#include<bits/stdc++.h>
using namespace std;
int  main()
{
    double n,sum=2.0;
    int i;
    cin>>n;
    for(i=1;sum<n;i++)
    {
        sum+=sum*0.98;
    }
    cout<<i<<endl;
    return 0;
 } 

给出AC代码

#include<bits/stdc++.h>
using namespace std;
int  main()
{
    double n,sum=0,a=2;
    int i;
    cin>>n;
    for(i=0;sum<n;i++)
    {
        sum+=a;
        a=a*0.98;
    }
    cout<<i<<endl;
    return 0;
 } 

P1424 小鱼的航程(改进版)

题目背景

原来的题目太简单,现改进让小鱼周末也休息,请已经做过重做该题。

题目描述

有一只小鱼,它上午游泳150公里,下午游泳100公里,晚上和周末都休息(实行双休日),假设从周x(1<=x<=7)开始算起,请问这样过了n天以后,小鱼一共累计游泳了多少公里呢?

输入输出格式

输入格式:

输入两个整数x,n(表示从周x算起,经过n天,n在long int范围内)。

输出格式:

输出一个整数,表示小鱼累计游泳了多少公里。

输入输出样例

输入样例#1:

3 10

输出样例#1:

2000

解题思路:

这一题,最为关键的一点就是,如何准确的计算所在的星期,我们可以使用取余的方法进行计算,然后去除周六以及周日所在的时间

给出源代码:

#include<bits/stdc++.h>
using namespace std;
int main()
{
    long long int x,n,i,sum=0;
    cin>>x>>n;
    for(i=1;i<=n;i++)
    {
        if(x%7!=0&&x%7!=6)//直接使用取余的方法求取周一到周日的时间 
        {
            sum+=250;
        }
        x=(x+1)%7; 
        if(x==0)
        x=7;
    }
    cout<<sum<<endl;
    return 0;
}

P1980 计数问题

题目描述

输入输出格式

解题思路:

面对的第一个问题就是,如何计算数字中有几个我们需要出现的数字,这个时候,我们可以使用短除法进行解决(i%10 ;i/10)

给出源代码:

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