偷吃步的方法就是先算好1-100的所有情況,
再根據input直接output XD。
/* ACM 344
* mythnc
* 2011/10/19 11:09:01
* run time: 0.02
*/
#include <stdio.h>
#define ARYMAX 5
void sum(int *, int);
void init(int *);
int main(void)
{
int n;
/* num element: 0:i, 1:v, 2:x, 3:l, 4:c */
int num[ARYMAX];
while (scanf("%d", &n) != EOF) {
if (n > 0) {
init(num);
sum(num, n);
printf("%d: %d i, %d v, %d x, %d l, %d c\n",
n, num[0], num[1], num[2], num[3], num[4]);
}
else
break;
}
return 0;
}
/* init: initialize num elements to 0 */
void init(int *num)
{
int i;
for (i = 0; i < ARYMAX; i++)
num[i] = 0;
}
/* sum: summation the digits from 1 to n */
void sum(int *num, int n)
{
int i;
for (i = 1; i < n + 1; i++) {
switch (i % 10) {
case 1:
num[0]++;
break;
case 2:
num[0] += 2;
break;
case 3:
num[0] += 3;
break;
case 4:
num[0]++;
num[1]++;
break;
case 5:
num[1]++;
break;
case 6:
num[1]++;
num[0]++;
break;
case 7:
num[1]++;
num[0] += 2;
break;
case 8:
num[1]++;
num[0] += 3;
break;
case 9:
num[2]++;
num[0]++;
break;
case 0:
default:
break;
}
switch (i / 10) {
case 1:
num[2]++;
break;
case 2:
num[2] += 2;
break;
case 3:
num[2] += 3;
break;
case 4:
num[2]++;
num[3]++;
break;
case 5:
num[3]++;
break;
case 6:
num[3]++;
num[2]++;
break;
case 7:
num[3]++;
num[2] += 2;
break;
case 8:
num[3]++;
num[2] += 3;
break;
case 9:
num[4]++;
num[2]++;
break;
case 10:
num[4]++;
break;
case 0:
default:
break;
}
}
}
沒有留言:
張貼留言