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