问题:
一个特别大的数除以23求余数用C语言应该怎么算啊?比如23232323232323232323232323232323232323232323232323232323233除以23,怎么算余数?
数据类型在计算机的存储是有大小限制的,所以才出现了大数求余这种问题,相对应的,我们的钱存储在银行也不可能用数字来表示,毕竟整个中国人的钱,远远超过了最大的数据类型的大小。
计算计算机最大数据类型的值:
#include "stdio.h"
int main()
{
printf("0~%lu\n",(1UL << sizeof(unsigned long long int)*8) -1);
return 0;
}
输出
0~18446744073709551615
我们所说的大数是数字大于最大存储的变量,一个unsigned long long int
存储最大的自然数是18446744073709551615
,如果自然数大于这个数,就会溢出了。
有事说事,这个题目涉及数学知识,但是我觉得学好数学也是学好计算机的基础。
—— 有个知乎的同学进行了论证
对于取模23,只需要
1.声明结果变量,假设它是ans
, 令ans = 0
作为起始条件。
2.取走最高位数字,假设它是t
,令 ans = ans +t
.
3.如果还有数字没有被取走,则令 ans = (10*ans )%23
,并返回第二步。
最终得到的 ans
就是答案
—— 代码如下
#include "stdio.h"
int main()
{
int c;
int ans = 0;
/*如果没有按下Ctrl+C 就一直在while循环里面判断*/
while ((c = getchar()) != EOF) {
if (c == '\n') {/*输出结果*/
printf("%d\n", ans);
ans = 0;
} else {/*递归计算*/
// c in '0'...'9'
c -= '0';
ans = ans +c;
ans = (ans*10)%3;
}
}
return 0;
}
程序输出结果
weiqifa@bsp-ubuntu1804:~/c/dashuqiuyu$ gcc 1.c && ./a.out
0
0
1
1
2
2
3
0
12312312312
0
3235
1
23
2
5
2
156151859198153151561561561561561
0
数学论证过程