分类: C/C++
2011-10-15 00:06:58
闲来无事总结3个我认为比较好的算法,很简单,但有趣。我们应该学会欣赏简单的东西,拒绝钻进复杂的东西里面,比如股市...
这三个算法分别为大数乘法,求交集算法,将一个数拆成连续整数和算法以及8位倒置算法。这些算法都非出自本人,但是本人实现了一个。
1.大数乘法:这个算法很著名,它可以突破计算机的限制从而计算一些很大的数,它的效率是重要的,但本文仅仅从逻辑角度来分析,先不分析时间空间复杂性。
我们人在计算乘法的时候用的是竖式,然后把每一行的结果加起来(位相错),最后得到答案,但是在计算机中,我见过很多算法是保留一个变量作为进位,最后一古脑把进位直接加到和里面,看惯了那种方法,看看下面方法如何,它可是完全和我们人的方法是一致的 :(作者源代码是错误,以下是我改正后的)
void main()
{
string num1,num2;//被乘数和乘数,考虑到大整数,用string装入
cout<<"please input number1 and number2:"< cin>>num1>>num2; const char *p1=num1.c_str(); //转为char * const char *p2=num2.c_str(); int length=strlen(p1)+strlen(p2); char *p=new char [length]; //结果放在字符数组中 int i,j; for(i=0;i { p[i]='0'; //初始化结果数组,开始全为'0',对应数字0 } p[i]='/0'; int carry=0; //进位初时设为0 for(i=strlen(p1)-1;i>=0;--i) { carry=0;//每一行都将进位清0,绝对不影响下一循环 for(j=strlen(p2)-1;j>=0;--j) { carry+=(p1[i]-'0')*(p2[j]-'0')+(p[i+j+1]-'0'); p[i+j+1]=carry%10+'0'; carry/=10; } p[i+j+1]=carry%10+'0'; } int b =0; for(i=0;i { if(p[i]=='0'&&b == 0) { continue; } b = 1; cout<
} cout< delete [] p; } 2.求交集算法: int main() { int a[]={4,6,7,8,9,10,11,15}; int b[]={2,3,4,6,7,9,10,11,15,20}; int p1[16]={0};//把p1分配足够大即可,p1的长度是两个数组中最大的数加1,小小损失空间效率,如果有很大数的话 int i = 0;
这个算法太老了,我发现很多时候都是用直接一个一个比较的办法求解,当然可以用哈希表,不过有点高射炮打蚊子的味道,于是我建议了一种算法(原创),实质上也是一个一个比较,但简捷了很多: