1736 - 会员分组
小明是学校电子竞技协会的会长,他想过一段时间组织一次协会内部的电子竞技比赛。但是为了让会员们能够尽量与自己实力相当的人比赛,小明决定将会员们按照当前的会员积分分成若干组,分组的方法如下:
(1)对于一个会员,如果他的积分小于等于10,则分到“1”组;
(2)如果一个会员积分大于10,则先把其积分按照四舍五入的原则近似到整十数,例如,一个会员的积分为14,则近似到10,积分为15,则近似到20,积分为99,则近似到100;然后,上一步近似后的积分如果大于100,则再将积分按照四舍五入的原则近似到整百数;再然后,上一步近似后的积分如果大于1000,则再将积分按照四舍五入的原则近似到整千数,依此类推,直到不能近似为止,最后的结果即为这个会员被分到的组。
具体例子请参考输入输出样例。
Input
输入的第一行为一个整数n(1<=n<=100),表示测试数据的组数。
接下来n行,每行输入一个整数x(0<=x<=99999999),表示一个会员的积分。
Output
对于每个输入的会员积分,输出该会员被分到的组。
Examples
Input
9 15 14 4 5 99 12345678 44444445 1445 446
Output
20 10 1 1 100 10000000 50000000 2000 500
Solution C
#include<stdio.h> #include<math.h> int main() { int t,n; double a; scanf("%d",&t); while(t--) { scanf("%lf",&a); n=1; if(a<=10){printf("1\n");continue;} while(a>=10) { a+=5; a/=10; a=floor(a); n*=10; } printf("%d\n",(int)(a*n)); } return 0; }
Solution C++
#include <stdio.h> int main() { int t, n, k; scanf("%d", &t); while (t--) { scanf("%d", &n); if (n <= 10) { puts("1"); continue; } k = 1; while (1) { k *= 10; if (k > n) break; if (n % k >= k / 2) n = (n / k + 1) * k; else n = n / k * k; } printf("%d\n", n); } return 0; }