如何在双倍中切换第2和第4位(逗号之前)? C编程

时间:2016-09-24 15:19:19

标签: c

因此,假设输入为4 5 3 9 2.56,输出必须为4 9 3 5 2.56。 我怎么能用C编程?

3 个答案:

答案 0 :(得分:1)

  1. 将数字转换为字符数组。查看sprintf函数。
  2. 交换角色的位置。
  3. 将字符数组转换为double。查看atof函数。

答案 1 :(得分:1)

#include <stdio.h>
#include <stdlib.h>

int dotPos(char arr[]) {
    int i = 0;
    while (arr[++i] != '.');
    return i;
}

int main() {
    double d = 45392.56;

    int MAX = 100;
    char arr[MAX];
    sprintf(arr, "%f", d);

    if (dotPos(arr) > 3) {
        char aux = arr[1];
        arr[1] = arr[3];
        arr[3] = aux;
    }

    d = atof(arr);
    printf("%.2f\n", d);
}

输出:

49352.56

答案 2 :(得分:1)

避免转换为字符串和返回,取数字的整数部分,找到位置1和3中的两个值(十进制表示法),并计算要添加到原始双精度值或从原始双精度值减去的值。 这是outlierindex = find(cellfun(@(x) x > 25, groundtruth))

(a-b) *pow(10,hipos) - (a-b) * pow(10,lopos)

BTW:对于整数部分大于最大log int的值,例如#include <stdio.h> long finddiff(unsigned long val, unsigned lpos, unsigned rpos); int main(void) { double d = 45392.56; unsigned long u; long dif; u = d; dif = finddiff(u,3,1); d += dif; printf("%.2f\n", d); return 0; } long finddiff(unsigned long val, unsigned lpos, unsigned rpos) { long res; unsigned pos, ll, rr; if (lpos < rpos) return finddiff(val, rpos,lpos); for (pos=0; pos < rpos; pos++) { val /= 10; } rr = val %10; for (; pos < lpos; pos++) { val /= 10; } ll = val %10; // fprintf(stderr, "%u,%u\n", ll,rr); res = rr-ll; for (; pos > rpos; pos--) { res *= 10; } res -= rr-ll; for (; pos > 0; pos--) { res *= 10; } // fprintf(stderr, "%u,%u,%ld\n", ll,rr, res); if (ll > rr) res = -res; else if (rr > ll) {;} else res = 0; return res; } ,这将失败。 对于负数,应该添加一些额外的逻辑。