1、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、字。比方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-
3、1/7+...+1/n,求∏的近似值,直到最初一项1/n的相对值小于0.000001。
#include
4、 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<
5、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
6、10;
x1=x1/10;
j++;}
i=0;j--;
while(i
7、)
{t*=n;//实现阶乘
s+=t;//将阶乘累加
}
printf("1+2!+3!...+20!=%e\n",s);//%e为迷信计数法输入
}
7. 输入一个年份推断它能否是闰年,满意上面前提之一就称为闰年:
〔1〕.能被4整除而不克不及被100整除。〔2〕.能被100整除也能被400整除。
#include
8、printf("yes");
elseprintf("No");}
8. 将十进制数转换成恣意进制。剖析:将输入的数轮回除以基数取余直到商为0,而后逆序输入。
#include
9、le(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
10、[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 11、p;}
printf("\nsortedarray:\n");
for(i=0;i 12、
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 13、曾经证实只要求推断 {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 14、flag=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];
15、
inti,j,n,s;
for(j=2;j<1000;j++)
{n=-1;
s=j;
for(i=1;i 16、de"stdio.h"
#include"math.h"
intmain()
{inti,j,x,flag=0;
longm,n;
for(x=5;x<100;x++)
for(i=1;i 17、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 18、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 19、
}
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( 20、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的值,反复履行第一步。 21、
#include 22、多个天然数对罗列出两个数的一切组合推断能否满意前提。
#include 23、 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("thet 24、otalnumbersis:");
scanf("%d",&n);
printf("\ninput%dnmuber",n);
for(i=0;i 25、入
#include 26、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个整数存到数组中并用拔出法排序。拔出法:每一步将一个待排序元素按其要害字值的巨细拔出到已排序序列的恰当地位上,直到待 27、排序元素拔出完为止。
#include 28、a[%d]=",i);
scanf("%d",&a[i]);}
fun(a,5);
for(i=0;i<5;i++)
printf("%4d",a[i]);}
2. 用冒泡法对数组进展排序〔升序〕。冒泡法排序:两两比拟待排序序列中的元素,并交流不满意次序请求的各对元素,直到全体满意次序请求为止
#include 29、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 30、)
{printf("a[%d]=",i);
scanf("%d",&a[i]);}
printf("\n");
for(i=0;i 31、rintf("Aftersorted\n");
for(i=0;i 32、i++)
if(x==a[i])//次序查寻
cnt++;
if(cnt>0)printf("\nFind,cnt=%d",cnt);
elseprintf("NotFind");}
5. 有10个数按升序放在一个数组中,输入一个数,请求用折半查寻该数是数组中的第几多个元素。折半查寻法:设数组长度为n,那么将输入的数m与a[n/2]比拟,假定m[n/2],那么将a[n/2]到a[n]的数接着折半进展查寻。
#include 33、)
{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(numtop)printf 34、"No\n");}
三、 字符串编程算法
1. 字符数组s1,s2把s2在s1中呈现的字符全体删除。如s1[]="adeaabfce";s2[]="efd";删除后s1中的值为:aaabc
#include 35、 if(p1[i]!=*p2)//对p1从新赋值到达删除目标
p1[j++]=p1[i];
p1[j]='\0';//新字符串不'\0'需求给它赋值一个
p2++;}
puts(p1);}
2. 将b字符串衔接到a前面,编写函数实现此功用
#include 36、stringa:");
scanf("%s",a);
printf("inputstringb:");
scanf("%s",b);
fun(a,b);
printf("\nstringa:%s\n",a);}
3. 将b字符串复制到a中,编写函数实现此功用
#include 37、ntf("\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=='')spa 38、ce++;
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++)
39、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 40、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






