天天看点

HDU2106 decimal system

问题链接:HDU2106 decimal system。入门训练题,用C语言编写程序。

这个问题是输入的数据进制各不相同要进行求和。

关键是函数atoi()的原理要玩的很熟悉,才能够随心所欲地解决进制有关的问题。

这里给出两种程序,一种是直接对字符串进行处理(使用函数strtok()切分值部分数字串和进制部分字符串),另外一种是暂时将不同进制的数当作10进制数进行处理,然后再转换。

使用函数strtok()的AC程序如下:

/* HDU2106 decimal system */     #include <stdio.h>     #include <stdlib.h>     #include <string.h>     int main(void)     {         int n, base, val, sum, i;         char s[1024];         char delim[] = "()", *p, *q;         while(scanf("%d", &n) != EOF) {             // 和清零             sum = 0;             // 读入各个数据,进行求和处理             for(i=1; i<=n; i++) {                 scanf("%s", s);                 // 使用函数strtok将字符串分为两个数字串                 p = strtok(s, delim);                 q = strtok(NULL, delim);                 // 算出进制                 base = atoi(q);                 // 根据进制base进行atoi计算                 val = 0;                 while(*p) {                     val *= base;                     val += *p - '0';                     p++;                 }                 // 累加                 sum += val;             }             // 输出结果             printf("%d\n", sum);         }         return 0;     }      

进制转换的AC程序如下:

/* HDU2106 decimal system */     #include <stdio.h>     #include <stdlib.h>     // 进制转换:将10进制的val转为base进制的值     int change(int val, int base)     {         int result = 0, weight = 1;         while(val) {             result += (val % 10) * weight;             val /= 10;             weight *= base;         }         return result;     }     int main(void)     {         int n, base, val, sum, i;         while(scanf("%d", &n) != EOF) {             // 和清零             sum = 0;             // 读入各个数据,进行求和处理             for(i=1; i<=n; i++) {                 scanf("%d(%d)", &val, &base);                 // 累加                 if(base == 10)                     sum += val;                 else                     sum += change(val, base);             }             // 输出结果             printf("%d\n", sum);         }         return 0;     }