C ++程序在不同的机器上产生不同的输出

时间:2016-06-11 17:57:02

标签: c++

我正在解决代码强制上的this问题,我用C ++编写了代码。这是快速(但不好)的解决方案:

#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <string.h>
#include <cmath>

using namespace std;

int main()
{
    int n,r,c,temp,len,i;
    char str[100];
    char rem;
    string res;

    cin >> n;
    while(n--)
    {
        r = c = -1;
        res = "";

        scanf("%s",str);
        sscanf(str, "R%dC%d",&r,&c);

        if(r != -1 && c != -1)
        {
            /* RC type */
            temp = c;
            if(c%26 == 0)
                temp--;
            while(temp)
            {
                rem = 'A' + (temp%26 - 1);
                res = res + rem;
                temp = temp / 26;
            }
            if(c%26 == 0)
                res.at(0) = res.at(0) + 1;

            reverse(res.begin(), res.end());
            cout << res << r << endl;
        }
        else
        {
            /* normal type */
            len = strlen(str);
            r = 0;
            c = 0;
            temp = 0;
            for(i=len-1;i>=0;i--)
            {
                if(str[i] >= '0' && str[i] <= '9')
                {
                    r = r + pow(10,len-i-1) * (str[i] - '0');
                }
                else
                {
                    c = c + pow(26,temp)*(str[i] - 'A' + 1);
                    temp++;
                }
            }
            cout << "R" << r << "C" << c << endl;
        }
    }
    return 0;
}

如果这是输入:

2
R23C55
BC23

我的Linux 64位gcc提供了这个输出:

BC23
R23C55

但在线评委正在给出这样的结果:

BC23
R23C54

我使用了正确的括号,没有不确定的递增/递减运算符来确保两台机器上的事物的评估顺序完全相同,但仍有一些因素导致未定义的评估。任何人都可以请求帮助什么声明有未定义的行为。 AFAIK,解决方案没有这样的说法。请帮忙。

修改 我在ceil()周围使用了pow()并通过了测试用例。虽然,我现在很害怕。我现在担心如何确定pow()返回的值,因为there is a good reason of not implementing pow to return int type.

2 个答案:

答案 0 :(得分:1)

Maxim Sabyanin的评论可能是一种可能的解决方案。如果你只对整数感兴趣,那么要么做一个结果或者结果为pow。我之前遇到过类似的问题。您可以编写一个简单的pow实现,如下所示

int exponent(int base_number, int power)
{
    int i;//multiplication counter
    int current_product=1;
    for(i=0; i<power; i=i+1)
    {
        current_product=current_product*base_number;
    }
    return current_product;
}

答案 1 :(得分:0)

  

我在ceil()周围使用pow()并通过了测试用例。

在这种情况下,这是避免pow的一个很好的理由。实现一个与整数类型一起使用的函数并不太困难,并且不会受到浮点精度问题的影响。

int int_pow(int x, unsigned int n)
{
   int ret = 1;
   while (n--)
   {
      ret *= x;
   }
   return ret;
}

请注意,如果这成为性能瓶颈,您可以使用稍加修改的版本。

int int_pow(int x, unsigned int n)
{
   if ( n == 0 )
   {
      return 1;
   }

   return (int_pow(x, n/2) * (n%2 == 0 ? 1 : x));
}