C语言 在两个数字数组之间执行求和



今天接受了一次采访,我被问到以下问题 - 给定两个数组arr1和字符arr2,它们只包含一个数字和一个点,还给出了一个值m,将它们汇总成一个字符数组,其中它们包含点后的m位数字。该程序应用C编写。算法对他们来说并不重要,他们只是给了我一个编译器和 20 分钟的时间来通过他们的测试。

首先,我要找到最大长度并从末尾遍历数组并在保持进位的同时对值求和:

int length = (firstLength < secondLength) ? secondLength : firstLength;
char[length] result;
for (int i = length - 1; i >= 0; i--) {
    // TODO: add code
}

问题是,由于某种原因,我不确定在保持点的同时执行该总和的正确方法是什么。此循环应该只执行外观,而不是与k相反。我的意思是,在这一点上,我认为只需添加值,最后我将插入另一个循环,该循环将在点后打印k值。 我的问题是我提到的第一个循环(实际求和的循环(应该如何看待,我真的被困住了。

算法并不重要

好的,在这种情况下,我会让libc为我做(显然缺少错误处理(:

void sum(char *as, char *bs, char *out, int precision)
{
    float a, b;
    sscanf(as, "%f", &a);
    sscanf(bs, "%f", &b);
    a += b;
    sprintf(out, "%.*f", precision, a);
}

实际上,我花了 20 多分钟的时间来完成这项工作。代码也相当长,所以我不打算在这里发布它。简而言之,代码确实:

  1. 将 2 个数字规范化为 2 个新字符串,以便它们具有相同数量的十进制数字
  2. 分配一个长度为上述 2 个字符串中较长的新字符串 + 1
  3. 将 2 个
  4. 字符串相加,一次 2 位数字,带载波
  5. 目前尚不清楚最终答案是否需要四舍五入。如果没有,只需将小数扩展/截断为 m 位数字。如果需要,请删除任何前导零。

我不确定这是否是最好的解决方案,但这里有一个解决方案,我希望它有所帮助。

#include<stdio.h>
#include<math.h>
double convertNumber(char *arr){
   int i;
   int flag_d=0; //To check whether we are reading digits before or after decimal
   double a=0;
   int j=1;
   for(i=0;i<arr[i]!='';i++){
       if(arr[i] !='.'){
           if(flag_d==0)
              a = a*10 + arr[i]-48;
           else{
              a = a + (arr[i]-48.0)/pow(10, j);
              j++;
           }
       }else{
           flag_d=1;
       }
   }
   return a;
}
int main() {
   char num1[] = "23.20";
   char num2[] = "20.2";
   printf("%.6lf", convertNumber(num1) + convertNumber(num2));
}

最新更新