解題計算思路:數組
實現代碼:app
#include<stdio.h> #include<stdlib.h> #include<math.h> #include<string.h> int get_level(int n) // 獲取該整數的級別, <10, <100, .... { int n_level = 0; while(n) { n_level++; n /= 10; } return n_level; } int get_sum(int level) // 獲取 1+ 2+ 3 + 4 + ... + 9 的值 { int sum = 0; for(int i = 1; i < pow(10.0, level - 1); i++) { sum += i; } return sum; } int main(void) { int **info; // info[i][j] // j 表明相應位數的信息, 例如 j = 1表明個位數級, j = 2表明十位數級 // i = 0 存放着總數量和總和 // i = 1 表明對應位數中符合條件的數字的數量 // i = 2 表明對應位數中符合條件的數字的和 int n; int n_level; int special_number[4] = {0, 1, 2, 9}; // 存放那些特殊的值 //獲取 1+ 2+ 3 + 4 + ... + 9 的值 int sum; // 存儲 1+ 2+ 3 + 4 + ... 的總和值 printf("輸入整數n: "); scanf("%d", &n); n_level = get_level(n); // 創建相應的二維數組 info = (int **)malloc(3 * sizeof(int *)); for(int i = 0; i <= 2; i++) { info[i] = (int *)malloc((n_level + 1) * sizeof(int)); // 初始化其值爲 0 memset(info[i], 0, (n_level + 1) * sizeof(int)); } // 數值累計 for(int temp_level = 1; temp_level <= n_level; temp_level++) { if(temp_level == 1) { for(int i = 0; special_number[i] <= n && i < 4; i++) {//依次加 0, 1, 2, 9 info[1][temp_level]++; info[2][temp_level] += special_number[i]; } } else { for(int i = 1; i * pow(10.0, temp_level - 1) <= n && i < 10; i++) { if(((i + 1) * pow(10.0, temp_level - 1) < n) && (i == 1 || i == 2 || i == 9)) // 這樣子就能作到 當取值爲 22 時, i 最大隻爲 1 { sum = get_sum(temp_level); // 將數值拆開 先計算最高位數上的值的和,再計算除了最高位數上其餘的數值和 info[1][temp_level] += 10; info[2][temp_level] += sum + i * pow(10.0, temp_level); } else if(((i + 1) * pow(10.0, temp_level - 1) >= n) && (i == 1 || i == 2 || i == 9)) // 將處於符合條件的範圍內的值一個一個的加:42: +40 +41 +42 { for(int temp_append = 0; temp_append + i * pow(10.0, temp_level - 1) <= n; temp_append++) { info[1][temp_level]++; info[2][temp_level] += (temp_append + i * pow(10.0, temp_level - 1)); } } else if((i + 1) * pow(10.0, temp_level - 1) <= n) { info[1][temp_level] += info[1][temp_level - 1]; info[2][temp_level] += info[2][temp_level - 1] + i * pow(10.0, temp_level - 1) * info[1][temp_level - 1]; } else {// 逐個加 for(int temp_n = i * pow(10.0, temp_level - 1); temp_n <= n; temp_n++) { for(int temp = temp_n; temp > 0; temp = temp / 10) { if(temp % 10 == 0 || temp % 10 == 1 || temp % 10 == 2 || temp % 10 == 9) { info[1][temp_level]++; info[2][temp_level] += temp_n; break; } } } } } } } // 將全部總和加起來 for(int temp_level = n_level; temp_level > 0; temp_level--) { info[1][0] += info[1][temp_level]; info[2][0] += info[2][temp_level]; } // 輸出總和結果 printf("符合條件的數字個數有: %d\n", info[1][0] - 1); printf("符合條件的數字的和是: %d\n", info[2][0]); printf("\n"); system("pause"); }