【新手上路】洛谷入门3:循环结构题单题解

西风烈,长空雁叫霜晨月。霜晨月,马蹄声碎,喇叭声咽。

文章目录

    • [P5718 【深基4.例2】找最小值](https://www.luogu.com.cn/problem/P5718)
    • [P5719 【深基4.例3】分类平均](https://www.luogu.com.cn/problem/P5719)
    • [P5720 【深基4.例4】一尺之棰](https://www.luogu.com.cn/problem/P5720)
    • [P5721 【深基4.例6】数字直角三角形](https://www.luogu.com.cn/problem/P5721)
    • [P1009 [NOIP 1998 普及组] 阶乘之和](https://www.luogu.com.cn/problem/P1009)
    • [P1980 [NOIP 2013 普及组] 计数问题](https://www.luogu.com.cn/problem/P1980)
    • [P1035 [NOIP 2002 普及组] 级数求和](https://www.luogu.com.cn/problem/P1035)
    • [P2669 [NOIP 2015 普及组] 金币](https://www.luogu.com.cn/problem/P2669)
    • [P5722 【深基4.例11】数列求和](https://www.luogu.com.cn/problem/P5722)
    • [P5723 【深基4.例13】质数口袋](https://www.luogu.com.cn/problem/P5723)
    • [P1217 [USACO1.5] 回文质数 Prime Palindromes](https://www.luogu.com.cn/problem/P1217)
    • [P1423 小玉在游泳](https://www.luogu.com.cn/problem/P1423)
    • [P1307 [NOIP 2011 普及组] 数字反转](https://www.luogu.com.cn/problem/P1307)
    • [P1720 月落乌啼算钱(斐波那契数列)](https://www.luogu.com.cn/problem/P1720)
    • [P5724 【深基4.习5】求极差 / 最大跨度值](https://www.luogu.com.cn/problem/P5724)
    • [P1420 最长连号](https://www.luogu.com.cn/problem/P1420)
    • [P1075 [NOIP 2012 普及组] 质因数分解](https://www.luogu.com.cn/problem/P1075)
    • [P5725 【深基4.习8】求三角形](https://www.luogu.com.cn/problem/P5725)
    • [P5726 【深基4.习9】打分](https://www.luogu.com.cn/problem/P5726)
    • [P4956 [COCI 2017/2018 #6] Davor](https://www.luogu.com.cn/problem/P4956)
    • [P1089 [NOIP 2004 提高组] 津津的储蓄计划](https://www.luogu.com.cn/problem/P1089)


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

代码如下:

#include 
using namespace std;
int main()
{
    int n, a, minn = 10001;
    cin >> n;
    for (int i = 0; i < n; ++i)
    {
        cin >> a;
        minn = min(minn, a);
    }
    cout << minn;
}

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

代码如下:

#include 
using namespace std;
int main()
{
    int n, k;
    cin >> n >> k;
    double sum1 = 0, cnt1 = 0, sum2 = 0, cnt2 = 0;//float过不了
    for (int i = 1; i <= n; ++i)
    {
        if (i % k == 0)
        {
            sum1 += i;
            cnt1++;
        }
        else
        {
            sum2 += i;
            cnt2++;
        }
    }
    printf("%.1f %.1f", sum1 / cnt1, sum2 / cnt2);
}

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

代码如下:

#include 
using namespace std;
int main()
{
    int a, cnt = 1;
    cin >> a;
    while (a > 1)
    {
        cnt++;
        a /= 2;
    }
    cout << cnt;
}

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

代码如下:

#include 
using namespace std;
int main()
{
    int n, cnt = 1;
    cin >> n;
    for (int i = n; i > 0; --i)
    {
        for (int j = 0; j < i; ++j)
        {
            printf("%02d", cnt++);
        }
        cout << endl;
    }
}

P1009 [NOIP 1998 普及组] 阶乘之和

-这个题超纲,需要使用高精度乘法和加法

代码如下:

#include 
using namespace std;

string big_add(string a1, string a2)
{
    const int l = 5005;
    int l1 = a1.size(), l2 = a2.size(), num1[l] = {0}, num2[l] = {0};
    string ans = "";
    for (int i = 0; i < l1; ++i)
        num1[i] = a1[l1 - 1 - i] - '0';
    for (int i = 0; i < l2; ++i)
        num2[i] = a2[l2 - 1 - i] - '0';
    int lmax = l1 > l2 ? l1 : l2;
    for (int i = 0; i < lmax; ++i)
    {
        num1[i] += num2[i];
        num1[i + 1] += num1[i] / 10;
        num1[i] %= 10;
    }
    if (num1[lmax])
        lmax++;
    for (int i = lmax - 1; i >= 0; --i)
    {
        ans += num1[i] + '0';
    }
    return ans;
}

string big_mul(string a1, string a2)
{
    // if (a1 == "0" || a2 == "0")return "0";
    const int l = 5005;
    int l1 = a1.size(), l2 = a2.size(), num1[l] = {0}, num2[l] = {0}, carry[l] = {0};
    string ans = "";
    // 倒序剥离数位
    for (int i = 1; i <= l1; ++i)
        num1[i] = a1[l1 - i] - '0';
    for (int i = 1; i <= l2; ++i)
        num2[i] = a2[l2 - i] - '0';
    // 核心
    for (int i = 1; i <= l1; ++i)
    {
        for (int j = 1; j <= l2; ++j)
        {
            carry[i + j - 1] += num1[i] * num2[j];
        }
    }
    // 统一处理进位
    for (int i = 1; i <= l1 + l2; ++i)
    {
        carry[i + 1] += carry[i] / 10;
        carry[i] %= 10;
    }
    // 转换
    if (carry[l1 + l2])
        ans += carry[l1 + l2] + '0';
    for (int i = l1 + l2 - 1; i >= 1; --i)
    {
        ans += carry[i] + '0';
    }
    return ans;
}

int main()
{
    int n;
    cin >> n;
    string sum_mul, sum_add = "0";
    for (int i = 1; i <= n; ++i)
    {
        sum_mul = "1";
        for (int j = 1; j <= i; ++j)
        {
            sum_mul = big_mul(sum_mul, to_string(j));
        }
        sum_add = big_add(sum_add, sum_mul);
    }
    cout << sum_add;
}

P1980 [NOIP 2013 普及组] 计数问题

代码如下:

#include 
using namespace std;
int main()
{
    int n, cnt = 0;
    char k;
    cin >> n >> k;
    for (int i = 1; i <= n; ++i)
    {
        string s = to_string(i);
        int l = s.length();
        for (int j = 0; j < l; ++j)
        {
            if (s[j] == k)
                ++cnt;
        }
    }
    cout << cnt;
}

P1035 [NOIP 2002 普及组] 级数求和

  • flaot不能ac
    代码如下:
#include
using namespace std;
int main(){
    double k,n=0,sn=0;//对于级数而言精度很重要
    cin >> k;
    while(sn<=k) {
        sn += 1/++n;
    }
    cout << n;
}

P2669 [NOIP 2015 普及组] 金币

代码如下:

#include 
using namespace std;
int main()
{
    int k, yushu, wage = 1;
    long long coin = 0;
    cin >> k;
    while (k)
    {
        yushu = min(k, wage);
        k -= yushu;
        coin += yushu * wage++;
    }
    cout << coin;
}

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

代码如下:

#include 
using namespace std;
int main()
{
    int n;
    cin >> n;
    cout << (n + 1) * n / 2;
}

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

  • 优化的朴素筛法
    代码如下:
#include 
using namespace std;
bool prime(int n)
{
    if (n == 2)
        return true;
    if (n % 2 == 0)
        return false;
    for (int i = 3; i * i <= n; i += 2)
    {
        if (n % i == 0)
            return false;
    }
    return true;
}
int main()
{
    int l, sum = 0, cnt = 0;
    cin >> l;
    for (int i = 2; sum < l; ++i)
    {
        if (prime(i))
        {
            sum += i;
            if (sum <= l)
            {
                cout << i << endl;
                ++cnt;
            }
        }
    }
    cout << cnt;
}

P1217 [USACO1.5] 回文质数 Prime Palindromes

  • 线性筛法加回文判断

代码如下:

#include 
using namespace std;

bool hw(long long n)
{
    // long long reversed = 0, ori = n;
    // while (n != 0)
    // {
    //     int digit = n % 10;
    //     reversed = reversed * 10 + digit;
    //     n /= 10;
    // }
    // return ori == reversed;
    string s1 = to_string(n);
    string s2 = s1;
    reverse(s1.begin(), s1.end());
    return s1 == s2;
}

int main()
{
    long long a, b;
    cin >> a >> b;
    vector<bool> is_prime(b + 1, true);
    vector<long long> prime;

    for (long long i = 2; i * i <= b; ++i)
    {
        if (is_prime[i])
        {
            for (long long j = i * i; j <= b; j += i)
                is_prime[j] = false;
        }
    }
    for (long long i = a; i <= b; ++i)
    {
        if (is_prime[i] && hw(i))
            cout << i << endl;
    }
}

P1423 小玉在游泳

代码如下:

#include 
using namespace std;

int main()
{
    int step = 0;
    float s, k = 0;
    cin >> s;
    while (s >= k)
    {
        k += 2 * pow(0.98, step);
        ++step;
    }
    cout << step;
}

P1307 [NOIP 2011 普及组] 数字反转

代码如下:

#include 
using namespace std;

int main()
{
    string s;
    cin >> s;
    if (s[0] == '-')
    {
        reverse(s.begin() + 1, s.end());
        while (s[1] == '0')
        {
            s.erase(s.begin() + 1);
        }
    }
    else
    {
        reverse(s.begin(), s.end());
        while (s[0] == '0')
        {
            s.erase(s.begin());
        }
    }

    if (s.empty())
        s = '0';
    cout << s;
}

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

代码如下:

#include 
using namespace std;
#define v5 sqrt(5)

int main()
{
    int n;
    cin >> n;
    double fn = (pow((1 + v5) / 2, n) - pow((1 - v5) / 2, n)) / v5;
    printf("%.2f", fn);
}

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

代码如下:

#include 
using namespace std;

int main()
{
    int n, maxx = 0, minn = 1001;
    cin >> n;
    for (int i = 0; i < n; ++i)
    {
        int a;
        cin >> a;
        maxx = max(a, maxx);
        minn = min(a, minn);
    }
    cout << maxx - minn;
}

P1420 最长连号

代码如下:

#include 
using namespace std;

int main()
{
    int n, maxx = 0, mark = 1, pre = -1, now;
    cin >> n;
    for (int i = 0; i < n; ++i)
    {
        cin >> now;
        if (now == pre + 1)
        {
            mark++;
        }
        else
        {
            maxx = max(maxx, mark);
            mark = 1;
        }
        pre = now;
    }
    maxx = max(maxx,mark);


    cout << maxx;
}

P1075 [NOIP 2012 普及组] 质因数分解

代码如下:

// #include 
// using namespace std;

// int main()
// {
//     long long n, maxx = 0;
//     cin >> n;
//     vector pri(n + 1, true);
//     for (long long i = 2; i * i <= n; ++i)
//     {
//         if (pri[i])
//         {
//             for (int j = i * i; j <= n; j += i)
//             {
//                 pri[j] = false;
//             }
//         }
//     }

//     for (long long i = 2; i <= n; ++i)
//     {
//         if (pri[i] && n % i == 0)
//         {
//             maxx = max(maxx, i);
//         }
//     }

//     cout << maxx;
// }
// #include 
// using namespace std;

// int main() {
//     long long n;
//     cin >> n;
//     long long maxx = 0;
//     long long i = 2;
//     while (n > 1) {
//         if (n % i == 0) {
//             maxx = max(maxx, i);
//             while (n % i == 0) {
//                 n /= i;
//             }
//         }
//         i++;
//     }
//     cout << maxx;
//     return 0;
// }
#include 
using namespace std;

bool is_pri(long long a)
{
    if (a == 2)
        return true;
    if (a % 2 == 0)
        return false;
    for (long long i = 3; i * i <= a; i += 2)
    {
        if (a % i == 0)
            return false;
    }
    return true;
}

int main()
{
    long long n, i = 2, maxx = 0;
    cin >> n;
    if (n % 2 == 0 && is_pri(n / 2))
    {
        cout << n / 2;
    }
    else
    {
        for (long long i = 3; i * i <= n; i += 2)
        {
            if (n % i == 0)
            {
                if (is_pri(i) && is_pri(n / i))
                {
                    cout << n / i;
                }
            }
        }
    }
}

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

代码如下:

#include 
using namespace std;

int main()
{
    int n;
    cin >> n;
    int cnt1 = 1, cnt2 = 1;
    for (int i = 0; i < n; ++i)
    {
        for (int j = 0; j < n; ++j)
        {
            printf("%02d", cnt1++);
        }
        cout << endl;
    }
    cout << endl;
    for (int i = 0; i < n; ++i)
    {
        for (int j = 0; j < 2 * (n - i - 1); ++j)
        {
            cout << " ";
        }
        for (int k = 0; k < i + 1; ++k)
        {
            printf("%02d", cnt2++);
        }
        cout << endl;
    }
}


P5726 【深基4.习9】打分

代码如下:

#include 
using namespace std;

int main()
{
    int n, sum = 0, maxx = -1, minn = 11;
    cin >> n;
    for (int i = 0; i < n; ++i)
    {
        int a;
        cin >> a;
        sum += a;
        maxx = max(a, maxx);
        minn = min(a, minn);
    }
    printf("%.2f", (sum - maxx - minn) * 1.0 / (n - 2) * 1.0);
}

P4956 [COCI 2017/2018 #6] Davor

代码如下:

#include 
using namespace std;

int main()
{
    int n, x = 0, k = 0;
    cin >> n;
    x = n / 364 - 3;
    k = 1;
    while (x > 100)
    {
        x -= 3;
        ++k;
    }
    cout << x << endl
         << k;
}


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

代码如下:

#include
using namespace std;
int main(){
    int mon[13],cnt_leave=0,sum=0;
    for(int i=0;i<12;++i) {
        cin >> mon[i];
    }
    for(int i=0;i<12;++i) {
        cnt_leave += (300-mon[i]);//每个月剩余的钱累加
        if(cnt_leave<0) {
            sum = -(i+1);//剩余的钱小于0的时候sum为负触发最后的特判
            break;
        }else if(cnt_leave>100) {//当余钱大于100且
            sum += (cnt_leave/100)*100;
            cnt_leave %= 100;
        }
        
    }
    
    
    if(sum<0){
        cout << sum;
    }else{
       cout << sum*1.2+cnt_leave; 
    }
}

你可能感兴趣的:(算法入门,c++,算法,学习,经验分享,笔记)