




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、常见编程算法实例关于数字上的一些编程算法1. 输出 9*9 口诀乘法表分析:分行与列考虑,共9行9列,i控制行,j控制列。#include "stdio.h"main() int i,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+a
2、aaa+aa.a的值,其中 a 是一个数字。例如 2+22+222+2222+22222(此时共有5 个数相加 ),几个数相加有键盘控制。 【分析】关键是计算出每一项的值。main() int a,n,count=1; long int sn=0,tn=0; printf("please input a and nn"); scanf("%d,%d",&a,&n); printf("a=%d,n=%dn",a,n); while(count<=n) tn=tn+a;sn=sn+tn;a=a*10; +count;
3、printf("a+aa+.=%ldn",sn);公式口 /4=1-1/3+1/5-1/7+.+ 1/n ,求口的近似值,直到最后一项1/n的绝对值小于 0.000001。 #include<stdio.h>#include<math.h>main() int f=1;double pi=0,t=1,v=1; while(fabs(t)>1e-6) pi=pi+t;v+=2;f=-f; t=f/v;pi*=4;printf(” n =%fn",pi);有一分数序列: 2/1, 3/2, 5/3, 8/5, 13/8, 21/13.求出
4、这个数列的前 20项之和。规律 :分子是前一项分子分母之和,分母是前一项的分子。main() int n,t,number=20;float a=2,b=1,s=0;for(n=1;n<=number;n+)s=s+a/b;t=a;a=a+b;b=t;/* 序列规律的实现 */printf("sum is %9.6fn",s); 判断 11<=x<=10000 中的数那些是回文数 ,统计回文数个数, 回文数每行输出 10 个。分析: (1) 让 x 重新构成新的数 t, 如果 x=t 则是回文数 .(2) 分解出 x 的各位,进行首尾比较,如果都 相等则是
5、回文数。fun1()/ 算法一 long x,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()/ 算法二 long x,i,t=0,j=0,s=10,x1,cnt=0;int a10;for(x=11;x<10000;x+) x1=x;wh
6、ile(x1!=0)/ 分解出各位 a j =x1%10;x1=x1/10;j+; i=0;j-;while(i<j)/ 首尾比较if(ai=aj)i+,j-;else break;if(i>=j)printf("%5d",x);cnt+;if(cnt%10=0) printf("n"); j=0; printf("ncnt=%5d",cnt); main()fun1(); 求 1+2!+3!+.+20! 的和。main()float n,s=0,t=1;for(n=1;n<=20;n+) t*=n; / 实现阶乘s
7、+=t; / 将阶乘累加printf("1+2!+3!.+20!=%en",s);/%e 为科学计数法输出输入一个年份判断它是否是闰年,满足下面条件之一就称为闰年:(1) .能被 4 整除而不能被100 整除。(2).能被 100 整除也能被 400 整除。#include<stdio.h>main()long int year;printf("input year:");scanf("%d",&year);if(year%4=0&& year%100!=0|year%100=0&&
8、year%400=0) printf("yes");else printf("No"); 将十进制数转换成任意进制。#include<stdio.h>分析:将输入的数循环除以基数取余直到商为0 ,然后逆序输出。void main() / idec 为十进制数, ibase 为要转换成数的基int idec,i, idr, p=0,ibase;char strdr20,t;printf(" 输入要转换的十进制数 idec="); scanf("%d",&idec);printf("n 输
9、入要转换成的进制基数 (如 :八进制 则输入 8)ibase=");scanf("%d",&ibase);while(idec!=0) idr=idec % ibase;/ 循环除以基数取余 直到商为 0if(idr>=10) strdrp+=idr-10+65; else strdrp+=idr+48; idec/=ibase;/ 将 16 进制的 10,11,12,13,14,15 与 A,B,C,D,E,F 对应 /将数字转换为数字字符/ 得到商 ,把这个商的值重新赋值给 idec/ 下面 for 循环的目的是将取余的各数逆序存放for(i=0
10、; i<p/2; i+) t=strdri;strdri=strdrp-i-1;strdrp-i-1=t; strdrp='0'printf("n 转换成 %d 进制后的数为 :%s",ibase,strdr); printf("n"); 将一个数组逆序输出。分析:用第一个与最后一个交换,然后用第二个与倒数第二个交换,其余依此类推。#define N 5main()int aN=9,6,5,4,1,i,temp;printf("n original array:n");for(i=0;i<N;i+)prin
11、tf("%4d",ai);for(i=0;i<N/2;i+)temp=ai;ai=aN-i-1;aN-i-1=temp; printf("n sorted array:n");for(i=0;i<N;i+)printf("%4d",ai); 打印出所有的 "水仙花数 ",所谓 "水仙花数 "是指一个三位数, 其各位数字立方和等于该数本身。 例如: 153 是一个 " 水仙花数 ",因为 153=1 的三次方 5 的三次方 3 的三次方。分析:利用 for 循环控制
12、 100-999 个数,每个数分解出个位,十位,百位。main()int i,j,k,n; printf("'water flower'number is:");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"); 找出 3-1000 中的全部素数。 素数(质数):只能被 1
13、 和自身整除的自然数 (1除外).如 2 3 5 7是素 数。#include<stdio.h>#include<math.h>main()int i,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(
14、"n");/控制每行输出 5 个数 判断整数 x(0<x<100) 是否是同构数。 同构数:一个数它出现在它的平方数的右边 例如 : 5 ,5 的平方数是 25,5 是 25 中右侧的数 ,所以 5 是同构数 ;又如 25 是 625 的同构数 .#include<stdio.h>main() long int x,y,i=10;int 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 f
15、lag=1;break; i=i*10;if(flag=1) printf("n%d是4 的同构数!",x,y);flag=0;i=10;一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如 6=123。编程找出 1000以内的所有完数。main() static int k11;int i,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 是完数 kn=i; if(s=0)printf(
16、"%d is a wanshu",j); for(i=0;i<n;i+) printf("%d,",ki); printf("%dn",kn);弦数:一个正整数 x 其平方等于某两个正整数平方之和。如 :3*3+4*4=5*5 , 那么 5 称为弦数。 #include"stdio.h"#include"math.h"int main() int i,j,x,flag=0;long m,n;for(x=5;x<100;x+) for(i=1;i<x;i+) / 设另两个正整数
17、(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; 10 行如下图)14 110 5 1打印出杨辉三角形(要求打印出11 11 2 113 31461 5 10main() int i,j, a1010;printf("n
18、"); for(i=0;i<10;i+) ai0=1;aii=1; for(i=2;i<10;i+) for(j=1;j<i;j+) aij=ai-1j-1+ai-1j; for(i=0;i<10;i+) for(j=0;j<=i;j+) printf("%5d",aij); printf("n"); 输入两个正整数 m和n,求其最大公约数和最小公倍数。分析:利用辗除法。#include<stdio.h>main()int a,b,num1,num2,temp;printf("please i
19、nput two numbers:n");scanf("%d,%d",&num1,&num2);if(num1!=0)temp=num1;num1=num2;num2=temp;a=num1;b=num2;while(b!=O) /*利用辗除法,直到 b为0为止*/temp=a%b;a=b;b=temp;printf("gongyueshu:%dn",a);printf("gongbeishu:%dn",num1*num2/a); 给一个正整数,要求:一、求它是几位数,二、逆序打印出各位数字。 x 先对 10
20、 取余,然后 x=x/10 取整main( ) long a=0,x;printf("input a number:"); scanf("%ld",&x);printf("x 的各位为: ");while(x!=0)printf("%d,",x%10);/ 输出个位x/=10;a+;/ 统计位数printf("n 你输入的是 %d 位数 ",a);将一个正整数分解质因数。例如:输入90,打印出 90=2*3*3*5 。程序分析:对 n 进行分解质因数,应先找到一个最小的质数k,然后按下述
21、步骤完成:(1)如果这个质数恰等于n则说明分解质因数的过程已经结束,打印出即可。如果 *>k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你 n, 重复执行第一步。如果n不能被k整除,则用k+1作为k的值,重复执行第一步。#include<stdio.h>main()int n,i;printf("nplease input a number:n");scanf("%d",&n);printf("%d=",n);for(i=2;i<=n;i+) while(n!=i)if(n%i=
22、0) printf("%d*",i);n=n/i; else break; printf("%d",n); 自然数对 :两个自然数的和与差都是平方数。如:8和 17 的和 8+17=25 与其差 17-8=9 ,25 和 9都是平方数 ,则(8 和 17)就是自然数对在 100以内有多少个自然数对列举出两个数的所有组合判断是否满足条件。#include<stdio.h>#include<math.h>main() int x,i,j,y;for(i=100;i>1;i-)for(j=1;j<100;j+) x=i+j;
23、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); 有 n 个整数,使其前面各数顺序向后移 m 个位置,最后 m 个数变成最前面的 m 个数 move(array,n,m)int n,m,array20;int *p,array_end;array_end=*(ar
24、ray+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()int number20,n,m,i;printf("the total numbers is:");scanf("%d",&n);printf("ninput %d nmuber",n);for(i=0;i<n;i+)scanf("%d",&numberi);printf("ba
25、ck m:");scanf("%d",&m);move(number,n,m); for(i=0;i<n;i+) printf("%d",numberi); 输入一字符串判断该字符串是否存在数字字符串, 统计数字字符串的个数并转换为整数输出。如:"abc1254pa45ui123",数字字符串个数为3转换成整数1254、45、123输出#include<stdio.h>int fun(char *str,long int *num) int i=0,flag=0,wz=1,n=0,k=0;char
26、temp50;dowhile(stri>='0'&&stri<='9') tempk+=stri;flag=1;i+;if(flag=1) while(-k>=0)numn=(tempk-'0')*wz+numn;wz*=10; k=0;n+;flag=0;wz=1; while(stri+);return n; main() char str50;long int num10=0;int total=0;printf("input string :n"); gets(str);total=f
27、un(str,num); printf("total=%d",total); while(total>0)printf("n%ld",num-total); 排序查找编程算法输入 5 个整数存到数组中并用插入法排序。插入法:每一步将一个待排序元素按其关键字值 的大小插入到已排序序列的适当位置上,直到待排序元素插入完为止。fun(int a,int n)int k,j,t; for(j=1;j<n;j+) t=aj;k=j-1; while(k>=0&&t>ak) ak+1=ak;k-;#include<std
28、io.h> / 小于 j 的为已排序列,大于 j 的为待排序列 /从待排序列中取一个值/ 让 k 指向已排序列/在已排序列找插入位置,并将以排序中的 /值顺序后移动直到移动到插入点ak+1=t; /k+1 的值就为插入点 main() int a5,i;for(i=0;i<5;i+)printf("ninput a%d=",i);scanf("%d",&ai); fun(a,5);for(i=0;i<5;i+)printf("%4d",ai); 用冒泡法对数组进行排序(升序) 。冒泡法排序:两两比较待排序序列
29、中的元素,并交换不满 足顺序要求的各对元素,直到全部满足顺序要求为止#include<stdio.h>void sort(int a,int n)int i,j,t; for(i=0;i<n-1;i+) for(j=0;j<n-i;j+)if(aj>aj+1)/ 两两比较 t=aj;aj=aj+1;aj+1=t;/ 交换不满足升序条件的数对void main()int a5=5,10,-7,3,7,i,t,j;sort(a,5); for(i=0;i<=4;i+) printf("%5d ",ai); 输入 10 个整数,并对 10 个数
30、进行排序(升序) 。选择法:即从 10 个数中(待排序数) ,选择 一个最小的与第一个元素交换,下次类推,即在后 9 个数中选择一个最小值第二个元素进行 交换。#define N 10main()int i,j,min,tem,aN;printf("please input ten num:n");for(i=0;i<N;i+) printf("a%d=",i);scanf("%d",&ai);printf("n");for(i=0;i<N;i+)/将输入的数据输出printf("%5
31、d",ai);printf("n");for(i=0;i<N-1;i+)min=i;/ 假设待排序中第 i 个数最小for(j=i+1;j<N;j+) /for 循环的目的是找最小的数if(amin>aj) min=j; / 找到一个更小的数tem=ai;/下面的语句将每次找到最小的数与第i 个数交换ai=amin;amin=tem; printf("After sorted n");for(i=0;i<N;i+)printf("%5d",ai); 输入一个值查找它在数组中是否存在,如果存在统计它在数
32、组中出现的次数。顺序查找:从 数组的首元素开始,逐个元素与待查找的关键字进行比较,直到找到相等的。若整个数组中 没有与待查找关键字相等的元素,就是查找不成功#include<stdio.h>main()int a10=3,56,56,9,9,12,34,46,67,44,i,x,cnt=0;printf("input x=");scanf("%d",&x);for(i=0;i<10;i+)if(x=ai)/ 顺序查找cnt+;if(cnt>0) printf("nFind,cnt=%d",cnt);el
33、se printf("Not Find"); 有 10 个数按升序放在一个数组中, 输入一个数, 要求用折半查找该数是数组中的第几个元素。 折半查找法:设数组长度为n,则将输入的数 m与an/2比较,若m<an/2,则将a0到an/2 的数继续折半进行查找;若m=n/2,则表示找到该数的位置;若m>n/2,则将an/2到an的数继续折半进行查找。#include<stdio.h>main()int a10=12,32,45,62,71,76,80,85,90,95;int num,bott,top,mid;printf("input a n
34、umber:n");scanf("%d",&num);bott=0;top=9;while(bott<=top)mid=(bott+top)/2;if(num=amid)printf("%d is the %d numbern",num,mid+1);break;else if(num<amid) top=mid-1;else bott=mid+1; if(bott>top) printf("Non"); 字符串编程算法字符数组 s1, s2 把 s2 在 s1 中出现的字符全部删除。 如 s1=&
35、quot;adeaabfce"s2="efd" 删除后 s1 中的值为: aaabc#include<stdio.h>main() char s150,s210,*p1,*p2;int i,j;p1=s1;p2=s2; printf("input s1:"); scanf("%s",p1); printf("input s2"); scanf("%s",p2);while(*p2) for(i=0,j=0;p1i!='0'i+)if(p1i!=*p2)/ 对
36、 p1 重新赋值达到删除目的 p1j+=p1i;p1j='0'/ 新字符串没有 '0' 需要给它赋值一个 p2+; puts(p1); 将 b 字符串连接到 a 后面 , 编写函数实现此功能 #include<stdio.h> void fun(char *a,char *b) while(*a+);/ 找'0' 的位置a-;/a 已经指向 '0'后面所以要自减while(*b) *a+=*b+;*a='0' main() char a100,b50; printf("input string
37、 a: "); scanf("%s",a); printf("input string b: "); scanf("%s",b); fun(a,b); printf("nstring a: %sn",a); 将 b 字符串复制到 a 中 ,编写函数实现此功能 #include<stdio.h> void fun(char *a,char *b) while(*b) *a+=*b+;*a='0' main() char a50,b50; printf("input st
38、ring b: "); gets(b); fun(a,b); printf("nstring a: %sn",a); while输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。分析:利用 语句 ,条件为输入的字符不为 'n' 。#include "stdio.h"main()char c;int letters=0,space=0,digit=0,others=0; printf("please input some charactersn"); while(c=getchar()!='n') if(c>='a'&am
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《2025专利权许可合同》
- 人工草坪铺设合同标准文本
- 中铁货物采购合同样本
- 仪器安装服务合同样本
- 保管合同样本写
- 供气出售意向合同样本
- 公司变更终止合同样本
- 农村养殖牛蛙合同样本
- 供应商战略合同标准文本
- 个人住宅出租合同样本
- 2024年全国中学生学联赛广西预选赛生物试卷(解析版)
- 幼儿园游戏回顾环节培训
- 国外中学物理实验教学现状分析
- 基于核心素养的初中英语阅读教学策略讲座培训课件
- 医院国家安全主题班会
- 失信应急和响应演练记录
- 2024-2029年中国新一代信息技术行业发展分析及发展前景与投资研究报告
- 医院反恐知识课件
- 唱给小萝卜头的歌
- 社会基本矛盾在历史发展中的作用
- 主题班会教案理解时尚,追求真美
评论
0/150
提交评论