天天看點

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;     }