Number lengths(数字长度)

本篇介绍了一种特殊的问题:对于非常大的整数N,如何计算N的阶乘(N!)的位数,而不是直接计算阶乘的值。通过输入一个范围内的整数N,程序将返回对应的N!的位数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【问题描述】
N! (N的阶乘)当N的值很大时能使人很不愉快并且难以计算出它的值。所以代替计算N!,我想要知道它有多少位数。(记住 N! = N * (N - 1) * (N - 2) * ... * 2 * 1)。

【输入】
输入的每一行都有一个N且0<N<1000000(十万)。文件结束输入即停止。

【输出】
对于每一个N值,打印出N!的位数。

【样例输入】
1
3
32000
1000000

【样例输出】
1
1
130271
5565709

= = || 其实完全不用翻的说……权当练习打字罢。
``` #include <stdio.h> #include <stdlib.h> #include <string.h> // 定义扑克牌与其数值的映射关系结构体 typedef struct { char card[3]; // 扑克牌面(考虑到"10"有两个字符,所以数组大小为3) int value; // 对应的数值 } CardMap; // 扑克牌面到数值的映射表 CardMap card_to_number[] = { {"3", 3}, {"4", 4}, {"5", 5}, {"6", 6}, {"7", 7}, {"8", 8}, {"9", 9}, {"10", 10}, {"J", 11}, {"Q", 12}, {"K", 13}, {"A", 14}, {"2", 16} }; int card_map_size = sizeof(card_to_number) / sizeof(card_to_number[0]); // 用于比较扑克牌的函数 int compare_cards(const void *a, const void *b) { const char *card1 = *(const char **)a; const char *card2 = *(const char **)b; int value1 = 0, value2 = 0; for (int i = 0; i < card_map_size; ++i) { if (strcmp(card_to_number[i].card, card1) == 0) { value1 = card_to_number[i].value; } if (strcmp(card_to_number[i].card, card2) == 0) { value2 = card_to_number[i].value; } } return value1 - value2; } int main() { char input[100]; // 存储输入字符串 char *cards[20]; // 存储分割后的扑克牌字符串指针 int count = 0; // 扑克牌数量 // 读取一行输入 fgets(input, sizeof(input), stdin); input[strcspn(input, "\n")] = 0; // 移除换行符 // 分割输入字符串 char *token = strtok(input, " "); while (token != NULL) { cards[count++] = token; token = strtok(NULL, " "); } // 对扑克牌进行排序 qsort(cards, count, sizeof(char *), compare_cards); // 动态分配二维数组来存储可能的顺子序列 char **straights[count]; int lengths[count]; // 存储每个顺子的长度 for (int i = 0; i < count; ++i) { straights[i] = (char **)malloc(sizeof(char) * count); straights[i][0] = cards[i]; lengths[i] = 1; } int num_straights = count; // 生成顺子序列 for (int i = 0; i < count; ++i) { for (int j = 0; j < num_straights; ++j) { if (compare_cards(&cards[i], &straights[j][lengths[j] - 1]) == 1) { straights[j][lengths[j]++] = cards[i]; break; } } } // 输出长度至少为5的顺子序列 int found = 0; for (int i = 0; i < num_straights; ++i) { if (lengths[i] >= 5) { found = 1; for (int j = 0; j < lengths[i]; ++j) { printf("%s ", straights[i][j]); } printf("\n"); } free(straights[i]); } if (!found) { printf("No\n"); } return 0; }```输入:2 9 J 10 3 4 K A 7 Q A 5 6
最新发布
03-24
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值