問題連結: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; }