版权声明:本文章未经博主允许不得转载 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;
}