HJX54088 发表于 2018-11-29 20:59:15

求助C++作业

1.题目内容:
对数字求特征值是常用的编码算法,奇偶特征是一种简单的特征值。对于一个整数,从个位开始对每一位数字编号,个位是1号,十位是2号,以此类推。这个整数在第n位上的数字记作x,如果x和n的奇偶性相同,则记下一个1,否则记下一个0。按照整数的顺序把对应位的表示奇偶性的0和1都记录下来,就形成了一个二进制数字。比如,对于342315,这个二进制数字就是001101。

这里的计算可以用下面的表格来表示:

数字        3        4        2        3        1        5
数位        6        5        4        3        2        1
数字奇偶        奇        偶        偶        奇        奇        奇
数位奇偶        偶        奇        偶        奇        偶        奇
奇偶一致        0        0        1        1        0        1
二进制位值        32        16        8        4        2        1

你的程序要读入一个非负整数,整数的范围是,然后按照上述算法计算出表示奇偶性的那个二进制数字,输出它对应的十进制值。

提示:将整数从右向左分解,数位每次加1,而二进制值每次乘2。

输入格式:
一个非负整数,整数的范围是。

输出格式:
一个整数,表示计算结果。

输入样例:
342315

输出样例:
13

人造人 发表于 2018-11-29 20:59:16

HJX54088 发表于 2018-11-30 15:29
嗯,那就麻烦解释一下除了main函数之外的其他部分吧,头文件勉强理解,其他的看的有点懵。

除了main其他都看不懂,你要我如何解释?
先打基础吧,如果你未来还有兴趣看这个程序的话,把这个程序留到未来吧

人造人 发表于 2018-11-30 01:20:01

#include <iostream>
#include <string>
#include <sstream>
#include <cmath>

const std::string NumberToString(size_t num)
{
        std::stringstream ss;
        ss << num;
        std::string result;
        ss >> result;
        return result;
}

size_t StringToNumber(const std::string &s_num)
{
        std::stringstream ss;
        ss << s_num;
        size_t result;
        ss >> result;
        return result;
}

size_t BinaryToDecimal(const std::string &s_num)
{
        size_t result = 0;
        size_t num_size = s_num.size();
        for(auto iter = s_num.begin(); iter != s_num.end(); ++iter)
        {
                if(*iter == '1')
                {
                        result += pow(num_size - (iter - s_num.begin()) - 1, 2);
                }
        }
        return result;
}

size_t Fun(size_t num)
{
        if(num > 1000000)
                return -1;

        std::string s_num = NumberToString(num);
        size_t num_size = s_num.size();
        std::string result;
        for(auto iter = s_num.begin(); iter != s_num.end(); ++iter)
        {
                size_t n1 = num_size - (iter - s_num.begin());
                size_t n2 = StringToNumber({*iter});
                if(n1 % 2 == 0 ? (n2 % 2 == 0) : (n2 % 2 != 0))
                {
                        result += "1";
                }
                else
                {
                        result += "0";
                }
        }

        return BinaryToDecimal(result);
}

int main()
{
        size_t num;
        std::cin >> num;
        std::cout << Fun(num) << std::endl;

        return 0;
}

HJX54088 发表于 2018-11-30 12:48:05

人造人 发表于 2018-11-30 01:20


首先感谢你给我的回复。其次是我刚刚学C++,有点看不懂前面的。

人造人 发表于 2018-11-30 12:58:16

HJX54088 发表于 2018-11-30 12:48
首先感谢你给我的回复。其次是我刚刚学C++,有点看不懂前面的。

那看不懂?

HJX54088 发表于 2018-11-30 15:29:49

人造人 发表于 2018-11-30 12:58
那看不懂?

嗯,那就麻烦解释一下除了main函数之外的其他部分吧,头文件勉强理解,其他的看的有点懵。{:10_254:}
页: [1]
查看完整版本: 求助C++作业