【笔试】n进转换

原创 2016年08月28日 18:29:58

我是网络公司的一名普通程序员,英文名Steven,发音比较像“师弟”,自从入职培训自我介绍后,大家就称我为“二师弟”,我喜欢看科幻小说,也喜欢做梦,有一次梦到外星球,发现外星人使用的并非10进制/16进制等,有些星球居然使用N进制(据统计N都在2~35之间),现在我们将首先给您一个数字表示N进制,然后给出两个数字的字符串,请算出其求和结果并输出,如果输入不能正常计算则输出-1。
说明:
1:数字的字符串其中包括0-9和a-z(表示10-35)。
2:所有的输入和输出都只会是小写字母或数字,不存在其他字符。

#include <iostream>
#include <string>
#include <algorithm>
#include <math.h>
#include <vector>
using namespace std;
int main()
{
int n;
int iNum = 0;/////
string str1, str2;
while (cin >> n >> str1 >> str2)
{
if (n >= 2 && n <= 35)//////断言进制是否满足要求
{
int sumStr1 = 0;
int sumStr2 = 0;
string::iterator it1 = max_element(str1.begin(), str1.end());
string::iterator it2 = max_element(str2.begin(), str2.end());
reverse(str1.begin(), str1.end());
reverse(str2.begin(), str2.end());
vector<char>chVec;//存放n进制的每一位
if (n <= 10)
{
if (*it1 > '0' + n - 1 || *it2 > '0' + n - 1)
{
cout << -1 << endl;
return -1;
}
else
{
for (int i = 0; i < str1.size(); i++)
{
int n1 = str1[i] - '0';
sumStr1 += n1*pow((float)n, i);
}
for (int i = 0; i < str2.size(); i++)
{
int n1 = str2[i] - '0';
sumStr2 += n1*pow((float)n, i);
}
}
int sum = sumStr1 + sumStr2;
do
{
//iNum++;
chVec.push_back(sum%n+'0');
sum = sum / n;
} while (sum != 0);
reverse(chVec.begin(), chVec.end());
copy(chVec.begin(), chVec.end(), ostream_iterator<char>(cout, ""));
/*for (int i = 0; i < chVec.size(); i++)
{

cout << chVec[i];
}*/
cout << endl;
//cout << sumStr1 + sumStr2 << endl;
//return sumStr1+sumStr2;
}
else
{
if (*it1 > 86 + n || *it2 > 86 + n)
{
cout << -1 << endl;
return -1;
}
else
{
for (int i = 0; i < str1.size(); i++)
{
if (str1[i] >= '0' && str1[i] <= '9')
{
int n1 = str1[i] - '0';
sumStr1 += n1*n1*pow((float)n, i);
}
else
{
int n1 = str1[i] - 'a'+10;
sumStr1 += n1*pow((float)n, i);
}
}
for (int i = 0; i < str2.size(); i++)
{
if (str2[i] >= '0' && str2[i] <= '9')
{
int n1 = str2[i] - '0';
sumStr2 += n1*pow((float)n, i);
}
else
{
int n1 = str2[i] - 87;
sumStr2 += n1*pow((float)n, i);
}
}
}
int sum = sumStr1 + sumStr2;
//cout << sum << endl;
do
{
//iNum++;
if (sum%n >= 10)
chVec.push_back(sum%n-10+'a');
else
chVec.push_back(sum%n+'0');
sum = sum / n;
} while (sum != 0);
reverse(chVec.begin(),chVec.end());
copy(chVec.begin(),chVec.end(),ostream_iterator<char>(cout,""));

cout << endl;
//cout << sumStr1 + sumStr2 << endl;
//return sumStr1+sumStr2;
}
}
}
system("pause");
return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

java常见笔试n面试题String相关视频

  • 2008年09月10日 00:18
  • 22.08MB
  • 下载

一道排序笔试题,在o(n)时间内对一个数组进行排序

题目:某公司有几万名员工,请完成一个时间复杂度为O(n)的算法对该公司员工的年龄作排序,可使用O(1)的辅助空间。 分析:估计有很多人应该都看过这个题目,仅仅作为自己面试找工作的一个记录哈,大家见笑...

【阿里2013实习笔试】n个战士最少通话次数知道全局战况

题目 战报交流:战场上不同的位置有N个战士(n>4),每个战士知道当前的一些战况,现在需要这n个战士通过通话交流,互相传达自己知道的战况信息,每次通话,可以让通话的双方知道对方的所有情报,设计算法,...

求关于n的阶乘结果后面有几个零?如2016的阶乘(网易的笔试选择题)

文章的原地址:http://blog.csdn.net/zyh2525246/article/details/53697136 一、阶乘数小的时候可以直接计算。 例如:求10!后面零的个数...

【笔试】52、N个骰子的点数

/**************************************************************************************** *题目:N个骰子的...

笔试面试算法经典-找到数组中出现次数大于N/k的数(Java)

【题目】 给定一个整型数组arr,再给定一个整数k,打印所有出现次数大于 N/K 的数。如果没有这样的数,打印提示信息。 【要求】 时间复杂度为O(N*K),额外空间复杂度为O(K)。【思路】...

Python算法笔试题目,破解Hash值,N进制法

Find the string whichhas this hash: 25267566250558 The string has length8. Characters can befr...

编程珠玑之生成0至n-1之间的k个不同随机序列的扩展问题 --2014人人网笔试题目

《编程珠玑》中习题1.4的题目是:“如果认真考虑了习题3,你将会面对生成小于n且没有重复的k个整数的问题。最简单的方法就是使用前k个正整数。这个极端的数据集合将不会明显的改变位图方法的运行时间,但是可...

搜狗笔试:N个正实数选出若干个之和最接近M

搜狗:有N个正实数(注意是实数,大小升序排列) x1 , x2 ... xN,另有一个实数M。 需要选出若干个x,使这几个x的和与 M 最接近。 请描述实现算法,并指出算法复杂度。 思路:对于每一个...

[Amazon笔试]求比数n大的最小回文数的字符串形式

题目描述 求比数n大的最小回文数的字符串形式,例如123的 解题思路  代码...
  • cjllife
  • cjllife
  • 2014年10月09日 20:49
  • 608
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【笔试】n进转换
举报原因:
原因补充:

(最多只允许输入30个字)