今天接受了一次采访,我被问到以下问题 - 给定两个数组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 多分钟的时间来完成这项工作。代码也相当长,所以我不打算在这里发布它。简而言之,代码确实:
- 将 2 个数字规范化为 2 个新字符串,以便它们具有相同数量的十进制数字
- 分配一个长度为上述 2 个字符串中较长的新字符串 + 1 将 2 个
- 字符串相加,一次 2 位数字,带载波
- 目前尚不清楚最终答案是否需要四舍五入。如果没有,只需将小数扩展/截断为 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));
}