C程序在没有pow()的情况下找到整数m的n次幂。
输入:
m=3 n=2
output:
9.000
验证程序的测试按预期工作!
Input : -2 3 output : -8.000
Input : 2 -3 output : 0.125000
Input : -2 -3 output : -0.125000
但是我没有得到所需的输出
void main()
{
signed int m, n;
int i;
float p;
clrscr();
printf("Enter the number and its power (exponent)\n");
scanf("%d%d",&m,&n);
p=1;
if (n==0)
{
printf("%d raised to %d is: %f",m,n,p);
}
if (n>0)
{
for( i = 0 ; i < n ; i++ )
p*=m;
if(m>0)
printf("%d raised to %d is: %f",m,n,p);
if(m<0)
printf("%d raised to %d is: %f",m,n,-p);
}
if (n<0)
{
n=-n;
for( i = 0 ; i < n ; i++ )
p*=m;
if(m>0)
printf("%d raised to %d is: %f",m,-n,1/p);
if(m<0)
printf("%d raised to %d is: %f",m,-n,-(1/p));
}
getch();
}
您可以为测试用例提供正确的程序吗?
我无法声明signed float
因为它发出错误。
答案 0 :(得分:4)
否定代码不正确。当基础m
为负数时,您不能盲目地否定结果。
,但
。此外,如果
m
为零,则不打印任何内容!
默认情况下会对int
进行签名,因此signed int
是噪音。 float
也已签名;但是你可以使用double
来获得更高的精度。 main
的返回值应为int
。
因此,固定代码将是(根据您的喜好添加非标准clrscr
和getch
);
#include <stdio.h>
#include <stdlib.h>
int main()
{
int m, n, i;
double p = 1.0;
printf("Enter the number and its power (exponent)\n");
scanf("%d%d",&m,&n);
if (n==0) {
printf("%d raised to %d is: %f",m,n,p);
}
else if (n > 0) {
for(i = 0; i < n; i++)
p*=m;
printf("%d raised to %d is: %f",m,n,p);
}
else { // n < 0
n = -n;
for (i = 0 ; i < n ; i++)
p*=m;
printf("%d raised to %d is: %f", m, -n, 1 / p);
}
}
答案 1 :(得分:0)
尝试更改:
void main()
{
signed int m, n;
int i;
float p;
printf("Enter the number and its power (exponent)\n");
scanf("%d%d",&m,&n);
p=1;
if (n==0)
{
printf("%d raised to %d is: %f",m,n,p);
}
if (n>0)
{
for( i = 0 ; i < n ; i++ )
p*=m;
printf("%d raised to %d is: %f",m,n,p);
}
if (n<0)
{
n=-n;
for( i = 0 ; i < n ; i++ ){
p*=m;
}
printf("%d raised to %d is: %f",m,-n,1/p);
}
}
答案 2 :(得分:0)
@Antti Haapala很好地识别了OP代码中的错误。
作为与pow()
替代相关的面试问题,当然采用log2 N步骤(如下所示)的解决方案优于采用N步(OP方法)的方法,其中N是指数。
关键是在每次迭代时对基础进行平方 使用log2 N步而不是N会导致最低有效数字中的错误减少。
使用负指数,简单地反转基数。
使用double
提供至少10个,通常为17个十进制数字的精度。
double powdii(int x, int y) {
double z = 1.0;
double base = x;
if (y < 0) {
base = 1.0 / base;
}
while (y != 0.0) {
if (y % 2) {
z *= base;
}
y /= 2;
base *= base;
}
return z;
}