标准算法整理Ι
来源:互联网 发布:阿里云域名修改dns 编辑:程序博客网 时间:2024/06/01 21:24
(一) 分离数字
将整数m的各位数字拆分,由低位到高位存储在c[n]中,c[0]是个位数
i=0; do{ c[i++]=m%10; m/=10; }while(m);
应用
1.水仙花数(Armstrong number):
各位数字的立方和等于该数的三位数,输出所有水仙花数。
#include <stdio.h>#define N 3int main() { long i,j,m,n,s,t,a,b,c[N]; for(a=1,i=0;i<N-1;i++) a*=10; b=a*10; if(b==10) a=0;//确定检索范围 for(n=a;n<b;n++) { m=n; i=0; do{ c[i++]=m%10; m/=10; }while(m); //数字分离应用 for(t=i=0;i<N;i++) { for(j=0,s=1;j<N;j++) s*=c[i]; t+=s; } if(n==t) printf("%ld ",n); } return 0;}
2.相亲数:
彼此的全部约数和(除本身外)都与另一方相等
220的全部约数相加:1+2+3+4+10+11+20+22+44+55+110=284
284点全部约束相加:1+2+4+71+142=220
输出30000以内所有的相亲数
#include <stdio.h>#define N 30000//先提条件再相亲int main() { int i,j,k; unsigned s[N]; for(i=2;i<N;i++) for(j=1,s[i]=0;j<i;j++) { if(i%j==0) s[i]+=j; }//提条件,记录所有数的约数和 for(i=2;i<N;i++) { j = s[i]; if((j>i)&&(j<N)) { if (i == s[j])//搜索一轮 { printf("%d:", i); for (k = 1; k < i; k++) if (i % k == 0) printf("%d ", k); printf("\n"); printf("%d:", j); for (k = 1; k < j; k++) if (i % k == 0) printf("%d ", k); printf("\n"); printf("\n"); } } } return 0;}
3.进制转换
十进制无符号数转成所需为基数(2-16)的进制数
分离数字是特殊情况,转为基数为10的进制数
#include <stdio.h>void f1(long m,int k) //对整数部分操作{ int i=0,s[30]; char t[]="0123456789abcdef"; //定位法 do{ s[i++]=m%k; m/=k; }while(m); for(i--;i>=0;i--) printf("%c",t[s[i]]); //the point}void f2(double n,int k) //对小数部分操作{ int i=0,s[5]; char t[]="0123456789abcdef"; for(i=0;i<5;i++) { s[i]=(int)(n*k); n=n*k-s[i]; } printf("."); for(i=0;i<5;i++) // 小数点后保留5位 printf("%c",t[s[i]]); printf("(%d)\n",k);}int main() { int k; long a; double x,b; printf("x,k=?"); scanf("%lf,%d",&x,&k); if(x<0||k<2||k>16) goto next; a=(long)x; b=x-a; f1(a,k); f2(b,k); next:; return 0;}
(二)分类计数
灵活使用ascii码
应用
投票问题:
已知十个投票人,三个候选人,统计候选人得票数和分别来自教师,学生,职工的票数,并输出无效票数。
选票格式:
A.Li B.Zhang C.Wang
1.Teacher 2.Student 3.Worker
#include <stdio.h>//用结构体实现int main() { int i,j,s,n=0; char person,dept; struct { char name[10]; int count[3]; }a[]={{"Li",0,0,0},{"Zhang",0,0,0},{"Wang",0,0,0}}; for(i=1;i<=10;i++) { scanf("%c%c",&person,&dept); if((person>='A'&&person<='C')&&(dept>='1'&&dept<='3')) a[person-'A'].count[dept-'1']++; //分类计数的核心 else n++; } printf("Candidate Teacher Student Worker TOTAL\n"); for(i=0;i<3;i++) { printf("%9s:",a[i].name); for(j=s=0;j<3;j++) { printf("%-7d ",a[i].count[j]); //-7d:左对齐,最多7位 s+=a[i].count[j]; } printf("%-7d\n",s); } printf("error --- %d\n",n); return 0;}
(三)辗转相除法
求最大公约数和最小公倍数
1)M除以N求余数R,N->M,R->N;
2)若R不等于0,重复1;若R等于零,M为最大公约数
#include <stdio.h>int main() { int m,n,u,r; printf("m,n=?"); scanf("%d %d",&m,&n); u=m*n; do{ r=m%n; m=n; n=r; }while(r); printf("m1=%d,m2=%d\n",m,u/m); return 0;}
应用:
求三个数的最大公约数和最小公倍数
#include <stdio.h>int GCD(int m,int n){ int r; do{ r=m%n; m=n; n=r; }while(r); return m;}int main() { int m,n,k,s1,s2,t1,t2; printf("m,n,k=?"); scanf("%d %d %d",&m,&n,&k); s1=GCD(m,n); s2=m*n/s1; t1=GCD(s1,k); printf("m1=%d,",t1); t1=GCD(s2,k); t2=s2*k/t1; printf("m2=%d\n",t2); return 0;}
(四)判断质数
子函数
int Prime(int num){ int temp=sqrt(num); if(num<=1) return 0;//0,1不是质数 for(int i=2;i<=temp;i++) if(num%i==0) return 0; return 1;}
阅读全文
0 0
- 标准算法整理Ι
- 标准算法整理ΙΙ
- 标准算法整理III
- 【算法整理】听说你写的算法很牛?-优质算法衡量标准探讨
- 【算法整理】听说你写的算法很牛?-优质算法衡量标准探讨
- 【算法整理】听说你写的算法很牛?-优质算法衡量标准探讨
- web标准常见问题整理
- web标准常见问题整理
- web标准常见问题整理
- web标准常见问题整理
- 电子政务绩效评价标准整理
- web标准常见问题整理
- 标准SQL资料整理
- 历代C++标准整理
- 算法整理
- 算法整理
- 算法整理
- 算法整理
- 「吃鸡」游戏火爆背后,谁来给服务器降降温?
- 配电房来了个傻员工,改变了所有聪明的员工!
- 优先队列优化的 Dijkstra算法
- 改变计算机界的存储解决方案:RAID,30岁生日快乐!
- “数据中心迁移到IDC数据中心”最怕遇到这几个问题
- 标准算法整理Ι
- 安装多台tomcat配置
- 几个常见的算法
- 漫画告诉你什么是屎一样的代码(屎里蕴含着代码的秘密)
- Spring—AOP介绍
- CentOS7 常用命令集合
- C# 程序关闭托盘图标不会自动消失
- JAVA8新特性
- 欢迎使用CSDN-markdown编辑器