一、进制转换

务必结合课堂讲解完成这些题目!

问题描述

编写一个函数,输入一个十进制的数,输出相应的二进制数,八进制数和十六进制数。

#include <iostream>
#include <vector>

using namespace std;

// 这种做法仅适合转换成10进制以下的程序
void work(int n, int i)
{
    vector<int> res;
    while (n)
    {
        res.push_back(n % i);
        n /= i;
    }
    for (int i = res.size() - 1; i >= 0; i --) 
        printf("%d", res[i]);
    puts("");
}

int main()
{
    int n;
    cin >> n;
    printf("%d对应的%d进制数为:", n, 2);
    work(n, 2);    
    printf("%d对应的%d进制数为:", n, 8);
    work(n, 8);    
    printf("%d对应的%d进制数为:", n, 16);
    work(n, 16);
    
    return 0;
}

注释版:

#include <iostream>

using namespace std;

// 函数作用是将一个10进制数转换成对应进制的字符串
void work(int n, int i)
{
    string res; // 结果字符串

    while (n) {
        // n % i得到该数字在当前进制下的最后一位数字
        // 判断是否大于9,选择输出的字符是数字还是字母
        // a的ASCII值为97, 0的ASCII值为48
        res.push_back(n % i >= 10 ?
                      (char)(87 + n % i) :
                      (char)(48 + n % i));

        // 进行进制转换
        n /= i;
    }

    // 倒序输出结果字符串
    for (int i = res.size() - 1; i >= 0; i--)
        cout << res[i];

    cout << endl;
}

int main()
{
    int n;
    cin >> n;

    // 输入数字和进制,调用work函数转换
    printf("%d对应的%d进制数为:", n, 2);
    work(n, 2);

    printf("%d对应的%d进制数为:", n, 8);
    work(n, 8);

    printf("%d对应的%d进制数为:", n, 16);
    work(n, 16);

    return 0;
}

// 主要说明:
// 1. work函数实现进制转换的算法
// 2. 主函数输入数字和进制,调用work函数输出结果
// 3. work函数会选择使用数字还是字母来表示结果字符串
#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

void work(int n, int i)
{
    string res;
    while (n)
    {
        // a的ASCII值为97, 0的ASCII值为48
        res.push_back(n % i >= 10 ? (char)(87 + n % i) : (char)(48 + n % i));
        n /= i;
    }
    for (int i = res.size() - 1; i >= 0; i --)
        cout << res[i];
    cout << endl;
}

int main()
{
    int n;
    cin >> n;
    printf("%d对应的%d进制数为:", n, 2);
    work(n, 2);    
    printf("%d对应的%d进制数为:", n, 8);
    work(n, 8);    
    printf("%d对应的%d进制数为:", n, 16);
    work(n, 16);
    
    return 0;
}

将一个十进制数x转化任意进制数m python_c++

二、回文串

问题描述

编写一个函数,输入一串字符,以回车结束,判断该字符是否是回文串,如”abcddcba“是回文串,即正读反读相同的串。

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

bool is_palindrome(string s)
{
    for (int i = 0, j = s.size() - 1; i < j; i ++, j --)
        if (s[i] != s[j]) return false;
    return true;
}

int main()
{
    string s;
    while (cin >> s)
        cout << is_palindrome(s) << endl;
        
    return 0;
}
#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

// 递归版本
bool is_palindrome(string s, int i, int j)
{
    if (i >= j) return true;
    
    return s[i] == s[j] && is_palindrome(s, i + 1, j - 1);
}

int main()
{
    string s;
    while (cin >> s)
        cout << is_palindrome(s, 0, s.size() - 1) << endl;
        
    return 0;
}

将一个十进制数x转化任意进制数m python_算法_02

三、图书管理系统

题目描述

某出版社需要统计目前最畅销的30本书的售书情况。设:每一本书需保存的信息有:书名,库存量,单价,出书统计数;从键盘每次输入一本书的书名(假设购买该出版社的读者有100人);程序根据输入的书名,使该书的库存量减少一本,售书统计数增加1;按售书统计数的多少从大到小排序输出书名,售书统计数,库存量。

要求:

(1)设计出该程序的数据结构;

(2)编写程序,实现上述所有要求。

#include <iostream>
#include <algorithm>

using namespace std;

const int N = 3;    // 统计30本书的销售情况,这里为了方便输入定义为3
const int M = 5;    // 购买该出版社的读者有100人,这里为了方便输入定义为5

struct Book
{
    string name{"book_name"};    // 书名
    int num{100};        // 库存
    double price{50};   // 价格
    int sale{0};       // 销量

    bool operator< (const Book& t) const
    {
        return sale > t.sale;
    }
}book[N];

void quick_sort(int l, int r)
{
    if (l >= r) return ;
    int i = l - 1, j = r + 1, x = book[l + r >> 1].sale;
    while (i < j)
    {
        do i ++; while (book[i].sale > x);
        do j --; while (book[j].sale < x);
        if (i < j) swap(book[i], book[j]);
    }
    quick_sort(l, j);
    quick_sort(j + 1, r);
}

int main()
{
    puts("请输入书籍信息:");
    for (int i = 0; i < N; i ++)
    {
        printf("请依次输入第%d本书的书名,库存量,单价:\n", i + 1);
        cin >> book[i].name >> book[i].num >> book[i].price;
    }

    puts("请依次输入要销售的书的书名:");
    for (int i = 0; i < M; i ++)
    {
        printf("第%d本书的书名:", i + 1);
        string s;
        cin >> s;
        for (Book &b : book)
        {
            if (s == b.name)
            {
                b.sale ++;
                b.num --;
                puts("出库成功!");
                break;
            }
        }
    }

//    sort(book, book + N);
    quick_sort(0, N - 1);

    for (int i = 0; i < N; i ++)
        printf("书名:%s 库存:%d 单价:%lf 销量:%d\n", book[i].name.c_str(), book[i].num, book[i].price, book[i].sale);
    // 为了与C兼容,在C中没有string类型,故必须通过string类对象的成员函数c_str()把string对象转换成C中的字符串样式。

    return 0;
}
/**
 * 输入示例:
 * 高数18讲 20 38.8
 * 张宇1000题 30 28.8
 * 基础30讲 40 88.8
*/

/**
 * 输出:
请输入书籍信息:
请依次输入第1本书的书名,库存量,单价:
高数18讲 20 38.8
请依次输入第2本书的书名,库存量,单价:
张宇1000题 30 28.8
请依次输入第3本书的书名,库存量,单价:
基础30讲 40 88.8
请依次输入要销售的书的书名:
第1本书的书名:高数18讲
出库成功!
第2本书的书名:高数18讲
出库成功!
第3本书的书名:高数18讲
出库成功!
第4本书的书名:张宇1000题
出库成功!
第5本书的书名:基础30讲
出库成功!
书名:高数18讲 库存:17 单价:38.800000 销量:3
书名:张宇1000题 库存:29 单价:28.800000 销量:1
书名:基础30讲 库存:39 单价:88.800000 销量:1
*/
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>

using namespace std;

const int N = 3;    // 统计30本书的销售情况,这里为了方便输入定义为3
const int M = 5;    // 购买该出版社的读者有100人,这里为了方便输入定义为5

struct Book
{
    char name[20];    // 书名
    int num;        // 库存
    double price;   // 价格
    int sale;       // 销量

    bool operator< (const Book& t) const
    {
        return sale > t.sale;
    }
} book[N];

void quick_sort(int l, int r)
{
    if (l >= r) return ;
    int i = l - 1, j = r + 1, x = book[l + r >> 1].sale;
    while (i < j)
    {
        do i ++; while (book[i].sale > x);
        do j --; while (book[j].sale < x);
        if (i < j) swap(book[i], book[j]);
    }
    quick_sort(l, j);
    quick_sort(j + 1, r);
}

int main()
{
    puts("请输入书籍信息:");
    for (int i = 0; i < N; i ++)
    {
        printf("请依次输入第%d本书的书名,库存量,单价:\n", i + 1);
        scanf("%s%d%lf", book[i].name, &book[i].num, &book[i].price);
    }

    puts("请依次输入要销售的书的书名:");
    for (int i = 0; i < M; i ++)
    {
        printf("第%d本书的书名:", i + 1);
        char s[20];
        scanf("%s", s);
        for (Book &b : book)
        {
            if (!strcmp(s, b.name)) // s == b.name
            {
                b.sale ++;
                b.num --;
                puts("出库成功!");
                break;
            }
        }
    }

//    sort(book, book + N);
    quick_sort(0, N - 1);

    for (auto & i : book)
        printf("书名:%s 库存:%d 单价:%.2lf 销量:%d\n", i.name, i.num, i.price, i.sale);

    return 0;
}
/**
 * 输入示例:
 * 高数18讲 20 38.8
 * 张宇1000题 30 28.8
 * 基础30讲 40 88.8
*/

/**
 * 输出:
请输入书籍信息:
请依次输入第1本书的书名,库存量,单价:
高数18讲 20 38.8
请依次输入第2本书的书名,库存量,单价:
张宇1000题 30 28.8
请依次输入第3本书的书名,库存量,单价:
基础30讲 40 88.8
请依次输入要销售的书的书名:
第1本书的书名:高数18讲
出库成功!
第2本书的书名:高数18讲
出库成功!
第3本书的书名:高数18讲
出库成功!
第4本书的书名:张宇1000题
出库成功!
第5本书的书名:基础30讲
出库成功!
书名:高数18讲 库存:17 单价:38.80 销量:3
书名:张宇1000题 库存:29 单价:28.80 销量:1
书名:基础30讲 库存:39 单价:88.80 销量:1
*/

将一个十进制数x转化任意进制数m python_c语言_03