学堂在线 郑莉C++ 习题3

类与对象

最大公约数

题目描述

求两个正整数a 和 b的最大公约数。

要求使用c++ class编写程序。可以创建如下class

输入描述

两个正整数a,b,并且1=<a,b <=10000

输出描述

a和b的最大公约数


样例输入

1000 1000

样例输出

1000

#include <iostream>
#include <iomanip>
#include <algorithm>
using namespace std;

class Integer
{
private:
    int num;
public:
    Integer(int n);
    int gcd(Integer b);
};

Integer::Integer(int n)
{
    num = n;
}

int Integer::gcd(Integer b)
{
    int tmp_min = min(num, b.num);
    int tmp_max = max(num, b.num);
    while (tmp_max % tmp_min != 0)
    {
        int i = tmp_max;
        tmp_max = tmp_min;
        tmp_min = i % tmp_max;
    }
    return tmp_min;
}

int main()
{
    int a, b;
    cin >> a >> b;
    Integer A(a);
    Integer B(b);
    cout << A.gcd(B) << endl;
    system("pause");
    return 0;
}

移位密码-解密

题目描述

移位密码是最简单的一类代替密码,具体算法就是将字母表的字母右移k个位置(k<26),k称为密钥,并对字母表长度作模运算。

已知加密过程为:将每个字母按照字母表的顺序右移k位。加密函数:E(m)=(m+k)%26. (明文 -> 密文)

现给你一串密文,全部由大写字母组成。请破译出明文!(密文 -> 明文)

请设计实现PassWord类:

class PassWord {

private:

int k;

public:

PassWord(int);

char convert(const char); // 解密函数

};


输入描述

属于一个整数k,代表移位密码的密钥,k<26。

属于一个整数n,代表接下来输入字符的个数,接着输入n个字符

输出描述

输出对应的明文


样例输入
1
8 JMPWFZPV
样例输出
ILOVEYOU

#include <iostream>
#include <algorithm>
#define MAX_LEN 1000
using namespace std;

char sec[MAX_LEN + 10];

class PassWord {
private:
    int k;
public:
    PassWord(int i);
    char convert(const char c);
};

PassWord::PassWord(int i)
{
    k = i;
}

char PassWord::convert(const char c)
{
    return (c - 'A' - k + 26) % 26 + 'A';
}

int main()
{
    int k, n; //k代表移位的密匙,c代表字符数
    cin >> k >> n;
    PassWord password(k);
    for(int i = 0; i < n; ++ i)
    {
        char a;
        cin >> a;
        sec[i] = password.convert(a);
    }
    for (int i = 0; i < n; ++i)
        cout << sec[i];
    cout << endl;
    system("pause");
    return 0;
}

乘法密码-加密

题目描述

乘数密码也是一种替换密码,其加密变换是将明文字母串逐位乘以密钥k并进行模运算,数学表达式如下:

E(m) = k*m mod 26 (明文 -> 密文)

现给你一串明文,全部由大写字母组成,请加密成密文。

请设计实现PassWord类:

class PassWord {

private:

int k;

public:

PassWord(int);

char convert(const char); // 加密函数

};

输入描述

属于一个整数k,代表乘法密码的密钥,0 < k < 26。

属于一个整数n,代表接下来输入字符的个数,接着输入n个字符

输出描述

输出对应的密文


样例输入
3
8 ILOVEYOU
样例输出
YHQLMUQI

#include <iostream>
using namespace std;

char sec[1000];

class PassWord {
private:
    int k;
public:
    PassWord(int t);
    char convert(const char c);
};

PassWord::PassWord(int t)
{
    k = t;
}

char PassWord::convert(const char c)
{
    return (c - 'A') * k % 26 + 'A';
}

int main()
{
    int k, n;
    cin >> k >> n;
    PassWord p(k);
    for (int i = 0; i < n; ++i)
    {
        char a;
        cin >> a;
        sec[i] = p.convert(a);
    }
    for (int i = 0; i < n; ++i)
        cout << sec[i];
    cout << endl;
    system("pause");
    return 0;
}

乘法密码-解密

题目描述

乘数密码也是一种替换密码,其加密变换是将明文字母串逐位乘以密钥k并进行模运算,数学表达式如下:

E(m) = k*m mod 26 (明文 -> 密文)

现给你一串密文,全部由大写字母组成,请破译出明文。(密文 -> 明文)

请设计实现PassWord类:

class PassWord {

private:

int k;

public:

PassWord(int);

char convert(const char); // 解密函数

};

此处'A'对应0, 'Z'对应25,比如像获得'C'的对应的值可以使用'C' - 'A', 即为2


输入描述

属于一个整数k,代表乘法密码的密钥,k<26。

属于一个整数n,代表接下来输入字符的个数,接着输入n个字符

输出描述

输出对应的密文


样例输入
3
8 YHQLMUQI
样例输出
ILOVEYOU

#include <iostream>
using namespace std;

char sec[1000];

class PassWord {
private:
    int k;
public:
    PassWord(int t);
    char convert(const char c);
};

PassWord::PassWord(int t)
{
    k = t;
}

char PassWord::convert(const char c)
{
    int i = c - 'A';
    for(int j = 0; ; ++ j)
    {
        int m = i + j * 26;
        if (m % k == 0 && m / k >= 0 && m / k < 26)
        {
            m /= k;
            return char(m + 'A');
        }
    }
}

int main()
{
    int k, n;
    cin >> k >> n;
    PassWord p(k);
    for (int i = 0; i < n; ++i)
    {
        char c;
        cin >> c;
        sec[i] = p.convert(c);
    }
    for (int i = 0; i < n; ++i)
        cout << sec[i];
    cout << endl;
    system("pause");
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/jjakj1/p/10071270.html
今日推荐