我作为最后的手段来到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.
答案 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指出带有负数的错误。
我不知道完全你必须如何处理负数,但这是一个可能的解决方案:
在计算pow(10, i)
:
k
由于bool isNegative = n < 0;
n = abs(n);
返回绝对值,您的n
为正。继续用同样的方式。
在abs()
循环后,让我们看看for
是否为负数,并相应地更改n
:
count
注意:使用此解决方案,我们将数字本身反转并保留原样。
答案 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);
}