每日两小时编程之旅(四)

每日两小时编程之旅(四)

洛谷篇(算法1-1 模拟与高精度)

P1042乒乓球

#include<bits/stdc++.h>

using namespace std;
int win[62503]; 
int w,l;

int main()
{
    char s;
    for(int i=1;cin>>s&&s!='E';i++)//循环读入,当读到字符E结束 
    {
        if(s=='W')win[i]=1; 
        else win[i]=2; 
    }
    //----------------11分制 ----------------
    for(int i=1;1;i++)
    {
        if(win[i]==1)w++;//胜场+1 
        if(win[i]==2)l++;//负场+1 
        if(win[i]==0)//读到0则记录结束,输出记录结束前的分数。 
        {
            cout<<w<<":"<<l<<endl<<endl;
            break;
        }
        if(w-l>=2||l-w>=2)
            if(w>=11||l>=11)//当双方比分相差大于2且一方分数大等于11输出 
            {
                cout<<w<<":"<<l<<endl;
                w=0;//比分清零 
                l=0;
            }
    }
    w=0;//清零,为21分制计算做准备 
    l=0;
    //----------------21分制 ----------------
    for(int i=1;1;i++)//一切同上,唯一区别就是判定从11变为21 
    {
        if(win[i]==1)w++;
        if(win[i]==2)l++;
        if(win[i]==0)
        {
            cout<<w<<":"<<l;
            break;
        }
        if(w-l>=2||l-w>=2)
            if(w>=21||l>=21)//11变为21 
            {
                cout<<w<<":"<<l<<endl;
                w=0;
                l=0;
            }
    }
    return 0;//华丽地结束  ㄟ(▔▽▔)ㄏ
} 

P2670扫雷游戏(easy)

#include<bits/stdc++.h>

using namespace std;
int n,m;
char str;
bool a[110][110];

int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++) 
        {
            cin>>str;
            if(str=='*') a[i][j]=1;
        }
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            if(a[i][j]==1) cout<<"*";
            else
            {
                printf("%d",a[i-1][j-1]+a[i-1][j]+a[i-1][j+1]+a[i][j-1]+a[i][j+1]+a[i+1][j-1]+a[i+1][j]+a[i+1][j+1]);    
            }
        }
        cout<<endl;
    }
    return 0;
}

P1563玩具谜题

#include<bits/stdc++.h>//万能头文件

using namespace std;
int n,m,kk=0;//n表示人数,m表示指令数,kk表示当前的编号
char name[1000100][20];//人物姓名
bool key[1000100];//朝圈内还是圈外站>
int x[1000100],y[1000100];

int main()
{
    cin>>n>>m;
    for(int i=0;i<n;i++)
    {
        cin>>key[i]>>name[i];
    }
    for(int i=0;i<m;i++) 
    {
        cin>>x[i]>>y[i];
        if(x[i]==key[kk]) //二者相等顺时针转,反之逆时针转
        {
            kk=kk-y[i]+n;
            kk%=n;
        }
        else
        {
            kk=kk+y[i]+n;
            kk%=n;
        }
    }
    cout<<name[kk];//保存编号输出即可
    return 0;
}

P1601A+B Problem(高精)

#include<bits/stdc++.h>

using namespace std;
char a[550],b[550];
int m[550],n[550];

int main()
{
    cin>>a>>b;
    int lena=strlen(a);//a长度
    int lenb=strlen(b);//b长度
    int len=max(lena,lenb);//二者中长的那个
    for(int i=0;i<lena;i++)
    {
        m[i]=a[lena-i-1]-'0';//倒序赋值
    }
    for(int i=0;i<lenb;i++)
    {
        n[i]=b[lenb-i-1]-'0';
    }
    for(int i=0;i<len;i++)//注意进位
    {
        m[i]+=n[i];
        m[i+1]+=m[i]/10;
        m[i]%=10;
    }
    if(m[len]) len++;//最高位可能不是len-1;
    for(int i=len-1;i>=0;i--)
    {
        cout<<m[i];
    }
    return 0;
}

P1303A*B Problem

#include<bits/stdc++.h>

using namespace std;
char a1[50001],b1[50001];
int a[50001],b[50001],i,x,len,j,c[50001];

int main ()
{
    cin >>a1 >>b1;//读入两个数
    a[0]=strlen(a1);b[0]=strlen(b1);//计算长度
    for (i=1;i<=a[0];++i)a[i]=a1[a[0]-i]-'0';//将字符串转换成数字
    for (i=1;i<=b[0];++i)b[i]=b1[b[0]-i]-'0';
    for (i=1;i<=a[0];++i)for (j=1;j<=b[0];++j)c[i+j-1]+=a[i]*b[j];//按乘法
    len=a[0]+b[0];                                       //原理进行高精乘
    for (i=1;i<len;++i)if (c[i]>9){c[i+1]+=c[i]/10;c[i]%=10;}//进位
    while (c[len]==0&&len>1)len--;//判断位数
    for (i=len;i>=1;--i)cout <<c[i];//输出
    return 0;
}

P1009阶乘之和

#include<bits/stdc++.h>//高精度乘法+高精度加法

using namespace std;
int n,a[90],b[90],c[90],f[90],d=0,len_a,len_b=1,len_c=1,len_ans,m=1;
string s;

int main()
{
    cin>>n;
    b[0]=1; //初始化
    for(int i=1;i<=n;i++){ //计算i的阶乘,已经算好了i-1的阶乘
        len_a=0; //i的长度
        int p=i;
        while(p>0){ //把i存进a数组
            a[len_a++]=p%10;
            p/=10;
        }
        for(int j=0;j<len_a;j++) //计算a*b(i*(i-1)的阶乘),即i的阶乘,看不懂的网上查,我也不知道为什么
            for(int k=0;k<=len_b;k++)
                c[j+k]+=a[j]*b[k];
        for(int j=0;j<len_c;j++) //需要进位的就进位
            if(c[j]>9) c[j+1]+=c[j]/10,c[j]%=10;
        if(c[len_c]) len_c++; //看最高位要不要进位
        len_ans=len_b,len_b=len_c,m=max(m,len_c); //把len_b赋值给len_ans,修改len_b的值,m为i阶乘的长度,看有没有进位
        for(int k=len_c-1;k>=0;k--) b[k]=c[k]; //把c存进b数组,即存进i的阶乘,下次循环b为i-1的阶乘
        len_c=len_a+len_ans;
        memset(c,0,sizeof(c)); //清零c数组,准备计算下个阶乘
        for(int j=0;j<m;j++){ //高精加,直接套模板
            f[j]+=b[j];
            if(f[j]>9) f[j+1]+=f[j]/10,f[j]%=10; //进位,注意不要写成f[j+1]++,f[j]-=10;就因为这里wa了一个点
        }
    }
    while(!f[m]&&m>0) m--; //去掉首导零
    for(int i=m;i>=0;i--) cout<<f[i]; //倒序输出
    return 0; //圆满结束
}

今天没什么好说的,明天继续加油,奥里给。

全部评论

相关推荐

04-03 15:12
已编辑
门头沟学院 Java
点赞 评论 收藏
分享
找工作勤劳小蜜蜂:矛盾是没有实习,就是没实战经验,公司不想要,公司不要,你就没有实习,你就进入死循环,另外你的项目不是社会现在有大量岗位存在行业用的,云存储人员早就饱和。
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务