@TOC
输入参数的检查、处理错误和异常方式、命名方式
功能测试、边界测试、负面测试
实现函数:double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。
我的想法就是一直循环相乘 = =
切记要考虑exponent小于1的情况啊!
那exponent=负数base为0呢?
bool g_InvalidInput = false;
double Power(double base, int exponent)
{
g_InvalidInput = false;
if(equal(base, 0.0) && exponent<0)
{
g_InvalidInput = true;
return 0.0;
}
unsigned int absExponent = (unsigned int)(exponent);
if(exponent<0) absExponent = (unsigned int)(-exponent);
double result = PowerWithUnsignedExponent(base, absExponent);
if(exponent<0) result = 1.0/result;
return result;
}
double PowerWithUnsignedExponent(double base, unsigned int exponent)
{
double result = 1.0;
for(int i=1; i<=exponent; i++)
result * = base;
return result;
}
来了,高效的方法来了!
if(exponent ==0)
return 1;
if(exponent==1)
return base;
double result = PowerWithUnsignedEponent(base, exponent>>1);
result * = result;
if(exponent & ix1 == 1) result*=base;
return result;
用右移代替除以2,与代替检验奇偶,提高运算的效率
输入数字n,按顺序打印出1到最大的n位十进制数。比如输入3,则打印出1、2、3直到最大的3位数999;
大数怎么办??超过int、long long会溢出
利用字符串表示。定义一个长度为n+1的字符串,不足n位时前面补0。模拟整数加法
void Print1ToMaxOfDigits(int n)
{
if(n<=0) return;
char *number = new char[n+1];
memset(number, '0', n);
number[n]='\0';
while(!Increment(number))
{
PrintNumber(number);
}
delete [] number;
}
上述代码先初始化一个长度为n+1的字符串,注意是n+1
bool Increment(char *number)
{
bool isOverflow = false;
int nTakeOver = 0;
int nLength = strlen(number);
for(int i=nLength-1; i>=0; i--)
{
int nSum = number[i] - '0' + nTakeOver;
if(i == nLength -1)
{
nSum ++;
}
if(nSum > 10)
{
if(i==0) isOverflow = true;
else
{
nSum -= 10;
nTakeOver = 1;
number[i] = '0' + nSum;
}
}
else
{
number[i] = nSum + '0';
break;
}
}
return isOverflow;
}
要注意判断是不是会产生进位
void PrintNumber(char * number)
{
bool isBeginning0 = true;
int nLength = strlen(number);
for(int i=0; i
print的时候要注意其书写习惯。
memset是计算机中C/C++语言初始化函数。作用是将某一块内存中的内容全部设置为指定的值, 这个函数通常为新申请的内存做初始化工作
n位所有的十进制数其实是n个从0到9的全排列,打印的时候,将高位的0不要打印出来即可。
void Print1ToMaxOfNDigitsRecursively(char *number, int length, int index)
{
if(index == length -1)
{
PrintNumber(number);
return;
}
for(int i=0; i<10; i++)
{
number[index + 1] = i+'0';
Print1ToMaxOfNDigitsRecursively(number, length, index+1);
}
}
void Print1ToMax(int n)
{
if(n<=0) return;
char *number = new char[n+1];
number[n] = '\0';
for(int i=0; i<10;i++)
{
number[0] = i+'0';
Print1ToMaxOfNDigitsRecursively(number, n, 0);
}
delete [] number;
}