算法程序集.docx
《算法程序集.docx》由会员分享,可在线阅读,更多相关《算法程序集.docx(24页珍藏版)》请在冰豆网上搜索。
算法程序集
算法程序集
目 录
第一讲循环算法1
1、质数问题1
2、模糊票据问题3
3、水仙花数问题4
4、约数问题5
5、打印星号问题6
6、编程计算问题7
7、车牌问题9
8、排序问题11
9、最大公约数公倍数问题14
10、因式分解问题15
11、随机数的2分查找16
12、狼找兔子问题18
13、统计字符问题19
14、19
第一讲循环算法
1、质数问题ß
问题描述:
输出100~200的所有素数(质数)。
思路思路:
说明除了自身之外,无法被其它整数整除的数称之为质数。
程序代码:
C++语言实现:
Objective-C语言实现:
#include"stdio.h"
#include"stdlib.h"
#include"iostream.h"
#include"math.h"
voidmain()
{
inti,k;
for(i=101;i<=200;i++)
{
for(k=2;k
{
if(i%k==0)
break;
else
if(k==i/2-1)
printf("%i\n",i);
}
}
}
#import
#include
intmain(intargc,constchar*argv[])
{
NSAutoreleasePool*pool=[[NSAutoreleasePoolalloc]init];
inti,k;
for(i=101;i<=200;i++)
{
for(k=2;k
{
if(i%k==0)
break;
elseif(k==i/2-1)
printf("%i\n",i);
}
}
[pooldrain];
return0;
}
运行结果:
问题描述:
求在N之内的质数:
算法思路:
程序代码:
C++语言实现
Objective-C语言实现:
#include
#include
#defineN1000
voidmain()
{
inti,j;
intprime[N+1];
for(i=2;i<=N;i++)
prime[i]=1;
for(i=2;i*i<=N;i++)
{//这边可以改进
if(prime[i]==1)
{
for(j=2*i;j<=N;j++)
{
if(j%i==0)
prime[j]=0;
}
}
}
for(i=2;i{
if(prime[i]==1)
{
printf("%4d",i);
if(i%16==0)
printf("\n");
}
}
printf("\n");
}
#import
#include
intmain(intargc,constchar*argv[])
{
NSAutoreleasePool*pool=[[NSAutoreleasePoolalloc]init];
inti,j;
intprime[N+1];
for(i=2;i<=N;i++)
prime[i]=1;
for(i=2;i*i<=N;i++)
{
If(prime[i]==1)
{
for(i=2*I;j<=N;j++)
{
If(j%i==0)
Prime[j]=0;
}
}
}
for(i=2;i{
if(prime[i]==1)
{
Printf(“%4d”,i);
if(i%16==0)
printf(“\n”);
}
}
printf("\n");
[pooldrain];
return0;
}
运行结果:
2、模糊票据问题
问题描述:
现在有一张5位数票据,如1##47,因某些原因,其中有二位数已模糊不清,但知道它能被57或67整除,问所用满足这些条件的5位数,及统计满足条件的个数。
解题思路:
程序代码:
C++语言实现:
Objective-C语言实现:
#include"stdio.h"
#include"stdlib.h"
#include"iostream.h"
#include"math.h"
voidmain()
{
inti,j,k;
for(i=0;i<10;i++)
{
for(j=0;j<10;j++)
{
k=10047+i*1000+j*100;
if(k%57==0||k%67==0)
printf("%i\n",k);
}
}
}
#import
intmain(intargc,constchar*argv[])
{
NSAutoreleasePool*pool=[[NSAutoreleasePoolalloc]init];
inti,j,k;
for(i=0;i<10;i++)
{
for(j=0;j<10;j++)
{
k=10047+i*1000+j*100;
if(k%57==0||k%67==0)
printf("%i\n",k);
}
}
[pooldrain];
return0;
}
运行结果:
3、水仙花数问题
问题描述:
即存在这样的三位数,ABC;满足如下表达式:
ABC=A3+B3+C3
设计思路:
程序代码:
C++语言实现:
Objective-C语言实现:
#include"stdio.h"
#include"stdlib.h"
#include"iostream.h"
#include"math.h"
voidmain()
{
inta,b,c,n;
for(a=1;a<10;a++)
{
for(b=0;b<10;b++)
{
for(c=0;c<10;c++)
{
n=a*100+b*10+c;
if(n==(a*a*a+b*b*b+c*c*c))
cout<}
}
}
}
#import
intmain(intargc,constchar*argv[])
{
NSAutoreleasePool*pool=[[NSAutoreleasePoolalloc]init];
inti,j,k,n;
for(i=1;i<10;i++)
{
for(j=0;j<10;j++)
{
for(k=0;k<10;k++)
{
n=i*100+j*10+k;
if(n==(i*i*i+j*j*j+k*k*k))
printf("%i\n",n);
}
}
}
[pooldrain];
return0;
}
运行结果:
4、约数问题
问题描述:
求一个正整数的所有约数。
设计思路:
程序代码:
C++语言实现:
Objective-C语言实现:
#include"stdio.h"
#include"stdlib.h"
#include"iostream.h"
#include"math.h"
voidmain1()
{
intn,i;
cin>>n;
for(i=1;i<=n;i++)
{
if(n%i==0)
cout<
}
}
#import
intmain(intargc,constchar*argv[])
{
NSAutoreleasePool*pool=[[NSAutoreleasePoolalloc]init];
intn,i;
scanf("%i",&n);
for(i=1;i<=n;i++)
{
if(n%i==0)
printf("%i\n",i);
}
[pooldrain];
return0;
}
运行结果:
5、打印星号问题
问题描述:
打印如下图形
*
**
**……**(n个)
设计思路:
程序代码:
C++语言实现:
Objective-C语言实现:
#include"stdio.h"
#include"stdlib.h"
#include"iostream.h"
voidmain()
{
intn;
cin>>n;
char*p;
p=(char*)malloc(sizeof(char)*(n+1));
inti;
for(i=0;ip[i]='';
p[n]=0;
for(i=0;i{
p[n-i-1]='*';
cout<
cout<}
}
#import
intmain(intargc,constchar*argv[])
{
NSAutoreleasePool*pool=[[NSAutoreleasePoolalloc]init];
intn;
scanf("%i",&n);
char*p;
p=(char*)malloc(sizeof(char)*(n+1));
inti;
for(i=0;ip[i]='';
p[n]=0;
for(i=0;i{
p[n-i-1]='*';
printf("%s\n",p);
}
[pooldrain];
return0;
}
运行结果:
6、编程计算问题
问题描述:
编程实现:
求2+22+222+2222+…+22…22(精确计算(n个2))
算法思路:
由于位数过多的问题不能依靠数字进行直接的运算,应用字符串的格式。
程序实现:
C++语言
Objective--C
#include"stdio.h"
#include"iostream.h"
#include"stdlib.h"
#include"Math.h"
voidmain()
{
intinput;
cin>>input;
int*a;
a=(int*)calloc(input,sizeof(int));
inti,j;
for(i=0;i
{
for(j=0;j
{
a[j]=a[j]+2;
}
for(j=0;j
{
if(a[j]>9)
{
a[j+1]=a[j+1]+a[j]/10;
a[j]=a[j]%10;
}
}
}
printf("2+22+....+2%d2=",input);
for(i=input-1;i>=0;i--)
{
printf("%d",a[i]);
}
}
#import
#include
#include
intmain(intargc,constchar*argv[])
{
NSAutoreleasePool*pool=[[NSAutoreleasePoolalloc]init];
intupet;
scanf("%d",&upet);
int*a;
a=(int*)calloc(upet,sizeof(int));
inti,j;
for(i=0;i{
for(j=0;j{
a[j]=a[j]+2;
}
for(j=0;j{
if(a[j]>9)
{
a[j+1]=a[j+1]+a[j]%10;
a[j]=a[j]%10;
}
}
printf("2+22+222+2222+......2..2%d2=",upet);
for(i=upet-1;i>=0;i--)
{
printf("%d",&a[i]);
}
}
[pooldrain];
return0;
}
运行结果:
问题描述:
求N!
的运算。
(精确计算)
思路描述:
程序实现:
C++语言
Objcetive-C
#include"stdio.h"
#include"iostream.h"
#include"stdlib.h"
#include"Math.h"
voidmain()
{
intinput;
cin>>input;
int*a;
a=(int*)malloc(sizeof(int));
intLength=1;
a[0]=1;
inti,j;
for(i=1;i<=input;i++)
{
for(j=0;ja[j]=a[j]*i;
for(j=0;j{
if(a[j]>9)
{
if(j==Length-1)
{
Length++;
a=(int*)realloc(a,(sizeof(int)*(Length)));
a[Length-1]=0;
}
a[j+1]=a[j+1]+a[j]/10;
a[j]=a[j]%10;
}
}
}
printf("%d!
=",input);
for(j=Length-1;j>=0;j--)
printf("%d",a[j]);
}
#import
#include
#include
intmain(intargc,constchar*argv[])
{
NSAutoreleasePool*pool=[[NSAutoreleasePoolalloc]init];
Intupet;
Printf(“请输入一个数:
”);
Scanf(“%d”,&upet);
int*a;
a=(int*)malloc(sizeof(int));
intLength=1;
a[0]=1;
inti,j;
for(i=1;i<=upet;i++)
{
for(j=0;ja[j]=a[j]*i;
for(j=0;j{
if(a[j]>9)
{
if(j==Length-1)
{
Length++;
a=(int*)realloc(a,(sizeof(int)*(Length)));
a[Length-1]=0;
}
a[j+1]=a[j+1]+a[j]/10;
a[j]=a[j]%10;
}
}
}
printf("%d!
=",upet);
for(j=Length-1;j>=0;j--)
printf("%d",a[j]);
[pooldrain];
return0;
}
运行结果:
7、车牌问题
问题描述:
若车牌是由0到9的十个数字组成的五位数,现将车牌号每位的数字进行相加求和,得到一个新数字,若新数字大于10,仍将各位数字相加求和,又得到一个新数字,…如此下去,最后总能得到小于10的正整数,(例如:
车牌为54235,5+4+2+3+4=19,1+9=10,1+0=1)。
编程实现,求取各种可能的车牌号,经过如上处理,最后得到0到9各个数字的个数,看看有什么规律,为什么?
结论:
显然而知,0只出现了一次,其他的数字出现概率相同.
问题思路:
intp=a[0]+a[1]+a[2]+a[3]+a[4];//5个车牌号的相加
while(p>=10)//判断5个数相加是否大于10,
{
k=p%10;
j=(p-k)/10;
p=j+k;}
用上面的算法求车牌号每位的数字进行相加求和,得到一个新数字,若新数字大于10,仍将各位数字相加求和,又得到一个新数字,如此下去,知道5个车牌号相加小雨10为止.
程序实现:
C++实现:
#include"stdio.h"
#include"iostream.h"
#include"stdlib.h"
#include"Math.h"
voidmain()
{
inta[10]={0};
intN,i,j,k;
N=10000000;
for(i=0;i{
j=i;//个位
k=0;//十位
while(true)
{
k=k+j%10;
j=j/10;
if(j==0)
{
if(k<10)
break;
else
{
j=k;
k=0;
}
}
}
a[k]++;
}
for(j=0;j<10;j++)
cout<<"最后得到"<"<}
运行结果:
8、排序问题
问题描述:
对一组数的排序
算法思路:
各个排序法的各不相同
选择排序:
将要排序的对象分作两部份,一个是已排序的,一个是未排序的,从后端未排序部份选择一个最小值,并放入前端已排序部份的最后一个,例如:
排序前:
7080313710148603380
[1]803137107048603380选出最小值1一次
[110]3137807048603380选出最小值102次
[11031]37807048603380选出最小值313次
…….
插入排序:
像是玩朴克一样,我们将牌分作两堆,每次从后面一堆的牌抽出最前端的牌,然后插入前面一堆牌的适当位置,例如:
排序前:
927767868455854367
[7792]67868455854367将77插入92前1次
[677792]868455854367将67插入77前2次
[8677792]68455854367将8插入67前3次
气泡排序:
顾名思义,就是排序时,最大的元素会如同气泡一样移至右端,其利用比较相邻元素的方法,将大的元素交换至右端,所以大的元素会不断的往右移动,直到适当的位置为止。
程序实现:
C++语言
Objective-C
#include
#include
#include
#defineMAX10
voidselsort(int[]);//选择排序
voidinsort(int[]);//插入排序
voidbubsort(int[]);//气泡排序
#defineSWAP(x,y){intt;t=x;x=y;y=t;}
voidmain()
{
intnumber[MAX]={0};
inti;
printf("排序前:
");
for(i=0;i{
number[i]=rand()%100;//随机数
printf("%d",number[i]);
}
printf("\n请选择排序方式:
\n");
printf("
(1)选择排序\n
(2)插入排序\n(3)气泡排序\n:
");
scanf("%d",&i);
switch(i){
case1:
selsort(number);break;
case2:
insort(number);break;
case3:
bubsort(number);break;
default:
printf("选项错误(1..3)\n");
}
}
voidselsort(intnumber[])//选择排序
{
inti,j,k,m;
for(i=0;i{
m=i;
for(j=i+1;jif(number[j]m=j;
elseif(i!
=m)
{
SWAP(number[i],number[m]);
}
printf("第%d次排序:
",i+1);
for(k=0;kprintf("%d",number[k]);
printf("\n");
}
}
voidinsort(intnumber[])//插入排序
{
inti,j,k,tmp;
for(j=1;j{
tmp=number[j];
i=j-1;
while(tmp{
number[i+1]=number[i];
i--;
if(i==-1)
break;
}
number[i+1]=tmp;
for(k=0;kprintf("%d",number[k]);
printf("\n");
}
}
voidbubsort(intnumber[])//气泡