算法程序集.docx

上传人:b****5 文档编号:4401852 上传时间:2022-12-01 格式:DOCX 页数:24 大小:157.10KB
下载 相关 举报
算法程序集.docx_第1页
第1页 / 共24页
算法程序集.docx_第2页
第2页 / 共24页
算法程序集.docx_第3页
第3页 / 共24页
算法程序集.docx_第4页
第4页 / 共24页
算法程序集.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

算法程序集.docx

《算法程序集.docx》由会员分享,可在线阅读,更多相关《算法程序集.docx(24页珍藏版)》请在冰豆网上搜索。

算法程序集.docx

算法程序集

算法程序集

目  录

第一讲循环算法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;i

p[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;i

p[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;j

a[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;j

a[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;j

if(number[j]

m=j;

elseif(i!

=m)

{

SWAP(number[i],number[m]);

}

printf("第%d次排序:

",i+1);

for(k=0;k

printf("%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;k

printf("%d",number[k]);

printf("\n");

}

}

voidbubsort(intnumber[])//气泡

展开阅读全文
相关搜索

当前位置:首页 > 高中教育 > 英语

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1