第十届蓝桥杯大赛-特别数的和-C++
解法一(暴力获取):
#include<stdio.h> #include<stdlib.h> int main(void) { int n; int times = 0; int num = 0; printf("输入整数n: "); scanf("%d", &n); for(int i = 0; i <= n; i++) { for(int temp = i; temp > 0; temp = temp / 10) { if(temp % 10 == 0 || temp % 10 == 1 || temp % 10 == 2 || temp % 10 == 9) { times++; num += i; break; } } } printf("%d\n", times); printf("%d\n", num); printf("\n"); system("pause"); }
解法二:
解题计算思路
实现代码:
#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 + ... 的值 { int sum = 0; for(int i = 1; i < pow(10.0, level - 1); i++) { sum += i; } return sum; } int main(void) { long long **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 = (long long **)malloc(3 * sizeof(long long *)); for(int i = 0; i <= 2; i++) { info[i] = (long long *)malloc((n_level + 1) * sizeof(long long)); // 初始化其值为 0 memset(info[i], 0, (n_level + 1) * sizeof(long long)); } // 数值累计 for(int temp_level = 1; temp_level <= n_level; temp_level++) { sum = get_sum(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)) {// 符合条件时,将该位所有数值都加起来 // 将数值拆开 先计算最高位数上的值的和,再计算除了最高位数上其他的数值和 info[1][temp_level] += pow(10.0, temp_level - 1); info[2][temp_level] += sum + i * pow(10.0, temp_level - 1) * pow(10.0, temp_level - 1); } else if((i + 1) * pow(10.0, temp_level - 1) < n) { if(temp_level == 2) { 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 { info[1][temp_level] += info[1][temp_level - 1] + pow(10.0, temp_level - 2); info[2][temp_level] += info[2][temp_level - 1] + i * pow(10.0, temp_level - 1) * (info[1][temp_level - 1] + pow(10.0, temp_level - 2)) + get_sum(temp_level - 1); } } else {// 逐个加 for(int temp_n = i * pow(10.0, temp_level - 1); temp_n <= n && temp_n < (i + 1) * pow(10.0, temp_level - 1); 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"); }
作者:Jony·Li
来源:https://www.cnblogs.com/lzn-2018/
版权声明:本文为博主原创文章,转载请附上博文链接!