蓝桥杯基础

1、循环节长度:两个整数做除法,有时会产生循环小数,循环小数的长度即为循环节
11/13 = 0.846153846153,其中循环节为6
注:求循环节时,可以通过判断两次取模出现相同值作为中止条件。
 

int fun(int n, int m)
{
    n = n % m;
    vector<int> v;
    for(;;)
    {
        v.push_back(n);
        n *= 10;
        n = n % m;
        if(n == 0) return 0;
        if(find(v.begin(), v.end(), n) != v.end())
        {
            return (int)(v.end() - find(v.begin(), v.end(), n));
        }
    }
}

2、三角形输出
 A
BBB
 

#include <iostream>
#include <string>
using namespace std;
int main(void)
{
    int n;
    cin >> n;
    for(int i = 1; i <= n; i++)
    {
        string space = string(n - i, ' ');
        string ch = string(2*i-1, 'A' + i - 1);
        cout << space + ch << endl;
    }
    
    return 0;
}

3、特殊三角形
  A
 ABA
ABCBA

#include <iostream>
using namespace std;
int main(void)
{
    char c;
    cin >> c;
    //A~Z
    if(c >= 'A' && c <= 'Z')
    {
        for(int i = 1; i <= c - 'A' + 1; i++) //c-'A'+1 :当前是第几个元素
        {
            for(int j = 1; j <= c - 'A' + 1 - i; j++) //c-'A'+1-i :当前输出空格的个数
            {
                cout << " ";
            }
            for(int j = 1; j <= i; j++)
            {
                cout << (char)('A' + j - 1);
            }
            for(int j = i - 1; j >= 1; j--)
            {
                cout << (char)('A' + j - 1);
            }
            cout << endl;
        }
    }else{
        //1~9
        if(c >= '1' && c <= '9')
        {
            for(int i = 1; i <= c - '1' + 1; i++) //c-'1'+1 :当前是第几个元素
            {
                for(int j = 1; j <= c - '1' + 1 - i; j++) //c-'1'+1-i :当前输出空格的个数
                {
                    cout << " ";
                }
                for(int j = 1; j <= i; j++)
                {
                    cout << (char)('1' + j - 1);
                }
                for(int j = i - 1; j >= 1; j--)
                {
                    cout << (char)('1' + j - 1);
                }
                cout << endl;
            }
        }
    }
    
    return 0;
}

4、造房子 (按照规律画图)
2x2房子
+-+-+
|*|*|
+-+-+
|*|*|
+-+-+
/*规律:每种格式都输出房子的列数再加一个第一个字符*/

#include <iostream>
using namespace std;
int main(void)
{
    int n, m;
    cin >> n >> m;

    for(int i = 1; i <= n; i++) 
    {
        for(int j = 1; j <= m; j++)
        {
            cout << "+-";
        }
        cout << "+" << endl;
        for(int j = 1; j <= m; j++)
        {
            cout << "|*";
        }
        cout << "|" << endl;
    }        
    for(int j = 1; j <= m; j++)
    {
        cout << "+-";
    }
    cout << "+" << endl;
    return 0;
}

注:字符串处理类型题重在规律的总结以及string API的灵活使用
5、循环字符串
A1: A
A2:ABA
A3:ABACABA
A4:ABACABADABACABA
    ......

#include <cstdio>
#include <cstring>
char res[500000];
int main(void)
{
    int n; //按规律输出n组数
    scanf("%d", &n);
    int len = 0;
    for(int i = 1; i <= n; i++)
    {
        strcat(res + len + 1, res); //字符串拼接,留出一个空位存储对应下标的字符
        res[len] = 'A' + i - 1;
        len = strlen(res); //更新f字符串的长度
    }
    printf("%s\n", res);
    return 0;
}

6、fgets会读取最后的换行
   gets不会读取换行
fgets(s1, 1004, stdin);  
c语言法处理子串在总串中出现的次数

#include <cstdio>
#include <cstring>
char s1[1005];
char s2[1005];
int main(void)
{
    fgets(s1, 1004, stdin); //1004原因在于:fgets会读取最后的换行
    fgets(s2, 1004, stdin);
    int len1 = strlen(s1) - 1, len2 = strlen(s2) - 1;
    int ans = 0;
    for(int i = 0; i + len2 -1 < len1; i++)
    {
        bool matched = true;
        for(int j = 0; j < len2; j++)
        {
            if(s1[i + j] != s2[j])
            {
                matched = false;
                break;
            }
        }
        if(matched) ans++;
    }
    
    return 0;
}

日期处理
1、闰年:年份非整百且可被4整除的为润年
         年份能被400整除的是闰年
    特别注意:能被100整除的还必须被400整除才是闰年
法1:根据公式快速计算当前是星期几 (蔡基姆拉尔森计算公式)
假设星期为w, 年是y,月是m,日是d
w = (d + 2 * m + 3 * (m + 1) / 5 + y + y / 4 - y / 100 + y / 400) % 7
然后把计算出来的w加1就是真正的星期几了    
注:每年的1,2月当成上一年的13,14月处理
int whatDay(int y, int m, int d)
{
    if(m <= 2)
    {
        m += 12;
        y--;
    }
    return ((d + 2 * m + 3 * (m + 1) / 5 + y + y / 4 - y / 100 + y / 400) % 7);
}

法2:练习题:判断某人的生日,输出生日是星期几
输出:Monday、Tuesday、Wednesday、Thursday、Friday、Saturday、Sunday(0~6)

#include <iostream>
#include <string>
using namespace std;
string week[7] = {"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"};
int whatDay(int y, int m, int d)
{
    //返回正确的星期,用0~6表示星期1~7
    int ans = 0;
//处理年
    for(int i = 1; i < y; i++) //从1年加到所计算年的前一年
    {
        if((i % 100 != 0 && i % 4 == 0) || i % 400 == 0)
        {
            ans += 366 % 7;
            ans %= 7;
        }else{
            ans += 365 % 7;
            ans %= 7;
        }
    }
//处理月
    for(int i = 1; i < m; i++)
    {
        if(i == 1 || i == 3 || i == 5 || i == 7 || i == 8 || i == 10 || i == 12){
            ans += 31 % 7;
            ans %= 7;
        }else if(i == 4 || i == 6 || i == 9 || i == 11){
            ans += 30 % 7;
            ans %= 7;
        }else if((y % 100 != 0 && y % 4 == 0) || y % 400 == 0){ //判断闰年
            ans += 29 % 7;
            ans %= 7;
        }else{
            ans += 28 % 7;
            ans %= 7;
        }
    }
//处理日
    ans += (d-1) % 7; //d-1:从1号开始,计算天数
    ans %= 7;

    return ans;
}

int main(void)
{
    int y, m, d;
    cin >> y >> m >> d;
    cout << week[whatDay(y, m, d)] << endl;
    return 0;    
}

2、恋爱纪念日
给定当前时间,计算第x天结婚纪念日的时间
#include <cstdio>
int day[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; //把一年中每月的天数列举出来
int main(void)
{
    int y, m, d, k;
    scanf("%d%d%d%d", &y, &m, &d, &k); //年月日,天数
    for(int i = 1; i <= k; i++)
    {
    //处理2月
        if((y % 100 != 0 && y % 4 == 0) || y % 400 == 0)
        {
            day[2] = 29;
        }else{
            day[2] = 28;
        }
        d++; //天数加加

        if(d == day[m] + 1) //当前天数超过该月天数
        {
            d = 1;
            m++;
        }
        if(m == 13)
        {
            m = 1;
            y++;
        }
    }
    printf("%04d-%02d-%02d\n", y, m, d);

    return 0;
}

3、日历有阳历和阴历之分,每年都有法定节假日,这些分为三种:双休、阳历节假日、阴历节假日
双休:周六日2天
阳历节假日:如:元旦-阳历每年1月1日,放假1天
                劳动节-5月1日,放假1天
                国庆节-10月1日,放假3天
注:在题目中阴历假期会给出在该年对应的阳历日期
#include <cstdio>
//mm:记录假期对应的月,dd:记录假期对应的日
int mm[10] = {1, 5, 10, 10, 10, 12};
int dd[10] = {1, 1, 1, 2, 3, 25};
int day[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; //每月分的天数
//利用引用解决,处理下一天
void nextDay(int &y, int &m, int &d){
    d++;
    if(d == day[m] + 1){
        d == 1;
        m++;
    }
}

int main(void){
    int y, w; //y:记录年份;w:记录该年第一天为周几
    int m, d, sf, ans; //记录当前在几月几日 sf:标识是否在春节里
    scanf("%d", &y);
    //用于录入该年阴历假期的阳历对应日期
    for(int i = 6; i <= 9; i++){
        scanf("%d%d", &mm[i], &dd[i]);
    }
    scanf("%d", &w); //记录第一天为周几
    //判断是否是闰年
    if((y % 100 != 0 && y % 4 == 0) || y % 400 == 0){
        day[2]++; //闰年2月29
    } 
    m = 1, d = 1; //初始年份
    sf = 0; //0代表不在春节里,正数时表示春节剩余几天
    ans = 0;
    while(m < 13){ //当月份数大于12时,则表示该年结束
        if(m == mm[6] && d == dd[6]){
            ans++;
            sf = 2;
        }else if(sf){ //sf>0:代表在春节里面
            ans++;
            sf--;
        }else if(w == 6 || w == 7){ //周末
            ans++;
        }else{
            //记录除春节外的其他日期
            for(int i = 0; i < 10; i++){
                if(m == mm[i] && d == dd[i]){
                    ans++;
                    break;
                }
            }
        }
        nextday(y, m, d);
        w++;
        if(w == 8){
            w = 1;
        }
    }
    
    printf("%d\n", ans);
    return 0;
}
                        
4、最长的名字
比较多个字符串,得出多个字符串中的最长者,输出
#include <cstdio>
#include <cstring>
char s[105], ans[105];
int ansLen = 0;
int main(void)
{
    int n, len;
    scanf("%d", &n);
    for(int i = 0; i < n; i++)
    {
        scanf("%s", s);
        len = strlen(s);
        if(len > ansLen)
        {
            ansLen = len;
            strcpy(ans, s);
        }
    }
    printf("%s", ans);
    return 0;
}

5、(a+b) % c = (a%c) + (b%c) ***重点***
6、编程中对负数取补码,取反加一,即加255再加1, 就是加256
void print(int x)
{
    if(x< 0) x+= 256;//取补码
    for(int i = 7;i>= 0;i--)
    {
        if(x&(1<<i)) putchar('*'); //使用与操作判断该字节中的各各位是1/0
        else putchar(' ');
    }

}
判断: 二进制中每一位的状态,判断方法:x&(1<<i)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Star星屹程序设计

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值