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))?"Yes\n":"No\n");
          }
           cout<<"\n";
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值