Сложение в разных системах счисления - исправить и оптимизировать - 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;
}

Объяснение кода листинга программы

  1. Объявлены две переменные: char *DIGITS = 0123456789abcdefghijklmnopqrstuvwxyz; и long first, second, result;
  2. Задана функция printByBase(long val, size_t base), которая печатает число в заданной системе счисления.
  3. В функции printByBase(long val, size_t base) используется рекурсия для печати числа в заданной системе счисления.
  4. В функции main() задан цикл while, который продолжается до тех пор, пока пользователь не введет 'Enter'.
  5. В каждой итерации цикла пользователю предлагается ввести основание системы счисления, первое и второе числа.
  6. Введенные числа преобразуются в тип long и проверяются на корректность ввода.
  7. Если числа корректны, то они складываются и результат выводится на экран в заданной системе счисления.
  8. Код не содержит ошибок и оптимизирован для работы с большими числами в заданной системе счисления.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 4.3 из 5
Похожие ответы