计算机考研机试冲刺模拟卷(二)

C - 判断回文数

题目链接
思路分析:当作字符串,判断对称位置上的字符是否相同。
代码:

#include <bits/stdc++.h>

using namespace std;
bool judge(char str[])
{
    int len=strlen(str);
    for(int i=0; i<len; i++)
    {
        if(str[i]==str[len-i-1])
        {
            return true;
        }
        else
            return false;
    }
}
int main()
{
    char s[10];
    while(scanf("%s",s)!=EOF)
    {
        if(judge(s))
        {
            printf("Yes\n");
        }
        else
            printf("No\n");
    }
    return 0;
}

G - 输出图形

思路分析:首先观察第i行输出i个数,然后把1-n(n+1)/2的数字存放至数组。设置一个下标记录k,每输出一个数字,k累加1。
代码:

#include <bits/stdc++.h>

using namespace std;

int main()
{
    int n,m,str[50];
    while(scanf("%d",&n)!=EOF)
    {
        m=n*(n+1)/2;
        for(int i=1; i<=m; i++)
        {
            str[i]=i;
        }
        int k=1;
        for(int i=1; i<=n; i++)
        {
            for(int j=1; j<=i; j++)
            {
                if(k==10)
                    printf("%5d",str[10]);
                else if(j>1)
                    printf("%4d",str[k]);
                else
                    printf("%d",str[k]);
                k++;
            }
            printf("\n");
        }
    }

    return 0;
}

E - 十六进制不进位加法

思路分析:首先对于两个数字,应该当成字符串处理。首先应该把数字补0对齐,然后进行加法运算。注意运算过程中,应该把字符转化为数字进行运算,得到结果后要对16进行取余(因为不进位操作),然后在转化为字符。
这道题很好的练习了字符串,数字,大小写字母之间的转化。很好。
代码:

#include <bits/stdc++.h>
using namespace std;
string transfor(string str)//把小写字母转化为大写字母
{
    for(int i=0; i<str.size(); i++)
    {
        if(str[i]>='a'&&str[i]<='z')
        {
            str[i]-=32;
        }
    }
    return str;
}
int ChartoInt(char c)//字符转化为数字
{
    if(c>='0'&&c<='9')
        return c-'0';
    else
        return c-'A'+10;
}
char InttoChar(int x)//数字转换为字符
{
    if(x>=0&&x<=9)
        return x+'0';
    else
        return x-10+'A';
}
string add(string s1,string s2)
{
    for(int i=s1.size(); i>=0; i--)
    {
        int result=ChartoInt(s1[i])+ChartoInt(s2[i]);
        s1[i]=InttoChar(result%16);
    }
    return s1;
}
int main()
{
    string s1,s2;
    while(cin>>s1>>s2)
    {
        transfor(s1);
        transfor(s2);
        while(s1.size()<s2.size())
        {
            s1='0'+s1;//补零对齐
        }
        while(s2.size()<s1.size())
        {
            s2='0'+s2;//补零对齐
        }
        cout<<add(s1,s2)<<endl;
    }



}

F - 最大子串和

输入n个整数的序列,求它的最大子串和,并输出对应的数。
输入描述:
多组测试数据。
第一行输入一个整数n(0<n<=100)。
接下来一行输入n个数用空格隔开,保证每个数的绝对值小于1000。
输出描述:
第一行输出所求子串的序列,如果有多个答案,输出靠前的答案。
第二行输出最大子串和。
输入样例#:
5
-10 5 2 -8 7
输出样例#
5 2
7

思路分析:利用了动态规划的思想。用一个dp[]数组存放序列和,如果后面的数字小于前面的序列和与自己的和,则dp[i]更新为两者之和;如果该数字大于前面的序列和与自己的和,则抛弃前面的序列。此时dp[i]最大。
代码:

#include<bits/stdc++.h>

using namespace std;

const int maxn=110;
int a[maxn];
int dp[maxn],ansp,ansq,ans;
void DP(int n)
{
    int p=0,q=0;
    dp[0]=a[0];
    ans=dp[0];
    for(int i=1; i<n; i++)
    {
        if(a[i]>a[i]+dp[i-1]) //遇到一个数他可以覆盖前面数的和
        {
            dp[i]=a[i];
            p=i;//更新起点
            q=i;//更新终点
        }
        else
        {
            dp[i]=a[i]+dp[i-1];
            q=i;//只需要更新右边界
        }
        if(ans<dp[i])
        {
            ans=dp[i];//每次都更新最大值;
            ansp=p;
            ansq=q;
        }

    }
}
int main()
{
    int n;
    while(cin>>n)
    {
        for(int i=0; i<n; i++)
        {
            cin>>a[i];
        }
        DP(n);
        for(int i=ansp; i<=ansq; i++)
        {
            cout<<a[i]<<' ';
        }
        cout<<endl;
        cout<<ans<<endl;
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值