【算法竞赛入门经典】【第三章】课后习题(第二部分)

        自从蓝桥杯之后,都没写博客了。今天将之前第三章还差的一部分习题答案补上。

3-4整数相加

这一题题目有提示,说选择合适的输入方式,即可简化问题。刚开始没想到cin,结果还用字符串来做,多亏别人提醒我一下,我才想起cin。惭愧啊。。

#include <iostream>

using namespace std;

int main()
{
    int a,b;
    char op;
    while(cin>>a>>op>>b){
        switch(op){
            case '+':
                cout<<a+b<<endl; break;
            case '-':
                cout<<a-b<<endl; break;
            case '*':
                cout<<a*b<<endl; break;
        }
    }
    return 0;
}


3-5 将字符方阵逆时针旋转90度

#include <iostream>

#define MAXN 1000 + 10
using namespace std;

int main()
{
    char m[MAXN][MAXN];
    int i,j,n;
    while(cin>>n){
        for(i = 0; i < n; i++){
            for(j = 0;j<n;j++){
                cin>>m[i][j];
            }
        }
        for(i = n-1;i>=0;i--){
            for(j = 0;j<n;j++){
                cout<<m[j][i];
            }
            cout<<endl;
        }
    }
    return 0;
}


3-6 进制转换(将十进制转化为其他进制)

这一题我将题目扩展了一下就变成了hdu2031 进制转换,下面我也是以hdu这一题的方式来做(不过好像也没什么区别)

#include <iostream>
#include <string.h>
#define MAXN 1000 + 10
using namespace std;

int main()
{
	int n,b;
	int p,cnt;
	char num[MAXN];
    while(cin>>n>>b){
        memset(num,0,sizeof(num));
        cnt = 0;
        if(n<0){
            cout<<"-";
            n = -n;
        }
        if(n<2)
            cout<<n<<endl;
        else{
            while(n>0){
                p = n%b;
                n /= b;
                if(p>9)
                    num[cnt++] = p + 'A' - 10;
                else
                    num[cnt++] = p + '0';
            }
            num[cnt] = '\0';
        }
        for(int i = strlen(num)-1;i>=0;i--)
            cout<<num[i];
        cout<<endl;
    }
    return 0;
}


3-7进制转换(将其他进制转换为十进制)

这一题本来想把它扩展成一个很大很大的任意进制的数 转化为 十进制的数 ,但是没有想到一个比较简洁有力的方法,所以这个我就只能就题论题了。

#include <iostream>
#include <string.h>
#include <cmath>
#define MAXN 1000  + 10;
using namespace std;

int change(int n,int b){
    int ans = 0;
    int p;
    for(int i = 0; n>0;i++,n/=10){
        p = (n%10) * pow(b,i);
        ans += p;
    }
    return ans;
}

int main()
{
	int n,b;
    while(cin>>n>>b){
        cout<<change(n,b)<<endl;
    }
    return 0;
}

3-8手机键盘

这一个一眼看过果断打表,暴力解决。

#include <stdio.h>
#include <string.h>
#define MAXN 100 + 10
typedef struct{
    char a;
    char str[10];
}CH;
int main(){
    char word[MAXN];
    CH p[26]={{'a',"a1"}, {'b',"b2b1"}, {'c',"c3c1"},
    {'d',"d1"}, {'e',"e2e1"},{'f',"f3f1"},{'g',"g1"},
    {'h',"h2h1"},{'i',"i3i1"},{'j',"j1"}, {'k',"k2k1"},{'l',"l3l1"},
    {'m',"m1"}, {'n',"n2n1"},{'o',"o3o1"},{'p',"p1"}, {'q',"q2q1"},
    {'r',"r3r1"},{'s',"s4s1"},{'t',"t1"}, {'u',"u2u1"},{'v',"v3v1"},
    {'w',"w1"}, {'x',"x2x1"},{'y',"y3y1"},{'z',"z4z1"}};
    while(1){
	scanf("%s",word);
        for(int i = 0; i < strlen(word); i++){
                for(int j = 0; j<26;j++){
                    if(word[i]==p[j].a){
                        printf("%s",p[j].str);
                    }
                }
        }
	printf("\n");
    }
    return 0;
}

到这里我们就将算法竞赛入门经典的基础篇算是告一段落了。
以上如果有更好的解法或者错误,请多指教。

第一部分传送门

(如有转载,请注明出处)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值