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;
} 
                    
                     
                    
                 
                    
                 
                
            
         
 
         浙公网安备 33010602011771号
浙公网安备 33010602011771号