¿Cómo cambiar el segundo y el cuarto dígito (antes de la coma) en un doble? Progtwigción en c

Entonces digamos que la entrada es 4 5 3 9 2.56, la salida debe ser 4 9 3 5 2.56. ¿Cómo puedo progtwigr esto en C?

#include  #include  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); } 

Salida:

 49352.56 
  1. Convertir el número a una matriz de caracteres. Mira la función sprintf .
  2. Intercambia las posiciones de los personajes.
  3. Convertir la matriz de caracteres al doble. Mira la función atof .

Evite la conversión a cadena y viceversa, tome la parte integral del número, encuentre los dos valores en las posiciones 1 y 3 (en notación decimal) y calcule el valor para sumr o restar a / del doble original. esto es (ab) *pow(10,hipos) - (ab) * pow(10,lopos)

 #include  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; } 

Por cierto: esto fallará miserablemente para los valores cuya parte entera sea más grande que el registro máximo int, por ejemplo, 6.3E23 . Para números negativos se debe agregar alguna lógica adicional.