题目一:对于一个整数N(512 <= N <= 1024),计算2的N次方并在屏幕显示十进制结果。
输入:输入一个整数N(512 <= N <= 1024) 输出:2的N次方的十进制结果
算法思路:首先这道题是一种大数问题,很大的数字我们不可以用int来保存,所以我们可以使用数组或者字符串来保存。
举个栗子:输入7,输出128;设计字符串使得输出为128
#include<iostream>
using namespace std;
#include<string>
string GetNval(int N)
{
string result("1");
for(int i = 0;i<N;i++)
{
int tmp,pre = 0;//写在内循环
for(int index = (int)result.size()-1;index>=0;--index)
{
tmp = (result[index]-'0')*2 + pre;
pre = tmp/10;
result[index] = tmp%10+'0';
}
if(pre)//注意考虑进位
{
result.insert(result.begin(),pre+'0');
}
}
return result;
}
int main()
{
int N = 0;
cin>>N;
if(N == 0)
cout<<1<<endl;
else
cout<<GetNval(N)<<endl;
return 0;
}
题目二:打印从1到最大的n位数
输入:3
输出:1、2、3 ... 999
算法思路:很明显这也是大数问题,我们需要字符串或者数组来保存数字的每一位。在字符串上模拟实现数字的加法的解法。
可以写出以下大体流程
int main()
{
int n = 0;
cin >> n;
char *number = new char[n + 1];
memset(number, '0', n);//字符串初始化为字符0
number[n] = '\0';//控制字符串结束
while (!Increment(number))//实现在字符串上加1
{
PrintNumber(number);//打印字符串
}
return 0;
}
在设计实现字符串上加1和打印这里都有坑!!! 以及在Increment函数内部实现该数字是否该打印!!!
确定数字是否该打印和最终范围:(1)知道数字不超过最大的n位数999...99就打印,但是我们需要知道最大的n位数是多少那就需要时间复杂度O(n)来找出这个数字。(2)观察这些最大的数字,我们给他加1,最终在字符串下标为0的地方产生进位那么就是到了最大的n位数,所以我们可以用O(1)的时间复杂度找出。
bool Increment(char *number)
{
bool isOverFlow = false;
int length = strlen(number);
int pre = 0;//进位
for (int i = length - 1; i >= 0; --i)
{
int bitval = number[i] - '0' + pre;
if (i == length - 1)//只在个位加1
++bitval;
if (bitval >= 10)//判断个位数字加1之后是否有进位
{
if (i == 0)//判断该进位是否在下标为0的位置产生
{
isOverFlow = true;
break;
}
else//否则,修改进位标志
{
bitval = bitval - 10;
number[i] = bitval + '0';
pre = 1;
}
}
else
{
number[i] = bitval + '0';
break;
}
}
return isOverFlow;
}
打印:因为我们需要打印一个数字,它前面保存的都是字符0,所以我们需要把前面的0都筛选掉,从第一个非0的位置开始打印。
void PrintNumber(char *number)
{
bool isPrint = true;
for (int i = 0; i < strlen(number); ++i)
{
if (isPrint && number[i]!= '0')
isPrint = false;
if (!isPrint)
cout << number[i];
}
cout << endl;
}