使用“按引用调用”计算数字的幂 #包括 无效幂(int*x,int*y); int main() { int m,n; printf(“输入数字和功率:-”); scanf(“%d%d”,&m,&n); 电源(m&n); } 无效幂(int*x,int*y) { int i,结果=1; 如果(*y==0) printf(“结果=1”); 其他的 { 对于(i=0;i
您明显有一个溢出,您的使用“按引用调用”计算数字的幂 #包括 无效幂(int*x,int*y); int main() { int m,n; printf(“输入数字和功率:-”); scanf(“%d%d”,&m,&n); 电源(m&n); } 无效幂(int*x,int*y) { int i,结果=1; 如果(*y==0) printf(“结果=1”); 其他的 { 对于(i=0;i,c,pass-by-reference,C,Pass By Reference,您明显有一个溢出,您的int可能位于32位 使用long: #include <stdio.h> void power(int *x,int *y); int main() { int m,n; printf("Enter the number and power :-"); scanf("%d%d",&m,&n); power(&m,&n); } void
int
可能位于32位
使用long
:
#include <stdio.h>
void power(int *x,int *y);
int main()
{
int m,n;
printf("Enter the number and power :-");
scanf("%d%d",&m,&n);
power(&m,&n);
}
void power(int* x, int* y)
{
int i,result=1;
if(*y==0)
printf("The result = 1");
else
{
for(i=0; i<*y; i++)
{
result *= (*x);
}
printf("The result of %d^%d = %d",*x,*y,result);
}
}
为了确保使用64b int,您可以使用
int64\t
您明显有溢出,可能是您的int
位于32位
使用long
:
#include <stdio.h>
void power(int *x,int *y);
int main()
{
int m,n;
printf("Enter the number and power :-");
scanf("%d%d",&m,&n);
power(&m,&n);
}
void power(int* x, int* y)
{
int i,result=1;
if(*y==0)
printf("The result = 1");
else
{
for(i=0; i<*y; i++)
{
result *= (*x);
}
printf("The result of %d^%d = %d",*x,*y,result);
}
}
为了确保使用64b int,您可以使用
int64\t
您正在使用int
作为结果,但它不适合。您需要使用long
。int
的大小为32位,最大有符号值为2147483647。您正在使用int
作为结果,但它不适合。您需要使用int>long
。int
的大小为32位,最大有符号值为2147483647。给定的程序使用4字节整数,该整数能够保存-2147483648到2147483647之间的值,但10^10太大,无法保存
选择合适的类型(例如long
)来保存如此大的结果将很容易解决您的问题(注意注释作为对代码的解释):
也可以工作。给定的程序使用4字节整数,该整数能够保存-2147483648到2147483647之间的值,但10^10太大,无法保存 选择合适的类型(例如
long
)来保存如此大的结果将很容易解决您的问题(注意注释作为对代码的解释):
也可以使用。您是否尝试过在调试器中逐行运行代码,同时监视所有变量的值?如果没有,则您可能希望阅读以下内容:您可能还希望阅读以下内容:如果出现溢出,请将
int
替换为long
或int64\t
,以确保获得正确的结果10^10不适合32位int
变量。忽略溢出的UB…(10*10*10*10*10*10*10)%(2^32)=1410065408
=>10^10=2*4294967296+1410065408
在C中,没有通过引用调用这样的事情。在监视所有变量的值时,您是否尝试过在调试器中逐行运行代码?如果没有,那么您可能需要阅读以下内容:您可能还需要阅读以下内容:您有一个溢出,请将int
替换为long-long
或int64\t
以确保获得正确的结果10^10不适合32位int
变量。忽略溢出的UB…(10*10*10*10*10*10*10)%(2^32)=1410065408
=>10^10=2*4294967296+1410065408
在C中,没有引用调用。是的,但是long
也可能是32位:使用long
@WeatherVane是正确的。例如,在Microsoft Windows平台上,long
是32位,而不是64.32位是最小保证大小oflong
。谢谢!我希望它是一辆930!这是一辆1986年的卡雷拉,3.2升。@rallen911啊,那是一辆涡轮增压车;-)是的,但是long
也可能是32位:使用long
@WeatherVane是正确的。例如,在Microsoft Windows平台上,long
是32位,而不是64.32位是long
的最小保证大小。谢谢!我希望它是930!这是一辆1986年的卡雷拉,配备了3.2L。@rallen911啊,那是一款turbo外观-)我想你不需要使用long
来传递基函数和幂函数。在这里使用整数可以节省内存。@RohanBari我承认我做了一个懒惰的全局更改,无论如何,使用大数字的运算基函数可能需要一个long而不会产生溢出,因为功率足够小,为什么不使用基函数0和一个幂函数呢我想你不需要使用long-long
来传递基数和幂。在这里使用整数可以节省内存。@RohanBari我承认我做了一个懒惰的全局更改,不管怎样,使用大数字的OP基数可能需要一个long-long而不会产生溢出,因为功率足够小,为什么不使用base 0和电源需要较长的时间(太长?:-)
pi@raspberrypi:/tmp $ gcc -Wall p.c
pi@raspberrypi:/tmp $ ./a.out
Enter the number and power :-10 10
The result of 10^10 = 10000000000pi@raspberrypi:/tmp $
#include <stdio.h>
// The function signature
void power(int *x, int *y);
int main(void) {
int bs, pw;
printf("Enter the value of base and power: ");
// Verifying the inputs
if (scanf("%d%d", &bs, &pw) != 2)
// If the values were incorrectly entered, then it returns
// with an error code without further actions
return 1;
power(&bs, &pw);
return 0;
}
// The function definition
void power(int *x, int *y) {
long long result = 1;
// Dereferencing and using assignment operator for self-multiplication with
// the dereferenced 'x'
for (int i = 0; i < *y; i++)
result *= *x;
printf("Results: %lld\n", result);
}
Enter the value of base and power: 10 10
Results: 10000000000