在 C 中寻找合适的数据类型来处理两个数学表达式
我必须用 C 编程语言计算以下两个数学公式。
- result = 48^108 // 108 应该是 103
- result%143 =9
为了计算这两个方程,我需要一些范围足够大的数据类型。
我知道等式2的最终结果是9。但是,在使用了几种数据类型后我没有得到这个答案。
这是我的一些实现。
1. #include <stdio.h>
#include<math.h>
int main()
{
unsigned int a1=48,a2=103,a3, a4;
a3= pow(48,103);
printf("a3=%u",a3);
a4= a3 % 143;
printf("\n a4=%u",a4);
return 0;
}
Answer That I got:
warning: overflow in conversion from ‘double’ to ‘unsigned int’ changes value from ‘1.4717954286441339e+173’ to ‘4294967295’ [-Woverflow]
15 | a3= pow(48,103);
| ^~~
a3=4294967295
a4=47
2. int main()
{
unsigned long a1=48,a2=103,a3, a4;
a3= pow(48,103);
printf("a3=%lu",a3);
a4= a3 % 143;
printf("\n a4=%lu",a4);
return 0;
}
warning: overflow in conversion from ‘double’ to ‘long unsigned int’ changes value from ‘1.4717954286441339e+173’ to ‘18446744073709551615’ [-Woverflow]
15 | 15 a3=战俘(48,103); | ^~~ a3=18446744073709551615 a4=16
3. #include <stdio.h>
#include<math.h>
int main()
{
long double a1=48,a2=103,a3, a4;
a3= pow(48,103);
printf("a3=%LF",a3);
a4= fmod(a3,143);
printf("\n a4=%LF",a4);
return 0;
}
a3=14717954286441339069523166872383625441782620208328548964529799788351917114148648022136340 9432872885235091123842885421688012169987663834748443552551569845821059256315786821632.000000
a4=46.000000
我应该使用哪种数据类型来处理这种情况?
我对方程 1 的错误方程表示歉意。它是 103,而不是 108。如果我使用 103,答案是 9。
感谢您的所有评论和过程。
I have to calculate following two mathematical formula in C programming language.
- result = 48^108 // 108 should be 103
- result%143 =9
To calculate this two equation I need some data type whose range is large enough.
I know the end result of equation 2 is 9. However, I did not get this answer after using several datatypes.
Here are some of my implementations.
1. #include <stdio.h>
#include<math.h>
int main()
{
unsigned int a1=48,a2=103,a3, a4;
a3= pow(48,103);
printf("a3=%u",a3);
a4= a3 % 143;
printf("\n a4=%u",a4);
return 0;
}
Answer That I got:
warning: overflow in conversion from ‘double’ to ‘unsigned int’ changes value from ‘1.4717954286441339e+173’ to ‘4294967295’ [-Woverflow]
15 | a3= pow(48,103);
| ^~~
a3=4294967295
a4=47
2. int main()
{
unsigned long a1=48,a2=103,a3, a4;
a3= pow(48,103);
printf("a3=%lu",a3);
a4= a3 % 143;
printf("\n a4=%lu",a4);
return 0;
}
warning: overflow in conversion from ‘double’ to ‘long unsigned int’ changes value from ‘1.4717954286441339e+173’ to ‘18446744073709551615’ [-Woverflow]
15 | a3= pow(48,103);
| ^~~
a3=18446744073709551615
a4=16
3. #include <stdio.h>
#include<math.h>
int main()
{
long double a1=48,a2=103,a3, a4;
a3= pow(48,103);
printf("a3=%LF",a3);
a4= fmod(a3,143);
printf("\n a4=%LF",a4);
return 0;
}
a3=147179542864413390695231668723836254417826202083285489645297997883519171141486480221363409432872885235091123842885421688012169987663834748443552551569845821059256315786821632.000000
a4=46.000000
Which data type should I use to handle the situation?
I apologies for my wrong equation on equation 1. It is 103 not 108. and if I use 103 the answer is 9.
Thank you for all your comments and process.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
通过将指数分解为 2 的幂并保持所有中间值减少模 143,可以轻松计算出 48103 模 143 的余数,如以下代码所示。 (这不一定是使用最少算术运算的方法。)
The remainder of 48103 modulo 143 is easily calculated by decomposing the exponent into powers of two and keeping all the intermediate values reduced modulo 143, as illustrated in the following code. (This is not necessarily the method that uses the fewest arithmetic operations.)
C语言中没有这样的数据类型来存储如此庞大的数量。您可以使用可以直接给出方程式答案的公式。
There is no such datatype in C language to store such a large number. You can use a formula that can directly give the answer to your equation.