我试图切换例如:输入54321.987,然后4和2应该切换,因此输出将是52341.987。 54321.777应该成为52341.777。如果它是2345.777,它应该是4325.777。比我不关心的任何东西。但如果它像888886543.777那样只有第二个和第四个数字应该从逗号之前的最右边部分切换。所以它会变成888884563.777
正如LearningC建议的那样,我试图只用1000s数字与10s数字交换。
但无论我尝试什么,我都会遇到错误。我无法传递错误。我该怎么做?
到目前为止,实际上有效的是:
int main(int argc, char** argv) {
double x;
scanf("%lf", &x);
double tens = ((int) (x / 10)) % 10;
double thousands = ((int) (x / 1000)) % 10;
printf("%09.3f", x += (tens - thousands) * 990.0);
return 0;
}
上面的代码现在有效。
答案 0 :(得分:6)
首先,您必须确定这些数字。
您可以使用
执行此操作double tens = ((int)(x / 10)) % 10;
double thousands = ((int)(x / 1000)) % 10;
可以让你做
x = x - (tens * 10.0) - (thousands * 1000.0) + (tens * 1000.0) + (thousands * 10.0);
在原始位置减去它们并以交换方式重新添加它们。
您可以将其优化为
x = x + tens * (1000.0 - 10.0) - thousands * (1000.0 - 10.0);
再次,这是
x += (tens - thousands) * 990.0;
答案 1 :(得分:1)
使用字符串操作:
char string[20];
snprintf(string, sizeof(string), "%09.3f", x);
char *dot = strchr(string, '.');
assert(dot != 0 && dot > string + 4);
char old_4 = dot[-4];
char old_2 = dot[-2];
dot[-2] = old_4;
dot[-4] = old_2;
/* If you need a float back */
sscanf(string, "%lf", &x);
使用算术操作:
double frac_part;
double int_part;
frac_part = modf(x, &int_part);
long value = int_part;
int dig_2 = (int_part / 10) % 10;
int dig_4 = (int_part / 1000) % 1000;
assert(dig_4 != 0);
value -= 10 * dig_2 + 1000 * dig_4;
value += 10 * dig_4 + 1000 * dig_2;
int_part = value;
x = int_part + frac_part;
两种操作顺序都不是最小的,但它们相当直接。
答案 2 :(得分:0)
我刚刚写了这个:
double swapDigits(double in)
{
return in + ((int)(in / 10) % 10 - (int)(in / 1000) % 10) * 990.0;
}