1、请定义一个宏,比较两个数a、b 的大小,不能使用大于、小于、if 语句
#define max(a,b) (((a-b)&(1<<31))?(b):(a))
2、如何输出源文件的标题和目前执行行的行数
1)__DATE__:当前文件的编译日期。与在time.h中定义的asctime函数返回的格式一样,即是Mmm DD yyyy(月、日、年);
2)__FILE__:当前源文件的名称。字符串格式(const char);
3)__LINE__:当前代码在源文件中的行数。一个整数。
4)__TIME__:当前源文件的编译时间。一个字符串(hh:mm:ss);
5)__TIMESTAMP__:当前源文件最后编译的日期时间。一个字符串(格式为:Ddd Mmm Date hh:mm:ss yyyy,即星期几、月、日、时、分、秒、年);
其中通过宏__FILE__和__LIEN__可以快速的定位程序出错的文件和位置,并通过Email的形式发送给开发人员,从而进行快速维护。
3、两个数相乘,小数点后位数没有限制,请写一个高精度算法
纪录小数点在a,b中的位置
去掉a,b中的小数点
计算c=a*b; (同整数的大数相乘算法)
加上小数点
4、有A、B、C、D 四个人,要在夜里过一座桥。他们通过这座桥分别需要耗时1、2、5、10 分钟,只有一支手电,并且同时最多只能两个人一起过桥。
请问,如何安排,能够在17 分钟内这四个人都过桥?
去:AB---------------------------------2
回:A-----------------------------------1
去:CD---------------------------------10
回:B------------------------------------2
去:AB----------------------------------2
5、C++将父类的析构函数定义为虚函数,下列正确的是哪个?
A、释放父类指针时能正确释放子类对象
B、释放子类指针时能正确释放父类对象
C、这样做是错误的
D、以上全错
C++的多态肯定是使用父类的指针指向子类的对象,所以肯定是释放子类的对象,如果不使用虚函数的话,父类的指针就只能够释放父类的对象。
6、typedef char *String_t; 和 #define String_d char * 这两句在使用上有什么区别?
答:typedef char *String_t 定义了一个新的类型别名,有类型检查。而#define String_d char * 只是做了个简单的替换,无类型检查,前者在编译的时候处理,后者在预编译的时候处理。
7、给定一个字符串,求出其最长的重复子串
#include<iostream>
using namespace std;
int main()
{
char str[]="huahuahuahualkjljlkdf";
int len=strlen(str);
int i;
int j;
int k=0;
int first;
int max=0;
for (i=1;i<len;i++)
{
for (j=0;j<i;j++)
{
if (str[j]==str[i+k])
{
k++;
}
else
{
k=0;
}
if (k>max)
{
max=k;
first=j+1-max;
}
}
k=0;
}
cout<<"子串长度:"<<max<<endl;
for (i=first;i<(first+max);i++)
{
cout<<str[i];
}
cout<<endl;
return 0;
}
8、给定一个数组a[N],我们希望构造数组b[N],其中b[i]=a[0]*a[1]*...*a[N-1]/a[i]。在构造过程:
不允许使用除法;
要求O(1)空间复杂度和O(n)时间复杂度;
除遍历计数器与a[N] b[N]外,不可使用新的变量(包括栈临时变量、对空间和全局静态变量等);
请用程序实现并简单描述。
解答:
迭代计算:
i前的部分:
b[0]=1
b[1]=a[0]=b[0]*a[0]
b[2]=a[0]*a[1]=b[1]*a[1];
b[3]=a[0]*a[1]*a[2]=b[2]*a[2]
..........
b[N-2]=b[N-3]*a[N-3]
i后半部分
b[0]=a[N-1]
b[N-2]=b[N-2]*a[N-1]=b[N-2]*b[0] b[0]=b[0]*a[N-2]
b[N-3]=b[N-3]*b[0]
......
代码:
#include<iostream>
using namespace std;
#define N 10
int main()
{
int a[N];
int b[N];
int i;
cout<<"请输入"<<N<<"个数字"<<endl;
for (i=0;i<N;i++)
{
cin>>a[i];
}
b[0]=1;
for (i=1;i<N;i++)
{
b[i] =b[i-1]*a[i-1];
}
b[0]=a[N-1];
for (i=N-2;i>=1;i--)
{
b[i] *= b[0];
b[0] *= a[i];
}
for (i=0;i<N;i++)
{
cout<<b[i]<<" ";
}
cout<<endl;
return 0;
}