洛谷 【入门3】循环结构详解(C++)

  • Post author:
  • Post category:其他


P5718 【深基4.例2】找最小值

#include <iostream>
using namespace std;

int main()
{
    int n = 0;
    cin >> n;
    int i = 0;
    int num = 0;
    int min = 1000;
    for(i=0; i<n; i++)
    {
        cin >> num;
        if(num < min)
        {
            min = num;
        }
    }
    cout << min;
    
    return 0;
}

这题这样是简单高效的方法。

P5719 【深基4.例3】分类平均

#include <iostream>
using namespace std;

int main()
{
    int n = 0, k = 0;
    cin >> n >> k;
    int i = 0;
    int sum1 = 0, sum2 = 0;
    int count1 = 0, count2 = 0;
    for(i=1; i<=n; i++)
    {
        if(i%k == 0)
        {
            sum1 += i;
            count1++;
        }
        else
        {
            sum2 += i;
            count2++;
        }
    }
    printf("%.1f %.1f\n", sum1*1.0/count1, sum2*1.0/count2);
    return 0;
}
#include <iostream>
using namespace std;

int main()
{
    int n = 0, k = 0;
    int sum = 0;
    cin >> n >> k;
    int i = 0;
    for(i=k; i<=n; i+=k)
    {
        sum += i;
    }
    printf("%.1f ", sum*1.0/(n/k));
    sum = n*(1+n) / 2 - sum;
    printf("%.1f\n", sum*1.0/(n-n/k));
    
    return 0;
}

2法,被k整除,即为k的倍数。和可以用高斯求和再减。

P5720 【深基4.例4】一尺之棰

#include <iostream>
using namespace std;

int a, day = 1;

int main()
{
    cin >> a;
    while(a != 1)
    {
        a /= 2;
        day++;
    }
    cout << day;
    
    return 0;
}

声明全局也可以赋初值。

#include <iostream>
using namespace std;

int a, day = 1;

int main()
{
    cin >> a;
    while(a != 1)
    {
        a >>= 1;
        day++;
    }
    cout << day;
    
    return 0;
}

也可以用右移代替除2的操作。

P5721 【深基4.例6】数字直角三角形

#include <iostream>
using namespace std;

int main()
{
    int n = 0;
    cin >> n;
    int i = 0;
    int j = 0;
    int num = 1;
    for(i=0; i<n; i++)
    {
        for(j=0; j<n-i; j++)
        {
            printf("%02d", num++);
        }
        cout << '\n';
    }
    return 0;
}

这题解方法真是千奇百怪,还是用这个吧,定义一个num用完后自加。

P1009 [NOIP1998 普及组] 阶乘之和

这题暂放

P1980 [NOIP2013 普及组] 计数问题

#include <iostream>
using namespace std;

int main()
{
    int n = 0, x = 0;
    cin >> n >> x;
    int i = 0;
    int count = 0;
    int tmp = 0;
    for(i=1; i<=n; i++)
    {
        tmp = i;
        while(tmp)
        {
            if(tmp%10 == x)
            {
                count++;
            }
            tmp /= 10;
        }
    }
    cout << count << '\n';
    
    return 0;
}

P1035 [NOIP2002 普及组] 级数求和

我的

#include <iostream>
using namespace std;

int main()
{
    int k = 0;
    cin >> k;
    int n = 1;
    double sum = 0.0;
    while(sum <= k)
    {
        sum += 1.0/n;
        n++;
    }
    cout << n-1 << endl;
    return 0;
}
#include <iostream>
using namespace std;

int main()
{
    int k = 0;
    cin >> k;
    int n = 0;
    double sum = 0.0;
    for(; sum<=k; ++n, sum+=1.0/n)
    ;
    cout << n;
    return 0;
}

或者这样,注意两者区别++n和n++。

P2669 [NOIP2015 普及组] 金币

#include <iostream>
using namespace std;

int main()
{
    int k = 0;
    cin >> k;//k为总天数
    int i = 0;
    int j = 0;
    int n = 0;
    int sum = 0;
    for(i=1; ; i++)
    {
        for(j=1; j<=i; j++)
        {
            if(n < k)
            {
                sum += i;
                n++;
            }
            else
            {
                cout << sum;
                return 0;
            }
        }
    }
    
    return 0;
}

首先第一个循环因为不知道天数中每天的金币中加到多少,所以中间为空,代表每天的金币数,第二个循环表示之后的天数,n为天数,比总天数k小时,加到和中,n多一天,否则n>=k时输出sum,并及时退出。

P5722 【深基4.例11】数列求和

#include <iostream>
using namespace std;

int main()
{
    int n = 0;
    cin >> n;
    int i = 0;
    int sum = 0;
    for(i=1; i<=n; i++)
    {
        sum += i;
    }
    cout << sum;
    return 0;
}

O(1)

#include <iostream>
using namespace std;

int main()
{
    int n = 0;
    cin >> n;
    int i = 0;
    int sum = 0;
    sum = n*(1+n) / 2;
    cout << sum;
    return 0;
}

P5723 【深基4.例13】质数口袋

#include <iostream>
using namespace std;

int main()
{
    int L = 0;
    cin >>L;
    int i = 0;
    int sum = 0;
    int j = 0;
    int count = 0;
    for(i=2; ;i++)
    {
        for(j=2; j<=i/2; j++)
        {
            if(i % j == 0)
            {
                break;
            }
        }
        if(j > i/2)
        {
            sum += i;
            if(sum > L)
            {
                break;
            }
            cout << i << '\n';
            count++;
        }
    }
    cout << count;
    
    return 0;
}

注意,sum==l时也满足,所以不要忘了输出。

[USACO1.5]回文质数 Prime Palindromes

暂放

小玉在游泳

#include <iostream>
using namespace std;

int main()
{
    double n = 0.0;
    cin >> n;
    int count = 0;
    double sum = 0.0;
    double step = 2.0;
    while(sum < n)
    {
        sum += step;
        step *= 0.98;
        count++;
    }
    cout << count;
    
    return 0;
}

[NOIP2011 普及组] 数字反转

#include <iostream>
using namespace std;

int main()
{
    int n = 0;
    cin >> n;
    int ans = 0;
    while(n)
    {
        ans = ans*10 + n%10;
        n /= 10;
    }
    cout << ans;
    
    return 0;
}

注意负号是没有影响的,比如-324%10=-320+(-4) = 余数-4。

P1720 月落乌啼算钱(斐波那契数列)

#include <iostream>
#include <cmath>
using namespace std;

int main()
{
    int n = 0;
    cin >> n;
    double ans = 0.0;
    double n1 = 0.0, n2 = 0.0;
    n1 = pow(((1+sqrt(5)) / 2), n);
    n2 = pow(((1-sqrt(5)) / 2), n);
    ans = (n1-n2) / sqrt(5);
    printf("%.2f\n", ans);
    
    return 0;
}

P5724 【深基4.习5】求极差 / 最大跨度值

#include <iostream>
using namespace std;

int main()
{
    int n = 0;
    cin >> n;
    int i = 0;
    int num = 0;
    int max = 0;
    int min = 1000;
    for(i=0; i<n; i++)
    {
        cin >> num;
        if(num > max)
        {
            max = num;
        }
        if(num < min)
        {
            min = num;
        }
    }
    cout << max-min << endl;
    return 0;
}

也可以用C++自带的函数

#include <iostream>
using namespace std;

int main()
{
    int n = 0;
    cin >> n;
    int i = 0;
    int num = 0;
    int Max = 0;
    int Min = 1000;
    for(i=0; i<n; i++)
    {
        cin >> num;
        Max = max(num, Max);
        Min = min(num, Min);
    }
    cout << Max-Min << endl;
    return 0;
}

P1420 最长连号

#include <iostream>
using namespace std;

int n, num1, i, num2, countt = 1, maxx = 1;

int main()
{
    cin >> n >> num1;
    for (i = 2; i <= n; i++)
    {
        cin >> num2;
        if (num2 > num1 && num2 - 1 == num1)
        {
            countt++;
        }
        else
        {
            countt = 1;
        }
        if (countt > maxx)
        {
            maxx = countt;
        }
        num1 = num2;
    }
    cout << maxx << endl;

    return 0;
}

在我试着用全局声明变量时发现一个错误,即不能与库函数冲突,大家也要注意!

P1075 [NOIP2012 普及组] 质因数分解

#include <iostream>
using namespace std;

int main()
{
    int n = 0;
    cin >> n;
    int i = 0;
    for(i=2; i<=n/2; i++)
    {
        if(n%i == 0)
        {
            cout << n/i << endl;
            break;
        }
    }
    
    return 0;
}

这题主要是审题意,正整数n是两个不同的质数的乘积。所以只要从2开始,假设能被x整除,然后一个数能被x整除,那么被n/x也能整除。

P5725 【深基4.习8】求三角形

#include <iostream>
using namespace std;

int main()
{
    int n = 0;
    cin >> n;
    int i = 0;
    int j = 0;
    int num = 1;
    for(i=0; i<n; i++)
    {
        for(j=0; j<n; j++)
        {
            printf("%02d", i*n+j+1);
        }
        cout << '\n';
    }
    cout << '\n';
    for(i=0; i<n; i++)
    {
        for(j=0; j<n-i-1; j++)
        {
            cout << "  ";
        }
        for(j=0; j<=i; j++)
        {
            printf("%02d", num++);
        }
        cout << '\n';
    }
    
    return 0;
}

这边直接用%02d非常方便。

P5726 【深基4.习9】打分

#include <iostream>
using namespace std;

int main()
{
    int n = 0;
    cin >> n;
    int i = 0;
    int sum = 0;
    int num = 0;
    int Max = 0;
    int Min = 10;
    for(i=0; i<n; i++)
    {
        cin >> num;
        Max = max(num, Max);
        Min = min(num, Min);
        sum += num;
    }
    sum -= Max + Min;
    printf("%.2f\n", sum*1.0/(n-2));
    
    return 0;
}

注意无论是double型的还是float型的,输出的占位符都为%f,没有%lf这一说。

P4956 [COCI2017-2018#6] Davor

#include <iostream>
using namespace std;

int main()
{
    int n = 0;
    cin >> n;
    n /= 52*7;
    if(n <= 103)
    {
        cout << n-3 << endl << 1;
    }
    else if(n%3 == 0)
    {
        cout << 99 << endl << (n-99)/3;
    }
    else if(n%3 == 1)
    {
        cout << 100 << endl << (n-100)/3;
    }
    else if(n%3 == 2)
    {
        cout << 98 << endl << (n-98)/3;
    }
    
    return 0;
}

注意这边要分两种一个是n<=103时,这种不管什么n%3是什么情况都是n-3,而别一种需要讨论。

#include <iostream>
using namespace std;

int main()
{
    int n = 0;
    cin >> n;
    int k = 1;
    int x = 0;
    while(1)
    {
        for(x=100; x>=1; x--)
        {
            if(52*7*(x+3*k) == n)
            {
                cout << x << endl << k;
                return 0;
            }
        }
        k++;
    }
    
    
    return 0;
}

x有范围可以一个个比较,如果不成立则将k自加。

P1089 [NOIP2004 提高组] 津津的储蓄计划

#define _CRT_SECURE_NO_WARNINGS 1

#include <iostream>
using namespace std;

int main()
{
    int m = 0;
    int i = 0;
    int cost = 0;
    int save = 0;
    for (i = 0; i < 12; i++)
    {
        m += 300;
        cin >> cost;
        m -= cost;
        if (m < 0)
        {
            cout << -(i + 1) << endl;
            return 0;
        }
        if (m / 100)
        {
            save += m / 100 * 100;
        }
        m = m % 100;
    }
    cout << m + save * 1.2;

    return 0;
}

这题我有两个错误,1是题意没看清,钱少于0输出的是月份,2是我原先给钱是最后给300,到12月的时候给了13个月的钱,所以一直没对。



版权声明:本文为yeeeeeeeee_原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。