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;
}
展开
 我来答
linccn
2014-11-14 · 超过67用户采纳过TA的回答
知道小有建树答主
回答量:131
采纳率:0%
帮助的人:102万
展开全部
给你个测试用例:-23 12, 结果是-1-11,明显是错的

问题出在“除基取余”这段算法上,对于负数,这个算法是错的。

应该在计算之前先判断正负号,然后再计算各个数位。
更多追问追答
追问
请问,也就是在r小于10…n为正负都是正确的,只有当r大于10时,且n为负就会出错…而我可以这样做,'' 做完第一个for后,判断正负,负则输出负号,然后在含有ABCDEF 的for内全部g[i ]取绝对值……最后按原样输出……这样对吧?
追答
基本上是这样
其实逻辑可以再简单点:如果N是负数,那么结果就是负数;然后立马把N转成正数,再计算各个数位(就是开始第一个循环),最后把正负号赋予最后的结果就行了。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式