将整数舍入到最接近的十或百

我试图在C中考虑一个满足以下条件的函数:

  • 它接受一个大于0的整数作为参数;
  • 它将该整数舍入到最接近的值,以便只有第一个数字不是零

例如:

53出来60 ..

197年作为200 ..

4937出来5000

有没有办法做到这一点,以满足要求,无论尾随零的数量?

例如,我理解如何在任何个案中做到这一点。 divide 53 by 10 then ceil(), multiply by 10,但我希望能够处理任何值。

意见? 想法?

没有必要将数字转换为字符串并返回。 您可以使用基本模运算和乘法和除法来完成此操作。

这是一个纯数字解决方案,希望在运行时方面更有效:

 int round_up_to_max_pow10(int n) { int tmp = n; int i = 0; while ((tmp /= 10) >= 10) { i++; } if (n % (int)(pow(10, i + 1) + 0.5)) { tmp++; } for (; i >= 0; i--) { tmp *= 10; } return tmp; } printf("Original: %d; rounded: %d\n", 4937, round_up_to_max_pow10(4937)); 

避免字符串转换和循环:

 int num = ... // your number int len = log10(num); float div = pow(10, len); int rounded = ceil(num / div) * div; 

这里的对数非常有用,可以为“这有多少个零点”提供一个恒定时间的答案。

 floor(log10(x))= z //the number of zeros 

将取对数基数10并给出将在x中的零数。

然后你可以使用C偶尔的习语

(A + B-1)/ B

快速找到A / B的上限,以这种方式产生正确的前导数字:

 zeros = exp10(1,z); ((x+zeros-1)/zeros) * zeros 

这是伪代码,但你应该明白这个想法。 关键的理解是,对数是数学确定数字有多少位数的方法。

通过Cocoa API:

 int number=9435; NSString *string=[NSString stringWithFormat:@"%d",number]; long length=[string length]; NSString *roundedString=[NSString stringWithFormat:@"%d",([[string substringToIndex:1]intValue]+1)]; while (--length>0) { roundedString=[roundedString stringByAppendingString:@"0"]; } int roundedNumber=[roundedString intValue]; NSLog(@"%d, %d",number,roundedNumber); 

通过典型的C风格,数学上:

 int i=8517; int temp=i; int len,msb; for (len=0; temp>0; len++) { msb=temp; temp/=10; } msb++; int multiplier=1; for (int i=1; i 

我不确定你是想要圆形还是天花板。 但是你在问题中表现出的行为表明了ceil。 所以我把它包括在内。

 int my_ceil(int num) { int den = 1; int inc = 0; while (num >= 10) { inc += num % 10; num /= 10; den *= 10; } return (num + (inc > 0)) * den; } 

编辑

更改了代码以删除ceil和其他额外操作。

编辑2

固定为10的倍数。

尝试获取输入数字的第一个字符,添加1,然后附加零。

  Dim Input = "23568" Dim roundUp = Left(Input, 1) + 1 For x = 1 To Len(Input) - 1 roundUp &= "0" Next 

在VB中,但希望你能得到这个想法。

我会将数字转换为字符串。 获取字符串的长度。

然后:

 // pseudo code: divisor = pow(10, len of number string) answer = ceil (number/divisor) * divisor; 

您可以将数字除以10,直到只剩下一个数字,然后将其乘以大小:

 int n = 4937; int m = 1; while (n >= 10) { n = (n + 9) / 10; m *= 10; } n *= m; 

这应该这样做:

 static int rnd_up(int val) { double e, r; e = exp10(trunc(log10((double)val))); r = round(((double)val / e) + 0.5); return(r * e); } 

没有循环。

 #include  unsigned roundToNextExp10( unsigned a ) { int d = a ; if( a >= 10 ) { int m ; d-- ; m = (int)pow( 10, ((int)log10(d)) ) ; d = (int)((d / m) + 1) * m ; } return d ; } 
 /*-------------------------------------------------*/ /* Round up a number */ /* (Negative numbers go DOWN) */ /* 34 -> 40 */ /* -34 -> -40 */ /*-------------------------------------------------*/ int round_up_10(int num) { int sign = 1; int tens = 1; if (num < 0) { num = (-1) * num; sign = -1; } num = (num + 9) / 10; num = num * 10; return sign * num; } /*-------------------------------------------------*/ /* Round down a number */ /* (Negative numbers go UP) */ /* 34 -> 30 */ /* -34 -> -30 */ /*-------------------------------------------------*/ int round_down_10(int num) { int sign = 1; int tens = 1; if (num < 0) { num = (-1) * num; sign = -1; } num = num / 10; num = num * 10; return sign * num; } main() { printf("round_down_10(25450)= %d\n", round_down_10(25450)); printf("round_down_10(-25450)= %d\n", round_down_10(-25450)); printf("round_up_10(25450)= %d\n", round_up_10(25450)); printf("round_up_10(-25450)= %d\n", round_up_10(-25450)); printf("round_down_10(1347)= %d\n", round_down_10(1347)); printf("round_down_10(-1347)= %d\n", round_down_10(-1347)); printf("round_up_10(1347)= %d\n", round_up_10(1347)); printf("round_up_10(-1347)= %d\n", round_up_10(-1347)); printf("round_down_10(34)= %d\n", round_down_10(34)); printf("round_down_10(-34)= %d\n", round_down_10(-34)); printf("round_up_10(34)= %d\n", round_up_10(34)); printf("round_up_10(-34)= %d\n", round_up_10(-34)); } /* The outout: round_down_10(25450)= 25450 round_down_10(-25450)= -25450 round_up_10(25450)= 25450 round_up_10(-25450)= -25450 round_down_10(1347)= 1340 round_down_10(-1347)= -1340 round_up_10(1347)= 1350 round_up_10(-1347)= -1350 round_down_10(34)= 30 round_down_10(-34)= -30 round_up_10(34)= 40 round_up_10(-34)= -40 */ 

你来到这里的一些专家建议……要将数字舍入到最接近的10:

 if (i%10) i += 10 - i%10; 

同样适用于100s,1000s等。