反转两个数字并获得总和的反向

时间:2017-01-31 12:44:46

标签: c debugging

我作为最后的手段来到SO。过去2小时一直试图调试此代码。如果问题适合其他SE网站,请在downvoting之前告诉我。

这就是:

#include <stdio.h>
#include<math.h>

int reverse(int n) {
    int count = 0, r, i;
    int k = (int)log(n * 1.0);
    for(i = k; i >= 0; i--)
    {
        r = (n % 10);
        n = (n / 10);
        count = count + (r * pow(10, k));
    }
    return count;
}

int main(void) {
     int t;
     scanf("%d", &t);

     while(t--)
     {
         int m, n, res;
         scanf("%d %d", &m, &n);
         res = reverse(m) + reverse(n);
         printf("%d", reverse(res));
     }
     return 0;
}

我的目标是获得两个数字作为输入,反转它们,添加反转的数字,然后反转结果。我必须这样做才能实现这一目标。&#39; t&#39;测试案例。

问题:http://www.spoj.com/problems/ADDREV/

有任何问题,如果代码不清楚,请在评论中问我。 谢谢。

编辑: 程序编译成功。 我每次都得到一个模糊的输出。 假设输入的2个数字是24和1,我的输出为699998。 如果我尝试21和1,我得到399998.

3 个答案:

答案 0 :(得分:3)

好的,如果正确调试了代码,您会注意到k的奇怪值。这是因为您使用了log

  

计算arg的自然(基数e)对数

(摘自链接参考,强调我的。)

因此,当您尝试获取数字的“长度”时,应使用log10或转换(查看wiki about change of base for logarithms),如下所示:log(x)/log(10)等于{{ 1}}

现在让我们看一下:log10(x)&lt; - 你总是计算10 ^ k,但你需要10 ^ i,所以它应该是pow(10, k)

编辑1:感谢@DavidBowling指出带有负数的错误。

我不知道完全你必须如何处理负数,但这是一个可能的解决方案:

  1. 在计算pow(10, i)

    之前

    k

  2. 由于bool isNegative = n < 0; n = abs(n);返回绝对值,您的n为正。继续用同样的方式。

  3. abs()循环后,让我们看看for是否为负数,并相应地更改n

    count

  4. 注意:使用此解决方案,我们将数字本身反转并保留原样。

答案 1 :(得分:1)

看起来Yuri已经找到了你的问题,但我可以建议你的程序更短的版本吗?它避免使用像log这样可能需要的东西。

#include <stdio.h>

int rev (int n) {
    int r = 0;
    do {
        r *= 10;
        r += n % 10;
    } while (n /= 10);
    return r;
}

int main (void) {
    int i,a,b;
    scanf("%d",&i);

    while (i--) {
        scanf("%d %d",&a,&b);
        printf("%d\n",rev(rev(a) + rev(b)));
    }       
    return 0;
}

希望您能找到有用的东西借用!它似乎也适用于负数。

答案 2 :(得分:0)

在引擎盖下你得到char字符串,将其反转为数字,而不是将其反转为char。因为使用chars比使用char更加舒适:

char * reverse (char *s,size_t len) //carefull it does it in place
{
   if (!len) return s; 
   char swp, *end=s+len-1;
   while(s<end)
   {
       swp =*s;
       *s++=*end;
       *end--=swp; 
   } 
   return s;
}
void get_num(char *curs)
{
     char c;
     while((c=getchar())!='\n')
      *curs++=c;
     *curs=0;
}
int main()
{
     double a,b,res;
     char sa[20],sb[20],sres[20],*curs;
     get_num( sa);
     get_num(sb);
     reverse(sa,strlen(sa));
     reverse(sb,strlen(sb));
     sscanf(sa,"%f",&a);
     sscanf(sb,"%f",&b);
     res=a+b;
     sprintf(sres,"%f",res);
     reverse(sres);
     printf(sres);

 }