我怎样才能总结真正的大数字?
how can i sum realy big number?
所以你必须做:
11 = 1+1 = 2
3578=3+5+7+8=23=2+3=5
但问题是这个数字可能非常大(由10,000位数字组成)
但即使是最简单的入口也不起作用:
输入:11
输出:2798(它总是在变化,但仍然是一个 4 位数)
有人可以解释为什么会这样吗?
我如何总结一个非常大的数字的每个数字?
你得到这么大的数字是因为你的程序正在添加各种字符的 ASCII 值。
一些改进:
- 不要使用
"%s"
,使用"%<WIDTH>s"
,避免
- 使用
size_t
遍历数组,而不是 unsigned long long int
- 不要使用裸
return 0;
,而是使用 return EXIT_SUCCESS;
,它在头文件 stdlib.h
. 中定义
- 总是检查
scanf()
输入是否成功
- 不要检查
'\n'
,因为来自 scanf()
的字符串同时以 SPACES 和 NEWLINE 结尾。
- 添加
+1
到 NULL 终止字符的数组大小
size_t
使用 "%zu"
而不是 "%lld"
最终代码:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main(void) {
char buffer[10001] = {0};
if(scanf("%10000s", buffer) != 1)
{
perror("bad input");
return EXIT_FAILURE;
}
size_t result = 0;
for(size_t i = 0; buffer[i]; i++) {
if(isdigit(buffer[i])){
result += buffer[i] - '0';
}
else {
perror("only digits are valid");
return EXIT_FAILURE;
}
}
printf("%zu\n", result);
return EXIT_SUCCESS;
}
输出:
1112
5
不占内存就可以了
#include <ctype.h>
#include <stdio.h>
int main(void) {
int sum = 0;
for (;;) {
int ch = getchar();
if (!isdigit((unsigned char)ch)) break; // leave loop with ENTER, EOF, 'a', ...
sum += ch - '0';
}
printf("sum of digits is %d.\n", sum);
return 0;
}
编辑: 见 ideone
处的代码 运行
Wiki Digital Root 提供了获取最后一个数字的快捷方式。
- 验证您的输入字符串是否只有数字
- 求 ASCII 形式所有数字的总和
- 利用同余公式得出结果。
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define MAX_NUM_LEN 10000
int digitRoot (int n) {
if (0 == n) return 0;
return (0 == (n % 9)) ? 9 : (n % 9);
}
int main () {
char str_num [MAX_NUM_LEN];
printf ("Finding Digital Root\nEnter a number : ");
if (NULL == fgets (str_num, sizeof (str_num), stdin)) {
perror ("Reading input string");
return 2;
}
int slen = strlen (str_num);
// remove new line if found
if ('\n' == str_num[slen - 1]) str_num[--slen] = '[=10=]';
// validate input
int digitSum = 0;
for (int ni = 0; ni < slen; ++ni) {
if (!isdigit ((unsigned char) str_num[ni])) {
printf ("\nERROR: Invalid digit [%c]\n", str_num[ni]);
return 1;
}
digitSum += str_num[ni] - '0';
}
printf ("\nDigital Root is [%d]\n", digitRoot (digitSum));
return 0;
}
所以你必须做:
11 = 1+1 = 2
3578=3+5+7+8=23=2+3=5
但问题是这个数字可能非常大(由10,000位数字组成)
但即使是最简单的入口也不起作用:
输入:11
输出:2798(它总是在变化,但仍然是一个 4 位数)
有人可以解释为什么会这样吗? 我如何总结一个非常大的数字的每个数字?
你得到这么大的数字是因为你的程序正在添加各种字符的 ASCII 值。
一些改进:
- 不要使用
"%s"
,使用"%<WIDTH>s"
,避免 - 使用
size_t
遍历数组,而不是unsigned long long int
- 不要使用裸
return 0;
,而是使用return EXIT_SUCCESS;
,它在头文件stdlib.h
. 中定义
- 总是检查
scanf()
输入是否成功 - 不要检查
'\n'
,因为来自scanf()
的字符串同时以 SPACES 和 NEWLINE 结尾。 - 添加
+1
到 NULL 终止字符的数组大小 size_t
使用
"%zu"
而不是 "%lld"
最终代码:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main(void) {
char buffer[10001] = {0};
if(scanf("%10000s", buffer) != 1)
{
perror("bad input");
return EXIT_FAILURE;
}
size_t result = 0;
for(size_t i = 0; buffer[i]; i++) {
if(isdigit(buffer[i])){
result += buffer[i] - '0';
}
else {
perror("only digits are valid");
return EXIT_FAILURE;
}
}
printf("%zu\n", result);
return EXIT_SUCCESS;
}
输出:
1112
5
不占内存就可以了
#include <ctype.h>
#include <stdio.h>
int main(void) {
int sum = 0;
for (;;) {
int ch = getchar();
if (!isdigit((unsigned char)ch)) break; // leave loop with ENTER, EOF, 'a', ...
sum += ch - '0';
}
printf("sum of digits is %d.\n", sum);
return 0;
}
编辑: 见 ideone
处的代码 运行Wiki Digital Root 提供了获取最后一个数字的快捷方式。
- 验证您的输入字符串是否只有数字
- 求 ASCII 形式所有数字的总和
- 利用同余公式得出结果。
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define MAX_NUM_LEN 10000
int digitRoot (int n) {
if (0 == n) return 0;
return (0 == (n % 9)) ? 9 : (n % 9);
}
int main () {
char str_num [MAX_NUM_LEN];
printf ("Finding Digital Root\nEnter a number : ");
if (NULL == fgets (str_num, sizeof (str_num), stdin)) {
perror ("Reading input string");
return 2;
}
int slen = strlen (str_num);
// remove new line if found
if ('\n' == str_num[slen - 1]) str_num[--slen] = '[=10=]';
// validate input
int digitSum = 0;
for (int ni = 0; ni < slen; ++ni) {
if (!isdigit ((unsigned char) str_num[ni])) {
printf ("\nERROR: Invalid digit [%c]\n", str_num[ni]);
return 1;
}
digitSum += str_num[ni] - '0';
}
printf ("\nDigital Root is [%d]\n", digitRoot (digitSum));
return 0;
}