2015-04-16 16 views
0

В соответствии с моим последним вопросом here.Преобразование формата A1 в формат R1C1

Я пытался проверить обратную сторону предыдущего вопроса. То есть, преобразование ввода формы A1 в вывод формы R1C1 (более подробно, посмотрите на мой последний вопрос).

Я объясню свой алгоритм. Предположим, нам нужно преобразовать BC23 в R23C55. Я извлек «BC» и «23» из BC23 и сохранил их в отдельных массивах. Я сделал другой массив, который сохраняет значения 1,2,3 ... так далее для A, B, C соответственно, как и когда они поступают на вход. Например, мой массив будет содержать 2 и 3 в качестве первых двух элементов соответственно для B и C. Затем я использовал некоторую математику для преобразования ее в число, в данном случае 55 для BC.

Вот полный код.

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

int main() 
{ 
    char str[5],col[5],row[5]; 
    int i=0,j=0,k=0,lenOfstr,lenOfcol; 
    scanf("%s",str); 

    while(str[i]>='A'&&str[i]<='Z') 
    { 
     col[j]=str[i]; 
     i++; 
     j++; 
    } 
    col[j]='\0'; 
    lenOfstr=strlen(str); 
    lenOfcol=strlen(col); 

    int ascCol[lenOfcol]; 

    for(i=lenOfcol;i<lenOfstr;i++) 
    { 
     row[k]=str[i]; 
     k++; 
    } 
    row[k]='\0'; 

    for(i=0;i<lenOfcol;i++) 
    { 
     ascCol[i]=col[i]-64; 
    } 

    int sum=0; 
    for(i=0;i<lenOfcol;i++) 
    { 
     sum=sum+(ascCol[i]*pow(26,lenOfcol-i-1)); 
    } 

    printf("%d",sum); 

    return 0; 
} 

В последней полоске кода есть небольшая ошибка, которую я не могу отлаживать.

int sum=0; 
    for(i=0;i<lenOfcol;i++) 
    { 
     sum=sum+(ascCol[i]*pow(26,lenOfcol-i-1)); 
    } 

    printf("%d",sum); 

Ввод Z должен дать мне выход 26, и AA должен дать 27. Но мой код дает 26 на обоих. После этого выход всегда на 1 меньше, чем должен быть правильный вывод; BC дает 54 вместо 55.

Кто-то помогает мне.

+0

Это звучит как вопрос с плавающей точкой. Некоторые цифры не могут быть точно представлены, поэтому, когда они продвигаются к другому типу данных, цифры могут быть неправильными. double -> int, например. Вероятно, вам нужно использовать библиотеку bignum. –

+0

Я не использовал с плавающей точкой где-нибудь –

+1

'pow' возвращает число с плавающей запятой –

ответ

4

Попробуйте изменить суммированием к этому:

sum = sum * 26 + ascCol[i] 

Это избавляет от необходимости беспокоиться о неожиданном с плавающей точкой округления поведения и других проблем, вызванных тем, что pow возвращает число с плавающей точкой.

Примечание вы можете просто вся ваша программа просто так:

#include <stdio.h> 

int main() 
{ 
    char str[5]; 

    scanf("%s", str); 

    int i = 0; 
    int sum = 0;  
    while(str[i] >= 'A' && str[i] <= 'Z') 
    { 
     sum = sum * 26 + (str[i] - 'A'); 
     i++; 
    } 

    printf("%d", sum); 

    return 0; 
} 
+0

да, что сделал задание, не знал, что pow возвращает число с плавающей запятой –

Смежные вопросы