算法笔记第三章——入门模拟

简单模拟

在这里插入图片描述
我写的版本

#include<cstdio>
#include<iostream>
using namespace std;
void Cattatz(int &m);

void Cattatz(int &m)
{
    
    
    
    if(m%2)
        m = (3*m+1)/2;
    else
        m = m/2;
    

}

int main()
{
    
    
    int n;
    cin>>n;
    int num = 0;
    while(n!=1)
    {
    
    
        num++;
        Cattatz(n);
    }
    cout<<num<<endl;
    return 0;

}

书上的版本

#include<cstdio>
int main()
{
    
    
    int n,step = 0;
    scanf("%d",&n);
    while( n != 1)
    {
    
    
        if(n%2==0) n = n/2;
        else n = (3*n + 1)/2;
        step++;
    }
    printf("%d\n",step);
    return 0;
}

在这里插入图片描述
在这里插入图片描述
我写的版本

#include<iostream>
#include<cstring>  //memset函数在这个头文件中

using namespace std;

int main()
{
    
    
    int N;
    cin>>N;
    int num[100];
    memset(num,0,sizeof(num));
    for(int i=0;i<N;i++)
    {
    
    
        int a,b;
        cin>>a>>b;
        num[a] += b;

    }
    int x,y;
    x = 0,y = num[x];
    for(int i=1;i<N;i++)
    {
    
    
        if(num[i]>y)
        {
    
    
            x=i;
            y=num[i];
        }

    }
    cout<<x<<" "<<y<<endl;
    return 0;
}

书上的版本

#include<cstdio>
const int maxn = 100010;
int school[maxn] = {
    
    0};
int main()
{
    
    
    int n,schID,score;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
    
    
        scanf("%d%d",&schID,&score);
        school[schID] += score;
    }
    int k=1,MAX=-1;
    for(int i=1;i<n;i++)
    {
    
    
        if(school[i]>MAX)
        {
    
    
            MAX=school[i];
            k=i;
        }
    }
    printf("%d %d",l,MAX);
    return 0;
}

图形输出

在这里插入图片描述
我写的版本

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;

int main()
{
    
    
    int n;
    char a;
    cin>>n>>a;
    int col = n;
    int row = n%2?(n/2+1):(n/2);
    
    int j=1;
    while(j<=row)
        {
    
    
            if(j==1 || j==row)
            {
    
    
                for(int num=0;num<n;num++)
                    cout<<a;
                cout<<endl;
                j++;
            }
            else
            {
    
    
                for(int i=0;i<n;i++)
                {
    
    
                    if(i==0 || i==n-1)
                        cout<<a;
                    else cout<<" ";
                }
                cout<<endl;
                j++;

            }
        }
    return 0;
    
}

书上的版本

#include<cstdio>
int main()
{
    
    
    int row,col;
    char c;
    scanf("%d %c",&col,&c);
    if(col %2==1) row = col/2+1;
    else row = col/2;
    //第一行
    for(int i = 0;i<col;i++)
        printf("%c",c);
    printf("\n");
    //第2~n-1行
    for(int i=2;i<row;i++)
    {
    
    
        printf("%c",c);
        for(int j = 0;j<col-2;j++)
            printf(" ");
        printf("%c",c);
    }
    //第row行
    for(int i = 0;i<col;i++)
    {
    
    
        printf("%c",c);
    }
    return 0;

}

日期处理

在这里插入图片描述

#include<cstdio>
//平年和闰年每个月的天数
int month[13][2] = {
    
    {
    
    0,0},{
    
    31,31},{
    
    28,29},{
    
    31,31},{
    
    30,30},{
    
    31,31},{
    
    30,30},{
    
    31,31},{
    
    31,31},{
    
    30,30},{
    
    31,31},{
    
    30,30},{
    
    31,31}};

//判断是否是闰年
bool isLeap(int year)
{
    
    
    return (year%4 == 0 && year%100!=0) || (year % 400 == 0);
}

int main()
{
    
    
    int time1,y1,m1,d1;
    int time2,y2,m2,d2;
    while(scanf("%d%d",&time1,&time2)!=EOF)
    {
    
    
        if(time1>time2)  //第一个日期比第二个日期大那么交换,方便之后处理
        {
    
    
            int temp = time1;
            time1 = time2;
            time2 = time1;
        }
        y1 = time1/10000,m1 = time1%10000/100,d1=time1%100;
        y2 = time2/10000,m2 = time2%10000/100,d2=time1%100;
        int ans = 1;
        while(y1<y2 || m1<m2 || d1<d2)
        {
    
    
            d1++;
            if(d1 == month[m1][isLeap(y1)]+1)
            {
    
    
                m1++;
                d1=1;
            }
            if(m1=13)
            {
    
    
                y1++;
                m1=1;
            }
            ans++;
        }
        printf("%d\n",ans);
    }
    return 0;
}


进制转换

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#include<cstdio>
int main()
{
    
    
    int a,b,d;
    scanf("%d%d%d",&a,&b,&d);
    int sum = a+b;
    int ans[31],num=0;   //ans存放D进制的每一位
    do{
    
    
        ans[num++] = sum%d;
        sum /= d;
    }while(sum!=0);
    for(int i=num-1;i>=0;i--)
    {
    
    
        printf("%d",ans[i]);
    }
    return 0;
}

字符串处理

在这里插入图片描述
gets() 函数的功能是从输入缓冲区中读取一个字符串存储到字符指针变量 str 所指向的内存空间。

#include<cstdio>
#include<cstring>
const int maxn = 256;

//判断字符串str是否是回文串
bool judge(char str[])
{
    
    
    int len = strlen(str);
    for(int i=0;i<len/2;i++)
    {
    
    
        if(str[i]!=str[len-1-i])
            return false;
    }
    return true;
}

int main()
{
    
    
    char str[maxn];
    while(gets(str))
    {
    
    
        bool flag = judge(str);
        if(flag==true)
            printf("YES\n");
        else
            printf("NO\n");
    }
    return 0;
}

在这里插入图片描述

#include<cstdio>
#include<cstring>

int main()
{
    
    
    char str[90];
    gets(str);
    int len = strlen(str);
    int r = 0,h = 0;  //r为行,h为列
    char ans[90][90];  //ans[0] ~ ans[r]存放着单词
    for(int i = 0;i<len;i++)
    {
    
    
        if(str[i] != " ")
        {
    
    
            ans[r][h++] = str[i];
        }
        else
        {
    
    
            ans[r][h] = '\0';
            r++;
            h = 0;
        }
    }
    for(int i=r;i>=0;i--)
    {
    
    
        printf("%s",ans[i]);
        if(i>0) printf(" ");
    }
    return 0;


}

猜你喜欢

转载自blog.csdn.net/weixin_44972129/article/details/109011988