两个已排序的整型数组,求交集,最快算法
输入:两个已排序的整型数组(inta)
输出:两个数组的交集
#include<stdio.h>
//快排
int partion(int *q,int i,int j){
int x=q[i];
int m=i,n=j+1;
while(1){
while((q[++m]<x)&&(m<j));
while(q[--n]>x);
if(m>=n){
break;
}
int temp=q[m];
q[m]=q[n];
q[n]=temp;
}
q[i]=q[n];
q[n]=x;
return n;
}
void quickPai(int *m,int i,int j){
if(i<j){
int q=partion(m,i,j);
quickPai(m,i,q-1);
quickPai(m,q+1,j);
}
}
void commonArray(int *m,int *n,int len1,int len2)
{
int i=0,j=0;
while((i<len1)&&(j<len2))
{
if(m[i+1]<n[j+1])
{
i++;
}
else if(m[i+1]>n[j+1])
{
j++;
}
else if(m[i+1]==n[j+1])
{
printf("%d ",m[i+1]);
i++;
j++;
}
}
}
int main(){
int m[]={2,3,1,6};
int n[]={1,3,1,6};
quickPai(&m,0,3);
quickPai(&n,0,3);
commonArray(&m,&n,4,4);
system("pause");
return 0;
}
求符合指定规则的数。
给定函数d(n)=n+n的各位之和,n为正整数,如d(78)=78+7+8=93。这样这个函数可以看成一个生成器,如93可以看成由78生成。
定义数A:数A找不到一个数B可以由d(B)=A,即A不能由其他数生成。现在要写程序,找出1至10000里的所有符合数A定义的数。
#include<stdio.h>
/*
*求符合指定规则的数。
给定函数d(n)=n+n的各位之和,n为正整数,如d(78)=78+7+8=93。这样这个函数可以看成一个生成器,如93可以看成由78生成。
定义数A:数A找不到一个数B可以由d(B)=A,即A不能由其他数生成。现在要写程序,找出1至10000里的所有符合数A定义的数。
*/
int d(n){
//返回由n各位数相加得到的数
int m=n;
while(n!=0){
m+=n%10;
n=n/10;
}
return m;
}
int main(){
int i;
for(i=1;i<=10000;i++){
//因为是n+n各位数之和,故一个数不可能由比它大的数生成
int tag=0;
int j;
for(j=1;j<i;j++){
if(d(j)==i){
tag=1;
break;
}
}
if(tag==0){
printf("%d\\n",i);
}
}
system("pause");
return 0;
}
两道题,应该是很久的题目了。都是用最傻的办法实现的,太久没碰算法了,惭愧。
第2道题的解决办法太傻了,今天晚上想到的另外一种方法。其实每一位出现的数无外乎都是0~9,我们只需要计算出可能由这些位数再加上本数之后可能出现的数即可!
#include<iostream>
using namespace std;
int main()
{
//一个int占4个字节,那么这个数组占的内存为10K
int *num=new int[10001];
//初始化
for(int i=1;i<=10000;i++)
{
num[i]=0;
}
//判断可能出现的数
for(int i=0;i<10;i++)
{
for(int j=0;j<10;j++)
{
for(int k=0;k<10;k++)
{
for(int n=0;n<10;n++)
{
int temp=1000*i+100*j+10*k+n+i+j+k+n;
if(temp>0&&temp<=10000)
{
num[temp]=1;
}
}
}
}
}
//输出
for(int i=1;i<=10000;i++)
{
if(num[i]==0)
{
cout<<i<<endl;
}
}
delete num;
system("pause");
return 0;
}