解题思路:
这道题求阶乘和数不难,但是要对结果按字典序排列需要用到一点小技巧。阶乘和数就是把数字拆分成每一位后对应的阶乘等于它本身,只需要先把数字挨个拆分,然后对拆分后的数字挨个求阶乘,最后对每一个阶乘求和看是否等于原来的数它本身。以上就是阶乘和数的求解思路,怎么样,不难吧。而现在需要对输出的结果按字典序排列,而刚好C语言的string.h库文件中有strcmp函数,这个函数的作用是比较字符串的大小,如果参数的前者大于后者,那么返回值大于0,如果小于,返回值就小于0,如果相等,返回值就等于0。那么,用这个函数有什么意义呢,只需要把数字转换成字符串,然后将其存入数组中,最后对数组元素挨个比较,比如1和122这两个字符串,在对其比较时很明显122是大于1的,所以只需要按照从小到大或从大到小的规则交换这两个数就好,当字符串的第一个位置不相同时,他会直接按照ASCII码来比较,如果两个字符串中的元素部分相同,那么就会一直比较到第一次出现不同的地方否则就会直到字符串末尾。
注意事项:
①阶乘和数是数字拆分到每一位的阶乘之和等于它本身。
②strcmp函数是比较字符串的,如果前者大于后者返回值大于0,小于返回值小于0,相等返回值等于0
参考代码:
#include <stdio.h> #include <math.h> #include <string.h> int fact(int n) // 递归求阶乘 { return n == 1 || n == 0 ? 1 : n * fact(n - 1); } void bubble_sort(char num[][6], int n) // 冒泡排序 { for (int i = 0; i < n - 1; i++) { for (int j = 0; j < n - i - 1; j++) { if (strcmp(num[j], num[j + 1]) > 0) // 比较数组的前后两项,前者大于后者返回正数,小于返回负数,等于返回0 { char temp[6]; // 定义一个容器用于交换 strcpy(temp, num[j]); // 把num[j]的值存到容器中 strcpy(num[j], num[j + 1]); // 把num[j+1]的值存到num[j]中 strcpy(num[j + 1], temp); // 把之前容器中的值(num[j]的原值)赋值给num[j+1]中 } } } } int fact_num() // 阶乘和数的算法函数 { char num[100][6]; // 定义一个二维数组,表示最多存储100个字符串,每个字符串最多存储6个字符 int n = 0; for (int i = 1; i <= 100000; i++) { int t = i, count = 0, sum = 0; // 定义一个中间 while (t > 0) // 计算数字的位数 { t /= 10; count++; // 统计数字的位数 } for (int j = 0; j < count; j++) // 分离数字的每一位 { int m = (int)(i / pow(10, j)) % 10; // 分离数字的每一项用来求它的阶乘 sum += fact(m); // 计算数字的每一项的阶乘之和 } if (sum == i) // 判断阶乘之和是否等于它本身 { // printf("%d ", i); sprintf(num[n], "%d", i); // 把数字转换成字符串 n++; // 数组下标从零开始,依次存入字符串 } } bubble_sort(num, n); for (int i = 0; i < n; i++) { printf("%s ", num[i]); // 输出排序后的字符串 } } int main() { fact_num(); }
0.0分
1 人评分
C语言程序设计教程(第三版)课后习题6.1 (C语言代码)浏览:650 |
简单的a+b (C语言代码)浏览:689 |
九宫重排 (C++代码)浏览:1410 |
C语言程序设计教程(第三版)课后习题5.7 (C语言代码)浏览:1260 |
C语言程序设计教程(第三版)课后习题10.3 (C语言代码)浏览:565 |
剪刀石头布 (C语言代码)浏览:802 |
母牛的故事 (C语言代码)浏览:594 |
1054题解浏览:516 |
C语言程序设计教程(第三版)课后习题9.8 (C语言代码)浏览:672 |
C二级辅导-求偶数和 (C语言代码)浏览:707 |