1、稀有编程算法实例 一、 关于数字上的一些编程算法 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-1/
3、7+...+1/n,求∏的近似值,直到最后一项1/n的绝对值小于0.000001。
#include
4、ain() {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<10
5、000;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%1
6、0;
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、intf("yes");
elseprintf("No");}
8. 将十进制数转换成任意进制。分析:将输出的数循环除以基数取余直到商为0,然后逆序输出。
#include
9、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、}
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、lag=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、e"stdio.h"
#include"math.h"
intmain()
{inti,j,x,flag=0;
longm,n;
for(x=5;x<100;x++)
for(i=1;i 17、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、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("the 24、totalnumbersis:");
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、uta[%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、
printf("Aftersorted\n");
for(i=0;i 32、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[n/2],那么将a[n/2]到a[n]的数接着折半停顿查寻。
#include 33、in()
{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)pri 34、ntf("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、putstringa:");
scanf("%s",a);
printf("inputstringb:");
scanf("%s",b);
fun(a,b);
printf("\nstringa:%s\n",a);}
3. 将b字符串复制到a中,编写函数完成此功能
#include 37、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=='') 38、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+ 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、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






