求助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
HJX54088 发表于 2018-11-30 15:29
嗯,那就麻烦解释一下除了main函数之外的其他部分吧,头文件勉强理解,其他的看的有点懵。
除了main其他都看不懂,你要我如何解释?
先打基础吧,如果你未来还有兴趣看这个程序的话,把这个程序留到未来吧
#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;
}
人造人 发表于 2018-11-30 01:20
首先感谢你给我的回复。其次是我刚刚学C++,有点看不懂前面的。 HJX54088 发表于 2018-11-30 12:48
首先感谢你给我的回复。其次是我刚刚学C++,有点看不懂前面的。
那看不懂? 人造人 发表于 2018-11-30 12:58
那看不懂?
嗯,那就麻烦解释一下除了main函数之外的其他部分吧,头文件勉强理解,其他的看的有点懵。{:10_254:}
页:
[1]