acm题目 进制转换 提交C++代码老是提示wrong answer
Description输入一个十进制数N,将它转换成R进制数输出。Input输入数据包含多个测试实例,每个测试实例包含两个整数N(32位整数)和R(2<=R<=16,R<...
Description
输入一个十进制数N,将它转换成R进制数输出。
Input
输入数据包含多个测试实例,每个测试实例包含两个整数N(32位整数)和R(2<=R<=16, R<>10)。
Output
为每个测试实例输出转换后的数,每个输出占一行。如果R大于10,则对应的数字规则参考16进制(比如,10用A表示,等等)。
Sample Input
7 2
23 12
-4 3
Sample Output
111
1B
-11
我的代码如下
#include <cstdio>
#include <cstring>
#include <cmath>
#include <iostream>
using namespace std;
int g[500];
int main()
{
int a,n,i,k,r;
_int64 m ;
while (scanf ("%d%d",&n,&r)!=EOF)
{ m=0;k=0;
if (r==10) {printf("%d\n",n); continue;}
for (i=0;n!=0;i++)
{
g[i]=n%r;k++;
n=n/r;
}
for (i=0;i<k;i++)
{
if(r<10) m=m+g[i]* pow(10,i) ;
}
if (r<10) printf("%I64d\n",m );
if (r>10)
{
for (i=k-1;i!=-1;i--)
{ if (g[i]>=10)
{
if (g[i]==10) printf("A");
if (g[i]==11) printf("B");
if (g[i]==12) printf("C");
if (g[i]==13) printf("D");
if (g[i]==14) printf("E");
if (g[i]==15) printf("F");
}
else
printf("%d",g[i]);
}
}
printf("\n");
}
return 0;
} 展开
输入一个十进制数N,将它转换成R进制数输出。
Input
输入数据包含多个测试实例,每个测试实例包含两个整数N(32位整数)和R(2<=R<=16, R<>10)。
Output
为每个测试实例输出转换后的数,每个输出占一行。如果R大于10,则对应的数字规则参考16进制(比如,10用A表示,等等)。
Sample Input
7 2
23 12
-4 3
Sample Output
111
1B
-11
我的代码如下
#include <cstdio>
#include <cstring>
#include <cmath>
#include <iostream>
using namespace std;
int g[500];
int main()
{
int a,n,i,k,r;
_int64 m ;
while (scanf ("%d%d",&n,&r)!=EOF)
{ m=0;k=0;
if (r==10) {printf("%d\n",n); continue;}
for (i=0;n!=0;i++)
{
g[i]=n%r;k++;
n=n/r;
}
for (i=0;i<k;i++)
{
if(r<10) m=m+g[i]* pow(10,i) ;
}
if (r<10) printf("%I64d\n",m );
if (r>10)
{
for (i=k-1;i!=-1;i--)
{ if (g[i]>=10)
{
if (g[i]==10) printf("A");
if (g[i]==11) printf("B");
if (g[i]==12) printf("C");
if (g[i]==13) printf("D");
if (g[i]==14) printf("E");
if (g[i]==15) printf("F");
}
else
printf("%d",g[i]);
}
}
printf("\n");
}
return 0;
} 展开
1个回答
展开全部
给你个测试用例:-23 12, 结果是-1-11,明显是错的
问题出在“除基取余”这段算法上,对于负数,这个算法是错的。
应该在计算之前先判断正负号,然后再计算各个数位。
问题出在“除基取余”这段算法上,对于负数,这个算法是错的。
应该在计算之前先判断正负号,然后再计算各个数位。
更多追问追答
追问
请问,也就是在r小于10…n为正负都是正确的,只有当r大于10时,且n为负就会出错…而我可以这样做,'' 做完第一个for后,判断正负,负则输出负号,然后在含有ABCDEF 的for内全部g[i ]取绝对值……最后按原样输出……这样对吧?
追答
基本上是这样
其实逻辑可以再简单点:如果N是负数,那么结果就是负数;然后立马把N转成正数,再计算各个数位(就是开始第一个循环),最后把正负号赋予最后的结果就行了。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询