Сложение в разных системах счисления - исправить и оптимизировать - C (СИ)
Формулировка задачи:
Я написал подпрограмму для сложения чисел в системах счисления от 2 до 10. Но у неё есть баги (особенно во 2 с/с) и она не очень то эффективна. Помогите исправить баги и как можно её ускорить и повысить эффективность?
m и n - это исходные 2 числа для сложения, ss - система счисления.
mm[] и nn[] - это исходные 2 числа представленные в разрядах как массив, rr[] - результат представленный как массив.
int summa(int m,int n,int ss)
{
int mm[10],nn[10],rr[10];
int i=0,j=0,k=0,result=0;
while(i<10)
{mm[i]=nn[i]=rr[i]=0;i++;}
i=0;
while(m>0)
{mm[i]=m%10;m=m/10;printf("\nmm[i]=%d",mm[i]);i++;}
while(n>0)
{nn[j]=n%10;n=n/10;printf("\nnn[j]=%d",nn[j]);j++;}
for(;k<10;k++)
{
rr[k]=rr[k]+nn[k]+mm[k];
if(rr[k]>=ss)
{
rr[k]=rr[k]%ss;
rr[k+1]=1;
}
printf("\nrr[%d]=%d",k,rr[k]);
}
for(k=0;k<10;k++)
result=result+rr[k]*pow(10,k);
return result;
}Решение задачи: «Сложение в разных системах счисления - исправить и оптимизировать»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
char *DIGITS = "0123456789abcdefghijklmnopqrstuvwxyz";
void printByBase(long val, size_t base){
if ( val / base )
printByBase(val / base, base);
putchar(DIGITS[val % base]);
}
int main(){
char buf[BUFSIZ];
long first, second, result;
size_t base;
while ( 1 ){
printf("Base (just ENTER to exit): ");
fgets(buf, BUFSIZ, stdin);
if ( *buf == '\n' )
break;
base = atoi(buf);
if ( base < 2 || base > 36 ){
printf("Base must be between 2 and 36\n");
continue;
}
printf("First number: ");
fgets(buf, BUFSIZ, stdin);
first = strtol(buf, NULL, base);
printf("Second number: ");
fgets(buf, BUFSIZ, stdin);
second = strtol(buf, NULL, base);
result = first + second;
printByBase(first, base);
printf(" + ");
printByBase(second, base);
printf(" = ");
printByBase(result, base);
putchar('\n');
}
return 0;
}
Объяснение кода листинга программы
- Объявлены две переменные: char *DIGITS =
0123456789abcdefghijklmnopqrstuvwxyz; и long first, second, result; - Задана функция printByBase(long val, size_t base), которая печатает число в заданной системе счисления.
- В функции printByBase(long val, size_t base) используется рекурсия для печати числа в заданной системе счисления.
- В функции main() задан цикл while, который продолжается до тех пор, пока пользователь не введет 'Enter'.
- В каждой итерации цикла пользователю предлагается ввести основание системы счисления, первое и второе числа.
- Введенные числа преобразуются в тип long и проверяются на корректность ввода.
- Если числа корректны, то они складываются и результат выводится на экран в заданной системе счисления.
- Код не содержит ошибок и оптимизирован для работы с большими числами в заданной системе счисления.