解题计算思路:数组
实现代码: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"); }