题目链接:http://acm.jlu.edu.cn/joj/showproblem.php?pid=1581
解题心得:
1,VC的64位整数分别叫做__int64与unsigned __int64,其范围分别是[-2^63, 2^63)与[0,2^64),即-9223372036854775808~9223372036854775807与 0~18446744073709551615(约1800亿亿)。对64位整数的运算与32位整数基本相同,都支持四则运算与位运算等当进行64位与32位的混合运算时,32位整数会被隐式转换成64位整数。但是,VC的输入输出与__int64的兼容就不是很好了,如果你写下这样一段代码: __int64 a;
cin >> a;
cout << a;
编译器会报错,因此可以使用c的写法
scanf("%I64d",&a);
printf("%I64d",a);
当使用unsigned __int64时,把"I64d"改为"I64u"就可以了。OJ通常使用g++编译器。其64位扩展方式与VC有所不同,它们分别叫做long long 与 unsigned long long。处理规模与除输入输出外的使用方法同上。对于输入输出,它的扩展比VC好。既可以使用
long long a;
cin>>a;
cout<<a;
也可以使用
scanf("%lld",&a);
printf("%lld",a);
使用无符号数时,将"%lld"改成"%llu"即可。最后我补充一点:作为一个特例,如果你使用的是Dev-C++的g++编译器,它使用的是"%I64d"而非"%lld"。
2,不要忽略边界数据的检测,此问题就是0向其他进制的转化
3,中间结果的类型转化也不能弄错,我就被困在这里了!!!
#include <stdio.h>
-
#include <cmath>
-
#include <string>
-
#include <stack>
-
using namespace std;
-
-
int s_base,d_base;
-
char s_num [ 11 ];
-
stack<int> d_num;
-
int main ( int argc, char* argv [ ] )
-
{
-
while ( scanf ( "%d%d%s",&s_base,&d_base,s_num ) != EOF )
-
{
-
long long sum = 0;
-
int i,len,temp;
-
len = strlen (s_num );
-
bool wrong = false;
-
for (i = len - 1;i >= 0;i-- )
-
{
-
if (s_num [i ] < 'A' )
-
temp = s_num [i ] - '0';
-
else
-
temp = s_num [i ] - 'A' + 10;
-
-
if (temp >= s_base )
-
{
-
printf ( "%s is an illegal base %d number/n",s_num,s_base );
-
wrong = true;
-
break;
-
}
-
//此处如果不转化为long long会wa的!
-
sum += temp * ( long long ) pow ( ( double )s_base, ( double )len - 1 - i );
-
}
-
-
if (wrong )
-
continue;
-
-
/*while(sum != 0)没有处理0的情况
-
{
-
d_num.push(sum % d_base);
-
sum /= d_base;
-
}*/
-
do
-
{
-
d_num. push (sum % d_base );
-
sum /= d_base;
-
} while (sum != 0 );
-
-
char cur;
-
printf ( "%s base %d = ",s_num,s_base );
-
while (!d_num. empty ( ) )
-
{
-
cur = ( char ) d_num. top ( );
-
d_num. pop ( );
-
if (cur < 10 )
-
cur += '0';
-
else
-
cur += ( 'A' - 10 );
-
printf ( "%c",cur );
-
}
-
printf ( " base %d/n",d_base );
-
}
-
return 0;
-
}