资源描述
C言语罕见编程算法实例
一、 对于数字上的一些编程算法
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++;
elseothers++;}
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);}
展开阅读全文