我是靠谱客的博主 个性盼望,最近开发中收集的这篇文章主要介绍c/c++算法竞赛入门经典第一版刘汝佳第五,六章课后习题,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

5.1.1WERTYU

#include<iostream>
using namespace std;
int main()
{
    char ch[]="`1234567890-=qwertyuiop[]\asdfghjkl;'zxcvbnm,./";    //所有情况存入字符数组
    int c,i;
    while((c=getchar()!=EOF))
    {
        for(i=1;ch[i]&&ch[i]!=c;i++);    //字符数组不为空且字符数组不等于输入数,就继续寻找
        if(ch[i]) putchar(ch[i-1]);    //找到相同为第i位,在不为空的情况输出前一个字母
        else putchar(c);            //找不到,为空则输出输入数
    }
    return 0;
}

5.1.2 TeX括号

#include<iostream>
using namespace std;
int main()
{
    int c,flag=0;    //利用flag 标志变量判断是左还是右
    while((c=getchar())!=EOF)
    {
        if(c=='"')
        {
            if(flag==0) putchar("``"); flag=1;
            else putchar("''");flag=0;
        }
        else
            putchar(c);
    }
    return 0;
    
}

5.1.3周期串

#include<iostream>
using namespace std;
int main()
{
    string s;
    int i;
    while(getline(cin,s)!=EOF)
    {
        int c=s[0];
        for(i=1;i<s.length();i++)
        {
            if(s[i]==c&&s[i-1]==s[2*i-1]) break;   //确定首尾一致
        }
    }
    cout<<i;
    return 0;
}

5.2.1小学生算术

#include<iostream>
using namespace std;
int main()
{
    int a,b;
    while(scanf("%d%d",&a,&b)==2)
    {
        if(a==0&&b==0) return;
        int ans=0,c=0;
        for(int i=9;i>0;i++)
        {
            c=(a%10)+(b%10)+c>9?1:0;    //每次加上a,b最后两位,判断是否大于9,大于就为1
                                        //最精彩的是因为相加最多进位一位,所以用三元运算符,满足条件直接赋值1完全可以
            ans+=c;                //将每次判断结果加起来
            b/=10;            //a,b都向前进一位
            a/=10;
            
        }
        cout<<ans<<endl;
    }
    return 0;
}

5.2.2阶乘的精确值

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
const int maxn = 3000;
int f[maxn];

int main(){
    int i, j, n;
    while (scanf_s("%d", &n)){
        memset(f, 0, sizeof(f));
        f[0] = 1;
        for (i = 2; i <= n; i++){
            //乘以i
            int c = 0;  //c是进位
            for (j = 0; j < maxn; j++){
                int s = f[j] * i + c;   //s是3000位依次来乘以i且加上进位
                f[j] = s % 10;          //当前位存储个位
                c = s / 10;             //进位标识
            }
        }

        for (j = maxn - 1; j >= 0; j--){
            if (f[j]) break;    //从后往前,依次排除掉数为0的位
        }
        //输出结果
        for (i = j; i >= 0; i--)
            printf("%d", f[i]);
        printf("n");
    }
    system("pause");
    return 0;
}

5.2.3 高精度运算类bign

5.2.4 重载bign的常用运算符

5.3.1 6174问题

#include<iostream>
using namespace std;
int cmp(int a,int b)
{
    return a>b?a:b;
}
int main()
{
    int a,flag=0,j=0;
    int ans[1000];
    while(!flag)
    {
        int a=sort(a,a+4,cmp);
        int b=sort(a,a+4);
        int c=a-b;
        ans[j++]=c;
        for(int i=0;i<j;i++)
        {
            if(ans[i]==c) flag=1;
        }
    }
    for(int i=0;i<j;i++)
    {
        cout<<ans[i]<<"->";
        if(i==j-1) cout<<ans[i];
    }
    return 0;
}

5.3.2字母重排

5.4.1 Cantor的数表

#include<iostream>
using namespace std;
int main()
{
    int n;
    cin>>n;
    int k=0,s=0;
    for(int i=1;n<=s;i++)
    {
        s+=i;
        k++;
    }
    cout<<k-(s-n)<<"/"<<s-n+1;
    return 0;
}

5.4.2因子和阶乘

5.4.3果园里的树

#include<bits/stdc++.h>
double area2(double x0,double y0,double x1,double y1,double x2,double y2)
{
    return x0*y1+x2*y0+x1*y2-x2*y1-x0*y2-x1*y0;
}
int main()
{
    int count=0,x,y;
    double a_x,a_y,b_x,b_y,c_x,c_y;
    cin>>a_x>>a_y>>b_x>>b_y>>c_x>>c_y;
    for(int i=1;i<100;i++)
    for(int j=1;j<100;j++)
    {
        x=i;
        y=j;
        double s1,s2,s3;
        s1=fabs(area2(a_x,a_y,b_x,b_y,x,y));    //三角形面积公式,三角形任意点内连接三边的点,将三角形分成三部分,则该点也必然在三角形内
        s2=fabs(area2(a_x,a_y,x,y,c_x,c_y));
        s3=fabs(areas(x,y,b_x,b_y,c_x,c_y));
        double s=fabs(area2(a_x,a_y,b_x,b_y,c_x,c_y));
        if(fabs(s-s1-s2-s3)<=1e-9)count++;    //浮点数精度不准==无法判断
    }
    cout<<count;
    return 0;
}

5.4.4 多少块土地

#include<iostream>
using namespace std;
int main()
{
    int V,E,F,a,b,n;
    a=b=0;
    cin>>n;
    for(int i=0;i<=n-2;i++)
    {
        a+=i*(n-2-i);
        b=a+1;
    }
    V=n+n*a/4;
    E=n+n*b/2;
    F=E-V+1;        //欧拉公式V-E+F=2,得到F=E-V+2,还要减去椭圆外那个无穷大的面
    cout<<F;
    return 0;
}

6.1.1卡片游戏

#include<iostream>
#include<queue>
using namespace std;
int main()
{
    int n;
    cin>>n;
    for(int i=0;i<n;i++) q.push(i+1);
    while(q.empty())
    {
        cout<<q.front();    //输出栈顶
        q.pop();            //删除此栈顶
        q.push(q.front());    ///将新栈顶压入站尾
        q.pop();            //并且抛弃这个新栈顶
    }
    return 0;
}

6.1.2 铁轨

#include<iostream>
using namespace std;
int main()
{
    int a[1010];
    int n;
    while((cin>>n)&&n)
    {
        while(cin>>a[1]&&a[1])
        {
            for(int i=2;i<=n;i++)
            {
                cin>>a[i];
            }
            stack<int>s2;
            int j=1;
            for(int i=1;i<=n;i++)
            {
                s2.push(i);
                while(!s2.empty()&&(s2.top()==a[j]))
                {
                    j++;
                    s2.pop();
                }
            }
            cout<<((s2.empty()&&(j==n+1))?"Yesn":"Non");
          }
           cout<<"n";
    }
    return 0;
}

最后

以上就是个性盼望为你收集整理的c/c++算法竞赛入门经典第一版刘汝佳第五,六章课后习题的全部内容,希望文章能够帮你解决c/c++算法竞赛入门经典第一版刘汝佳第五,六章课后习题所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(51)

评论列表共有 0 条评论

立即
投稿
返回
顶部