资源描述
稀有编程算法实例
一、 关于数字上的一些编程算法
1. 输出9*9口诀乘法表。分析:分行与列考虑,共9行9列,i把持行,j把持列。
#include"stdio.h"
main()
{inti,j,result;
printf("\n");
for(i=1;i<10;i++)
{for(j=1;j<=i;j++)
{result=i*j;
printf("%d*%d=%-3d",i,j,result);/*-3d表示左对齐,占3位*/
}printf("\n");/*每一行后换行*/
}}
2. 求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。比如2+22+222+2222+22222(现在共有5个数相加),多少多个数相加有键盘把持。分析:关键是打算出每一项的值。
main()
{inta,n,count=1;
longintsn=0,tn=0;
printf("pleaseinputaandn\n");
scanf("%d,%d",&a,&n);
printf("a=%d,n=%d\n",a,n);
while(count<=n)
{tn=tn+a;
sn=sn+tn;
a=a*10;
++count;
}printf("a+aa+...=%ld\n",sn);}
3. 公式∏/4=1-1/3+1/5-1/7+...+1/n,求∏的近似值,直到最后一项1/n的绝对值小于0.000001。
#include<stdio.h>
#include<math.h>
main()
{intf=1;
doublepi=0,t=1,v=1;
while(fabs(t)>1e-6)
{pi=pi+t;
v+=2;
f=-f;
t=f/v;
}
pi*=4;
printf("∏=%f\n",pi);}
4. 有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出谁人数列的前20项之跟。
法那么:分子是前一项分子分母之跟,分母是前一项的分子。
main()
{intn,t,number=20;
floata=2,b=1,s=0;
for(n=1;n<=number;n++)
{s=s+a/b;
t=a;a=a+b;b=t;/*序列法那么的完成*/
}
printf("sumis%9.6f\n",s);}
5. 揣摸11<=x<=10000中的数那些是回文数,统计回文数个数,回文数每行输出10个。分析:(1)让x重新构成新的数t,假设x==t那么是回文数.(2)分析出x的各位,停顿首尾比较,假设都相当那么是回文数。
fun1()//算法一
{longx,i,t=0,s=10,cnt=0;
for(x=11;x<10000;x++)
{i=x;
while(i!=0)//构成新的数
{t=t*s+i%10;
i=i/10; }
if(t==x)
{printf("%5d",x);
cnt++;
if(cnt%10==0)
printf("\n");}
t=0;}
printf("\ncnt=%5d",cnt);
}
fun2()//算法二
{longx,i,t=0,j=0,s=10,x1,cnt=0;
inta[10];
for(x=11;x<10000;x++)
{x1=x;
while(x1!=0)//分析出各位
{a[j]=x1%10;
x1=x1/10;
j++;}
i=0;j--;
while(i<j)//首尾比较
if(a[i]==a[j])
i++,j--;
elsebreak;
if(i>=j)
{printf("%5d",x);
cnt++;
if(cnt%10==0)
printf("\n");}
j=0;}
printf("\ncnt=%5d",cnt);}
main()
{fun1();}
6. 求1+2!+3!+...+20!的跟。
main()
{floatn,s=0,t=1;
for(n=1;n<=20;n++)
{t*=n;//完成阶乘
s+=t;//将阶乘累加
}
printf("1+2!+3!...+20!=%e\n",s);//%e为科学计数法输出
}
7. 输出一个年份揣摸它是否是闰年,称心下眼条件之一就称为闰年:
〔1〕.能被4整除而不克不迭被100整除。〔2〕.能被100整除也能被400整除。
#include<stdio.h>
main()
{longintyear;
printf("inputyear:");
scanf("%d",&year);
if(year%4==0&&year%100!=0||year%100==0&&year%400==0)
printf("yes");
elseprintf("No");}
8. 将十进制数转换成任意进制。分析:将输出的数循环除以基数取余直到商为0,然后逆序输出。
#include<stdio.h>
voidmain()//idec为十进制数,ibase为要转换成数的基
{intidec,i,idr,p=0,ibase;
charstrdr[20],t;
printf("输出要转换的十进制数idec=");
scanf("%d",&idec);
printf("\n输出要转换成的进制基数(如:八进制那么输出8)ibase=");
scanf("%d",&ibase);
while(idec!=0)//循环除以基数取余直到商为0
{idr=idec%ibase;
if(idr>=10)
strdr[p++]=idr-10+65;//将16进制的10,11,12,13,14,15与A,B,C,D,E,F对应
elsestrdr[p++]=idr+48;//将数字转换为数字字符
idec/=ibase;//掉掉落商,把谁人商的值重新赋值给idec
}//下面for循环的目的是将取余的各数逆序存放,
for(i=0;i<p/2;i++)
{t=strdr[i];
strdr[i]=strdr[p-i-1];
strdr[p-i-1]=t;}
strdr[p]='\0';
printf("\n转换成%d进制后的数为:%s",ibase,strdr);
printf("\n");}
9. 将一个数组逆序输出。分析:用第一个与最后一个交换,然后用第二个与倒数第二个交换,其余依此类推。
#defineN5
main()
{inta[N]={9,6,5,4,1},i,temp;
printf("\noriginalarray:\n");
for(i=0;i<N;i++)
printf("%4d",a[i]);
for(i=0;i<N/2;i++)
{temp=a[i];
a[i]=a[N-i-1];
a[N-i-1]=temp;}
printf("\nsortedarray:\n");
for(i=0;i<N;i++)
printf("%4d",a[i]);}
10. 打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字破方跟等于该数本身。比如:153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方。分析:使用for循环把持100-999个数,每个数分析出个位,十位,百位。
main()
{inti,j,k,n;
printf("'waterflower'numberis:");
for(n=100;n<1000;n++)
{i=n/100;/*分析出百位*/
j=n/10%10;/*分析出十位*/
k=n%10;/*分析出个位*/
if(i*100+j*10+k==i*i*i+j*j*j+k*k*k)
{printf("%-5d",n);
}}
printf("\n");}
11. 寻出3-1000中的全部素数。素数(质数):只能被1跟本身整除的自然数(1除外).
如2357是素数。
#include<stdio.h>
#include<math.h>
main()
{inti,j,cnt=0;
for(i=3;i<=1000;i++)
{for(j=2;j<=sqrt(i);j++)//i能被j整除说明不是素数,数学上已经证明只需要揣摸 {if(i%j==0) break; }//j<=sqrt〔i〕,i都不克不迭被j整除就能证明i为素数。
if(j>sqrt(i))
{printf("%4d",i);
cnt++;
if(cnt%5==0)
printf("\n");//把持每行输出5个数
}}}
12. 揣摸整数x(0<x<100)是否是同构数。同构数:一个数它出现在它的平方数的右边
比如:5,5的平方数是25,5是25中右侧的数,因而5是同构数;又如25是625的同构数.
#include<stdio.h>
main()
{longintx,y,i=10;
intflag=0;
for(x=1;x<100;x++)
{y=x*x;
while(y/i!=0)//使用循环取余的方法停顿揣摸
{//先让y对10取余,揣摸是否是同构数
if(y%i==x)//再对100取余揣摸,直到y/i为0
{flag=1;
break; }
i=i*10;}
if(flag==1)printf("\n%d是%d的同构数!",x,y);
flag=0;
i=10; }}
13. 一个数假设偏偏等于它的因子之跟,谁人数就称为"完数"。比如6=1+2+3。编程寻出1000以内的所有完数。
main()
{staticintk[11];
inti,j,n,s;
for(j=2;j<1000;j++)
{n=-1;
s=j;
for(i=1;i<j;i++)
{if((j%i)==0)
{n++;//寻到质因子
s=s-i;//减去寻到的因子,假设减到s=0说明s是完数
k[n]=i;}}
if(s==0)
{printf("%disawanshu",j);
for(i=0;i<n;i++)
printf("%d,",k[i]);
printf("%d\n",k[n]);
}}}
14. 弦数:一个正整数x其平方等于某两个正整数平方之跟。如:3*3+4*4=5*5,那么5称为弦数。
#include"stdio.h"
#include"math.h"
intmain()
{inti,j,x,flag=0;
longm,n;
for(x=5;x<100;x++)
for(i=1;i<x;i++)//设另两个正整数(i,j)分不都从1开始逐个打算
{//看是否称心x*x=i*i+j*j
for(j=1;j<x;j++)//也可以如斯写for(j=x;j>1;j--)
{n=i*i+j*j;
m=x*x;
if(m==n)
{flag=1;
break;}}
if(flag==1)
{printf("\n弦数为%d%d*%d+%d*%d=%d*%d",x,i,i,j,j,x,x);
flag=0;
break;}}}
15. 打印出杨辉三角形〔恳求打印出10行如以下图〕
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
main()
{inti,j,a[10][10];
printf("\n");
for(i=0;i<10;i++)
{a[i][0]=1;
a[i][i]=1;}
for(i=2;i<10;i++)
for(j=1;j<i;j++)
a[i][j]=a[i-1][j-1]+a[i-1][j];
for(i=0;i<10;i++)
{for(j=0;j<=i;j++)
printf("%5d",a[i][j]);
printf("\n");}}
16. 输出两个正整数m跟n,求其最大年夜公约数跟最小公倍数。分析:使用辗除法。
#include<stdio.h>
main()
{inta,b,num1,num2,temp;
printf("pleaseinputtwonumbers:\n");
scanf("%d,%d",&num1,&num2);
if(num1!=0)
{temp=num1;
num1=num2;
num2=temp;
}
a=num1;b=num2;
while(b!=0)/*使用辗除法,直到b为0为止*/
{temp=a%b;
a=b;
b=temp;
}
printf("gongyueshu:%d\n",a);
printf("gongbeishu:%d\n",num1*num2/a);}
17. 给一个正整数,恳求:一、求它是多少多位数,二、逆序打印出各位数字。x先对10取余,然后x=x/10取整
main()
{ longa=0,x;
printf("inputanumber:");
scanf("%ld",&x);
printf("x的各位为:");
while(x!=0)
{printf("%d,",x%10);//输出个位
x/=10;
a++;//统计位数
}
printf("\n你输出的是%d位数",a);}
18. 将一个正整数分析质因数。比如:输出90,打印出90=2*3*3*5。次第分析:对n停顿分析质因数,应先寻到一个最小的质数k,然后按下述步伐完成:
(1)假设谁人质数恰等于n,那么说明分析质因数的过程已经终了,打印出即可。
(2)假设n<>k,但n能被k整除,那么应打印出k的值,并用n除以k的商,作为新的正整数你n, 重复实行第一步。
(3)假设n不克不迭被k整除,那么用k+1作为k的值,重复实行第一步。
#include<stdio.h>
main()
{intn,i;
printf("\npleaseinputanumber:\n");
scanf("%d",&n);
printf("%d=",n);
for(i=2;i<=n;i++)
{while(n!=i)
{if(n%i==0)
{printf("%d*",i);
n=n/i;}
elsebreak;}}
printf("%d",n);}
19. 自然数对:两个自然数的跟与差根本上平方数。如:8跟17的跟8+17=25与其差17-8=9,25跟9根本上平方数,那么(8跟17)的确是自然数对在100以内有多少多个自然数对列举出两个数的所有组合揣摸是否称心条件。
#include<stdio.h>
#include<math.h>
main()
{ intx,i,j,y;
for(i=100;i>1;i--)
for(j=1;j<100;j++)
{ x=i+j;
y=i-j;
if(y<0)break;//目的剔除重复的自然数对
//用sqrt函数开方,假设是平方数开放后取整的乘积该当相当
if(x==(int)sqrt(x)*(int)sqrt(x)&&y==(int)sqrt(y)*(int)sqrt(y)&&i!=j)
printf("自然数对:(%d,%d)\n",i,j); }}
20. 有n个整数,使其后面各数次第向后移m个位置,最后m个数变成最后面的m个数
move(array,n,m)
intn,m,array[20];
{
int*p,array_end;
array_end=*(array+n-1);
for(p=array+n-1;p>array;p--)
*p=*(p-1);
*array=array_end;
m--;
if(m>0)move(array,n,m);
}
main()
{intnumber[20],n,m,i;
printf("thetotalnumbersis:");
scanf("%d",&n);
printf("\ninput%dnmuber",n);
for(i=0;i<n;i++)
scanf("%d",&number[i]);
printf("backm:");
scanf("%d",&m);
move(number,n,m);
for(i=0;i<n;i++)
printf("%d",number[i]);}
21. 输出一字符串揣摸该字符串是否存在数字字符串,统计数字字符串的个数并转换为整数输出。如:"abc1254pa45ui123",数字字符串个数为3转换成整数1254、45、123输出
#include<stdio.h>
intfun(char*str,longint*num)
{inti=0,flag=0,wz=1,n=0,k=0;
chartemp[50];
do
{while(str[i]>='0'&&str[i]<='9')
{temp[k++]=str[i];
flag=1;
i++;}
if(flag==1)
{while(--k>=0)
{num[n]=(temp[k]-'0')*wz+num[n];
wz*=10;}
k=0;
n++;
flag=0;
wz=1; }}
while(str[i++]);
returnn;}
main()
{charstr[50];
longintnum[10]={0};
inttotal=0;
printf("inputstring:\n");
gets(str);
total=fun(str,num);
printf("total=%d",total);
while(total>0)
{printf("\n%ld",num[--total]);}}
二、 排序查寻编程算法
1. 输出5个整数存到数组中并用拔出法排序。拔出法:每一步将一个待排序元素按其关键字值的大小拔出到已排序序列的适当位置上,直到待排序元素拔出完为止。
#include<stdio.h>
fun(inta[],intn)
{intk,j,t;
for(j=1;j<n;j++)//小于j的为已排序列,大年夜于j的为待排序列
{t=a[j];//从待排序列中取一个值
k=j-1;//让k指向已排序列
while(k>=0&&t>a[k])//在已排序列寻拔出位置,并将以排序中的
{a[k+1]=a[k];k--;}//值次第后移动直到移动到拔出点
a[k+1]=t;//k+1的值就为拔出点
}}
main()
{inta[5],i;
for(i=0;i<5;i++)
{printf("\ninputa[%d]=",i);
scanf("%d",&a[i]);}
fun(a,5);
for(i=0;i<5;i++)
printf("%4d",a[i]);}
2. 用冒泡法对数组停顿排序〔升序〕。冒泡法排序:两两比较待排序序列中的元素,并交换不称心次第恳求的各对元素,直到全部称心次第恳求为止
#include<stdio.h>
voidsort(inta[],intn)
{inti,j,t;
for(i=0;i<n-1;i++)
for(j=0;j<n-i;j++)
if(a[j]>a[j+1])//两两比较
{t=a[j];a[j]=a[j+1];a[j+1]=t;}//交换不称心升序条件的数对
}
voidmain()
{inta[5]={5,10,-7,3,7},i,t,j;
sort(a,5);
for(i=0;i<=4;i++)
printf("%5d",a[i]);}
3. 输出10个整数,并对10个数停顿排序〔升序〕。选择法:即从10个数中〔待排序数〕,选择一个最小的与第一个元素交流,下次类推,即在后9个数中选择一个最小值第二个元素停顿交换。
#defineN10
main()
{inti,j,min,tem,a[N];
printf("pleaseinputtennum:\n");
for(i=0;i<N;i++)
{printf("a[%d]=",i);
scanf("%d",&a[i]);}
printf("\n");
for(i=0;i<N;i++)//将输出的数据输出
printf("%5d",a[i]);
printf("\n");
for(i=0;i<N-1;i++)
{min=i;//假设待排序中第i个数最小
for(j=i+1;j<N;j++)//for循环的目的是寻最小的数
if(a[min]>a[j])min=j;//寻到一个更小的数
tem=a[i];//下面的语句将每次寻到最小的数与第i个数交换
a[i]=a[min];
a[min]=tem;}
printf("Aftersorted\n");
for(i=0;i<N;i++)
printf("%5d",a[i]);}
4. 输出一个值查寻它在数组中是否存在,假设存在统计它在数组中出现的次数。次第查寻:从数组的首元素开始,逐个元素与待查寻的关键字停顿比较,直到寻到相当的。假设全部数组中不与待查寻关键字相当的元素,的确是查寻不成功
#include<stdio.h>
main()
{inta[10]={3,56,56,9,9,12,34,46,67,44},i,x,cnt=0;
printf("inputx=");
scanf("%d",&x);
for(i=0;i<10;i++)
if(x==a[i])//次第查寻
cnt++;
if(cnt>0)printf("\nFind,cnt=%d",cnt);
elseprintf("NotFind");}
5. 有10个数按升序放在一个数组中,输出一个数,恳求用折半查寻该数是数组中的第多少多个元素。折半查寻法:设数组长度为n,那么将输出的数m与a[n/2]比较,假设m<a[n/2],那么将a[0]到a[n/2]的数接着折半停顿查寻;假设m=[n/2],那么表示寻到该数的位置;假设m>[n/2],那么将a[n/2]到a[n]的数接着折半停顿查寻。
#include<stdio.h>
main()
{inta[10]={12,32,45,62,71,76,80,85,90,95};
intnum,bott,top,mid;
printf("inputanumber:\n");
scanf("%d",&num);
bott=0;
top=9;
while(bott<=top)
{mid=(bott+top)/2;
if(num==a[mid]){printf("%disthe%dnumber\n",num,mid+1);break;}
elseif(num<a[mid])top=mid-1;
elsebott=mid+1;}
if(bott>top)printf("No\n");}
三、 字符串编程算法
1. 字符数组s1,s2把s2在s1中出现的字符全部删除。如s1[]="adeaabfce";s2[]="efd";删除后s1中的值为:aaabc
#include<stdio.h>
main()
{chars1[50],s2[10],*p1,*p2;
inti,j;
p1=s1;
p2=s2;
printf("inputs1:");
scanf("%s",p1);
printf("inputs2");
scanf("%s",p2);
while(*p2)
{ for(i=0,j=0;p1[i]!='\0';i++)
if(p1[i]!=*p2)//对p1重新赋值抵达删除目的
p1[j++]=p1[i];
p1[j]='\0';//新字符串不'\0'需要给它赋值一个
p2++;}
puts(p1);}
2. 将b字符串连接到a后面,编写函数完成此功能
#include<stdio.h>
voidfun(char*a,char*b)
{while(*a++);//寻'\0'的位置
a--;//a已经指向'\0'后面因而要自减
while(*b)*a++=*b++;
*a='\0';}
main()
{ chara[100],b[50];
printf("inputstringa:");
scanf("%s",a);
printf("inputstringb:");
scanf("%s",b);
fun(a,b);
printf("\nstringa:%s\n",a);}
3. 将b字符串复制到a中,编写函数完成此功能
#include<stdio.h>
voidfun(char*a,char*b)
{while(*b)*a++=*b++;
*a='\0';}
main()
{ chara[50],b[50];
printf("inputstringb:");
gets(b);
fun(a,b);
printf("\nstringa:%s\n",a);}
4. 输出一行字符,分不统计出其中英文字母、空格、数字跟不的字符的个数。分析:使用while语句,条件为输出的字符不为'\n'。
#include"stdio.h"
main()
{charc;
intletters=0,space=0,digit=0,others=0;
printf("pleaseinputsomecharacters\n");
while((c=getchar())!='\n')
{if(c>='a'&&c<='z'||c>='A'&&c<='Z')letters++;
elseif(c=='')space++;
elseif(c>='0'&&c<='9')digit++;
el搜索引擎优化thers++;}
printf("allinall:char=%dspace=%ddigit=%dothers=%d\n",letters,space,digit,others);
}
5. 打印出如以下图形:
*
***
*****
***
*
main()
{intx,i,j,n=3;
//上三角形,空格个数递减,*号递增。
for(i=0;i<3;i++)
{for(j=n--;j>0;j--)
printf("");
for(x=0;x<2*i+1;x++)
printf("*");
printf("\n");
}
//下三角形,空格个数递增,*号递减。
n=1;
for(i=3;i>0;i--)
{for(j=0;j<=n;j++)
printf("");
for(x=2*(i-1)-1;x>0;x--)
printf("*");
n++;
printf("\n");}
6. 把数组s2中的所有字符拔出到s1的第n个字符后面。分析:先要把从n个字符后面的字符都次第后移,再停顿字符拔出把持。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char*insert(char*s1,char*s2,intn)
{char*p1;
inti,len1,len2;
len1=strlen(s1);
len2=strlen(s2);
p1=s1;
for(i=strlen(s1)-1;i>n;i--)
*(s1+i+len2)=*(s1+i);
while(*s2)
{*(s1+i)=*s2;
i++;s2++;
}
*(p1+len1+len2)='\0';
returnp1;
}
main()
{chars1[50],s2[10],*p;
intn;
printf("\ninputs1");
scanf("%s",s1);
printf("\ninputs2");
scanf("%s",s2);
printf("\ninputn");
scanf("%d",&n);
if(n<strlen(s1))p=insert(s1,s2,n);
else{printf("error:n>strlen(s1)");
exit(0);}
puts(p);}
展开阅读全文