所以,我正在推荐一本推荐的初学者书中的一些练习:C Programming: A Modern Approach (2nd Edition)在解决其中一个我发现自己无法继续的问题时,因为我无法返回最接近用户的输入。 注意:问题是在循环,函数和数组被覆盖之前被问到的,因此我假设不需要这些。
我设法将问题提取并简化为以下内容。假设我有以下数字,我想返回最接近用户输入的数字:
10
20
30
40
50
60
70
80
printf("Enter a number to find closest value: ");
scanf("%d", &num);
例如:
User's input: 28
Closest number: 30
接下来,我决定通过减去每个数字来找出num
与每个数字之间的差异。
difference1 = num - 10;
difference2 = num - 20;
等等。 (我没有使用循环,因为书中尚未涉及这些循环)
我考虑到了负面差异(25 - 40 = -15)。如果差异小于0
,我会将差值乘以-1
,以便将所有差异乘以正整数。通过这样做,我将能够成功地比较差异:
if (difference1 < 0) {
difference1 = difference1 * -1;
}
接下来,我正在检查最小差异,以便确定哪个是最接近的数字:
if (difference1 < difference2) {
min1 = difference1;
}
else {
min1 = difference2;
}
if (difference3 < difference4) {
min2 = difference3;
}
else {
min2 = difference4;
}
if (difference5 < difference6) {
min3 = difference5;
}
else {
min3 = difference6;
}
if (difference7 < difference8) {
min4 = difference7;
}
else {
min4 = difference8;
}
if (min1 < min2) {
min5 = min1;
}
else {
min5 = min2;
}
if (min3 < min4) {
min6 = min3;
}
else {
min6 = min4;
}
if (min5 < min6) {
min = min5;
}
else {
min = min6;
}
我知道这是一个非常长的方法,但是我不能在不使用for循环的情况下缩短代码。
printf("Difference between the two numbers is %d\n", min);
由于min
包含用户输入和最接近数字之间的差异,我无法找到打印最接近用户输入的数字的方法。
如何跟踪从原始数字中减去的最小差异?任何建议将不胜感激,请原谅这个问题的基本性质。
答案 0 :(得分:0)
我会做什么:
$firstname = preg_replace("/^[A-Za-z]+$/", "", $firstname);
$lastname = preg_replace("/^[A-Za-z]+$/", "", $lastname);
}
其中abs是绝对值。数字应该在某些数据结构中,因为在同一时间你应该询问你是否还有一些要检查的东西。
答案 1 :(得分:0)
我可以帮助您缩短代码。
这是我的方法
int num = 71;
int diff,ans;
int div10 = (num / 10);
int lower = div10 * 10;
int upper = (div10 + 1) * 10;
if(lower<10) lower=10;
if(lower>80) lower=80;
if(upper<10) upper=10;
if(upper>80) upper=80;
int diff1 = lower - num;
int diff2 = upper - num;
if(diff1 < 0) diff1 *= -1;
if(diff2 < 0) diff2 *= -1;
if(diff1 < diff2) {
ans = lower;
diff = diff1;
}
else {
ans = upper;
diff = diff2;
}
printf("ans=%d, diff=%d\n",ans,diff);
答案 2 :(得分:0)
如果你正在处理10s,这应该很简单:
num += 5;
closest_10 = num/10;
closest_10 *= 10;
如果您有一组数字,那么您可以进行简单的查找。您可以使用类似的算法将其扩展为其他倍数(例如,对于8s,只需将5替换为4和10)。
答案 3 :(得分:0)
由于所有数字都已修复,最佳方法(至少在编译后效率最高)是使用以下代码片段:
int closest(int number)
{
switch(number) {
case 0: case 1: case 2: case 3: case 4:
return 0;
case 5: case 6: case 7: case 8: case 9:
case 10: case 11: case 12: case 13: case 14:
return 10;
...
case 95: case 96: case 97: case 98: case 99: case 100:
return 100;
} /* switch */
} /* closest */
如果您可以内联代码而不是编写函数,效率会更高。
答案 4 :(得分:-1)
您需要更好地定义:假设我有以下数字。
多少个数字是个大问题。你的例子让它们全部被10整除。你的数字是10,20,30等等,你总共提到了8个数字。最多只有8个数字吗?它们可以是任何数字吗?它们都是整数吗?如果它的所有整数都可被10整除,则可以使用模数或模数运算符代替减法。
mod运算符%
仅适用于整数。
int a, b, c;
a = 3;
b = 25
c = a % 10; /* c will equal 3, 0 / 10 = 0 with remainder 3 */
c = b % 10; /* c will equal 5, 25 / 10 = 2 but remainder is 5 */
/* check if a number is even, just mod by 2 if zero then even */
if ( ( b % 2 ) == 0 )
printf(" value in b is even number\n");
else
printf(" value in b is odd number\n");