分治与递归算法

版权声明:本文章未经博主允许不得转载 https://blog.csdn.net/qq_42217376/article/details/88989864

题目一:大整数乘法

  用分治算法编程实现两个n位十进制大整数的乘法运算。

#include <bits/stdc++.h>
using namespace std;

typedef long long LL;
const int Max_n=(int)1e3+5;
char a[Max_n],b[Max_n];
int c[Max_n],d[Max_n],ans[2*Max_n];

int main(){
    scanf("%s%s",a,b);
    int lena=strlen(a);
    int lenb=strlen(b);
    for(int i=0;i<lena;i++)
        c[i]=a[lena-i-1]-'0';
    for(int i=0;i<lenb;i++)
        d[i]=b[lenb-i-1]-'0';
    for(int i=0;i<lena;i++){
        for(int j=0;j<lenb;j++){
            ans[i+j]+=c[i]*d[j];
        }
    }
    int len=lena+lenb;
    for(int i=0;i<len-1;i++){
        if(ans[i]>9){
            ans[i+1]+=ans[i]/10;
            ans[i]%=10;
        }
    }
    len=ans[len-1]?len-1:len-2;
    for(int i=len;i>=0;i--)
        printf("%d",ans[i]);
    printf("\n");
    return 0;
}

题目三:二分搜索算法

  设a[0:n-1]是一个已排好序的数组。请改写二分搜索算法,使得当搜索元素x不在数组中时,返回小于x的最大元素的位置i和大于x的最小元素位置j。当搜索元素在数组中时,i和j相同,均为x在数组中的位置。并对自己的程序进行复杂性分析。

#include <bits/stdc++.h>
using namespace std;

typedef long long LL;
const int Max_n=(int)1e3+5;
int a[10]={1,2,3,5,6,7,8,9,10,11};

//查找是否存在x
int binarySearch1(int x){
    int left=0,right=9;
    while(left<=right){
        int mid=(left+right)/2;
        if(a[mid]==x){//找到了x
            return mid;
        }else if(a[mid]<x){//x在中点的右边
            left=mid+1;
        }else{//x在中点的左边
            right=mid-1;
        }
    }
    return -1;//最后没有找到
}

//找到>x的第一个元素
int binarySearch2(int x){
    int left=0,right=9;
    while(left<=right){
        int mid=(left+right)/2;
        if(x<a[mid]){//x在mid的左边
            right=mid-1;
        }else{//x在mid的右边
            left=mid+1;
        }
    }
    return left;
}

//时间复杂度O(logn)
int main(){
    int n;
    printf("请输入您要查找的元素:");
    while(~scanf("%d",&n)){
        int index=binarySearch1(n);
        if(index!=-1){
            printf("%d在数组中位置为:%d\n",n,index);
        }else{//说明没有此数组中没有x
            index=binarySearch2(n);
            if(index==10){
                printf("数组中没有大于%d的元素\n",n);
                printf("小于%d的最大元素位置为:%d\n",n,index);
            }else if(index==0){
                printf("大于%d的最小元素位置为:%d\n",n,index);
                printf("数组中没有小于%d的元素\n",n);
            }else{
                printf("大于%d的最小元素位置为:%d\n",n,index);
                printf("小于%d的最大元素位置为:%d\n",n,index-1);
            }
        }
        printf("请输入您要查找的元素:");
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_42217376/article/details/88989864