c语言典型问题处理方法小结
- 格式:doc
- 大小:126.00 KB
- 文档页数:15
c 语言典型问题处理方法小结一、 循环问题 (1)、数论问题 1、求素数for(i=2;i<=a;i++) if(a%i==0)break;if (a==i)printf("yes\n");elseprintf("no\n"); 素数概念:对于某个整数a>1,如果它仅有平凡约数1和a ,则我们称a 为素数(或质数)。
整数 1 被称为基数,它既不是质数也不是合数。
整数 0 和所有负整数既不是素数,也不是合数。
2、求最大公约数和最小公倍数 a 、if(a>b) {t=a; a=b; b=t; }for(i=a;i>=1;i--)if(a%i==0&&b%i==0) break;printf("largest common divisor:%d\n",i);printf("least common multiple:%d\n",(a*b)/is); b 、辗转相除法求解 a1=a; b1=b;while(a%b!=0) {t=a%b; a=b; b=t; }printf("largest common divisor:%d\nleast common multiple:%d",b,a1*b1/b); 3、求完数一个数如果恰好等于它的因子之和,这个数就称为“完数”。
例如:6的因子为1、2、3,而6=1+2+3,因此6是“完数”。
第一个if 判断是否能被2,3,4……直到本身整除。
第二个if 判断是否只能被本身整除。
for(a=1;a<=1000;a++) { s=0;for(i=1;i<=a;i++) if (a%i==0) { s+=i; if(s>=a) break; } if(s==a)printf("%d\t",a); }4、分解质因数将一个整数写成几个质因数的连乘积,如: 输入36,则程序输出36=2*2*3*3 。
解一、 main() { int a,z,i; clrscr(); scanf("%d",&a); loop: for(z=2;z<=a;z++) { for(i=2;i<=z;i++) if(z%i==0) break; if(z==i) if(a%z==0) {k++;if(k==1)printf("%d=%d",a1,z); elseprintf("*%d",z); a/=z;goto loop; } } } 解二: main(){ int n, k=2, isfirst=1;printf("Input n="); scanf("%d",&n);注意S=0所放的位置看似简单,但要自己完整地写出来还真不容易!!! 竟然还动用了goto 语句,正好可以熟悉一下goto 语句的用法!!! 判断是否为质数 判断是否为a 的质因数 判断下一个数开始有要重新从2 开始了。
所以用loop 语句回到for 语句,这是for 语句仍从2初始化。
从2开始的原则不变,变的是a 的值。
用计数器来解决每行输入不同的问题。
while(k<=n) if(n%k==0){ if(isfirst) { printf("%d=%d", n, k); isfirst=0; } else printf("*%d",k); n/=k; } else k++; printf("\n"); }5、从键盘输入两个整数,输出这两个整数的商的小数点后所有1000位整数 for(i=1;i<=1000;i++){t=a%b;printf("%d",t*10/b); a=t*10; }printf("\n");6、编程计算并输出两个带分数的差。
带分数就是由一个整数和一个真分数合成的数,两个带分数(整数、分子、分母均大于0)从键盘输入,且带分数1大于带分数2,输入格式为:整数1[分子1/分母1],整数2[分子2/分母2]。
差要求化简,整个输出样式为(如差为整数,则无分数部分,如差的整数为0,则无整数部分):整数1[分子1/分母1]-整数2[分子2/分母2]=整数[分子/分母] 例如:输入:12[6/35],8[3/5]输出:12[6/35]-8[3/5]=3[4/7]又如:输入:6[2/3],4[12/18] 输出:6[2/3]-4[12/18]=2 又如:输入:9[7/8],9[3/8]输出:9[7/8]-9[3/8]=[1/2]main() {int z1,fz1,fm1,fz1x,z2,fz2,fm2,fz2x,z,fz,fm,fzx,i;scanf("%d[%d/%d],%d[%d/%d]",&z1,&fz1,&fm1,&z2,&fz2,&fm2); fz1x=z1*fm1+fz1; fz2x=z2*fm2+fz2; fm=fm1*fm2;fz=fz1x*fm2-fz2x*fm1;主要体会除法运算中小数形成的原因 解决这类题目从本质出发for(i=fm;i>=2;i--)if(fm%i==0&&fz%i==0){fz/=i;fm/=i;}z=fz/fm;fzx=fz%fm;if(fzx==0)printf("%d[%d/%d]-%d[%d/%d]=%d\n",z1,fz1,fm1,z2,fz2,fm2,z);else if(z==0)printf("%d[%d/%d]-%d[%d/%d]=[%d/%d]\n",z1,fz1,fm1,z2,fz2,fm2,fzx,fm);elseprintf("%d[%d/%d]-%d[%d/%d]=%d[%d/%d]\n",z1,fz1,fm1,z2,fz2,fm2,z,fzx,f m);}(2)近似问题1、书P122习题4-6#include "math.h"main(){float x,j=1,k,s,so;int n;scanf("%f",&x);s=x;so=x+1;for(n=1;fabs(s-so)>1e-6;n++){for(k=1;k<=n;k++)j*=k;so=s;if(n%2!=0)s-=x*x*x/((2*n-1)*j);elses+=x*x*x/((2*n-1)*j);}printf("%f\n",s);2、解方程问题:编程用二分法求解方程x3+4x2-10=0的解。
#include "math.h"main() 注意千万不要忘记添加#include “math.h”{float x,x1=1,x2=4,f1=-1,f;/*f1=x1*x1*x1+4*x1*x1-10;*/ while(fabs(x2-x1)>1e-6){x=(x1+x2)/2;f=x*x*x+4*x*x-10;if(f>0)x2=x;elsex1=x;}printf("%f\n",x);}(3)枚举法(4)数列问题二、数组问题(1)排序问题1、从小到大排序main(){int a[10],i,j,t;for(i=0;i<10;i++) scanf("%d",&a[i]);for(i=1;i<10;i++)for(j=0;j<10-i;j++)if(a[j]>a[j+1]){t=a[j+1];a[j+1]=a[j];a[j]=t;}for(i=0;i<10;i++)printf("%d ",a[i]); printf("\n");}2、从大到小排序main(){int a[10],i,j,t;for(i=0;i<10;i++)scanf("%d",&a[i]); for(i=1;i<10;i++)for(j=9;j>=i;j--)可以用/*if(f*f1<0)*/替代可以省略此句注意排序问题:1、须迅速,熟练,无差错经常插入在程序中间2、现使用最大数下沉冒泡法还可以使用最小数上浮冒泡法3、j控制前面一个数和后面一个数一一比较。
由于是最大数下沉,i+1后j仍要从0开始。
4、i控制这样的操作一共要做多少次5、注意i j的控制次数现使用最大数上浮冒泡法还可使用最小数下沉冒泡法if(a[j]>a[j-1]) {t=a[j-1]; a[j-1]=a[j]; a[j]=t; }for(i=0;i<10;i++) printf("%d ",a[i]); }(2)二维数组三、字符或字符串输入输出问题 (1)字符打印 1、打印*此类题的溯源为书P122 4.11(1),其他题都是它的拓展a 、* ** *** ****解题要点:此类题关键在于找到每行要打印的个数和行数的关系。
此题j==i b 、 **** *** ** *c 、* ** *** **** 解题要点: 在出现空格的时候,在找到每行要打印的‘*’个数和行数的关系后,还应找到空格和行数的关系,分不同的参数进行循环。
此题k==i j==n-i d 、for (i=1;i<=n;i++) 一共要输出的行数 {for(j=1;j<=i;j++) 每行要打印的*数 printf("*"); printf("\n"); }for(i=1;i<=n;i++) 一共要输出的行数{for(j=1;j<=n-i;j++) 控制空格数 printf(" "); for(k=1;k<=i;k++) 每行要打印的*数 printf("*"); printf("\n"); }j==n-i+1**** *** ***e 、*****************************************2、打印9*9乘法表解题要点:注意寻找行与列的规律。
i*ji 代表列 j 代表行3、九九乘法表 1 2 3 4 5 6 7 8 9 2 4 6 8 10 12 14 16 18 3 6 9 12 15 18 21 24 27 … … 9 18 27 36 45 54 63 72 814、杨晖三角形 11 1 12 11 3 3 1 1 4 6 4 11 5 10 10 5 1 1 6 15 20 15 6 1 (2)字符串打印问题for(i=1;i<=n;i++) { for(j=1;j<=n-i;j++) printf(" "); for(k=1;k<=2*i-1;k++) printf("*"); printf("\n"); } for(i=1;i<=n;i++) { for(j=1;j<=n-i;j++) printf(" "); for(k=1;k<=2*i-1;k++) printf("*"); printf("\n"); } for(i=1;i<=n-1;i++) { for(j=1;j<=i;j++) printf(" "); for(k=1;k<=2*(n-1-i)+1;k++) printf("*"); printf("\n"); } for(i=1;i<=9;i++) { for(j=1;j<=9;j++) printf("%-3d ",i*j); 注意输出格式的控制 printf("\n");}优秀文档,精彩无限! 1、2、输入一字符串小写换大写3、逆序输出for(int i=n;i>=0;i--) 蓝色部分可以简写为绿色部分 cout<<a[i-1];4、如输入:ab1 @3,;z 输出:ab1 @3,;zgets(a);while(a[0]==' ')for(i=0;a[i]!='\0';i++)a[i]=a[i+1];A B C D E ZZ A B C D E E Z A B C D D E Z A B C C D E Z A B B C D E Z A gets(a); puts(a); for(i=1;i<=5;i++) { t=a[5]; for(j=5;j>0;j--) a[j]=a[j-1]; a[0]=t; for(k=0;k<=5;k++)printf("%c",a[k]);printf("\n");}for(i=1;i<=7;i++) { a[i][1]=1; a[i][i]=1; }for(i=3;i<=7;i++) for(j=2;j<=i-1;j++) a[i][j]=a[i-1][j-1]+a[i-1][j]; 注意交换过程和把所有的数后移一位的方法char a[81];int i;gets (a);for(i=0;a[i]!='\0';i++)if(a[i]>='a'&&a[i]<='z')a[i]-=32;puts (a); 注意点: 1、 int i ,不要误打成char i 2、 a[i]!=’\0’不要误打成i!=’\0’ 3、 逻辑与&& 4、 单引号内表示字符 5、 不加单引号的字符型数据为其ASCII 码 gets (a); c=strlen(a); for(i=0;i<c/2;i++) {t=a[i];a[i]=a[c-1-i]; a[c-1-i]=t; } puts(a);注意此问题的思想方法: 要求一组数的逆序实质就是将其对称换位 注意点: 1、‘= =’ 2、while 语句的使用处体会 3、全面考虑问题for(i=0;a[i]!='\0';i++)if(a[i]==' '&&a[i+1]!=' ') printf("\n");else if(a[i]==' '&&a[i+1]==' ') {for(k=i;a[k]!='\0';k++) a[k+1]=a[k+2]; i--; } elseprintf("%c",a[i]);5、输入3个字符串,按从小到大排序输出这3个字符串。