1、求一个数的全部素因子(形如60=1*2*2*3*5)
#include<stdio.h> void main() { int m,n,i=1; printf("请输入一个整数: "); scanf("%d",&m); printf("%d=%d",m,i); for(n=2;n<=m;n++) { while(m%n==0) { printf("* %d",n); m=m/n; } } printf(" "); system("pause"); //屏幕结果显示语句 }
结果显示:
2、求一个数的全部因子
#include<stdio.h> void main() { int m,i; printf("请输入一个整数: "); scanf("%d",&m); printf("%d的全部因子有: ",m); for(i=1;i<=m/2+1;i++) { if(m%i==0) printf(" %d",i); } printf(" "); system("pause"); //屏幕结果显示语句 }
结果显示:
3、求100~200之间的全部素数
#include<stdio.h> #include<math.h> void main() { int n,j,i,m=0; for(n=101; n<200; n=n+2) /**偶数不可能是,直接过滤掉**/ { j = sqrt(n); for (i = 2; i <= j; i++) { if (n%i == 0) { break; } } if (i >= j + 1) { printf(" %d",n); m = m + 1; } if (m%10 == 0) /**m表示输入每10个数字一行,为了结果友好显示**/ { printf(" "); } } printf(" "); system("pause"); //屏幕结果显示语句 }
结果显示:
4、判断一个数是否是素数
#include<stdio.h> #include<math.h> void main() { int number,i,j; printf("请输入一个数:"); scanf("%d",&number); j = sqrt(number); for(i = 2; i <= j; i++) if (number%i == 0) break; if (i > j) printf(" %d是一个素数。 ",number); else printf(" %d不是素数。 ",number); system("pause"); //屏幕结果显示语句 }
结果显示:
5、判断一个年份是否是闰年
#include<stdio.h> void main() { int year,a; printf("请输入年份:"); scanf("%d",&year); if((year%4==0&&year%100!=0)||(year%400==0)) a=1; else a=0; if(a==1) printf(" %d年是闰年 ",year); else printf("%d年非闰年 ",year); system("pause"); //屏幕结构显示 }
结果显示:
6、求两个正整数a和b的最大公约数p与最小公倍数q
方法1:
p从a开始,检测p是否能同时整除a和b, 若是则停止循环,不是则令p减1,继续检测。
q从b开始,检测q是否能同时被a和b整除,若是则停止循环,不是则令q增1,继续检测。
#include<stdio.h> void main() { int a,b, temp,p, q; printf("请输入a和b: "); scanf("%d%d",&a,&b); if (b<a) //将输入的两个数中小的放在a中,大的放在b中 { temp=b; b=a; a=temp; } p=a; while( a%p!=0 || b%p!=0) p--; printf("这两个数的最大公约数是%d ",p); q=b; while( q%a!=0 || q%b!=0) q++; printf("这两个数的最小公倍数是%d ",q); system("pause"); //屏幕结果显示 }
结果显示:
方法2:(方法1的改进)
已知整数a,b及其最大公约数p,则直接可推算出最小公倍数q:q= a*b/p;
#include<stdio.h> void main() { int a,b, temp,p, q; printf("请输入a和b: "); scanf("%d%d",&a,&b); if (b<a) //将输入的两个数中小的放在a中,大的放在b中 { temp=b; b=a; a=temp; } p=a; while( a%p!=0 || b%p!=0) p--; printf("这两个数的最大公约数是%d ",p); q=a*b/p; printf("这两个数的最小公倍数是%d ",q); system("pause"); //屏幕结果显示 }
方法3:辗转相除(以1397与2413为例)
以大数2413为被除数,以小数1397为除数,相除得:商为1,余数为1016
以除数1397为被除数,以余数1016为除数,相除得: 商为1,余数为381
以除数1016为被除数,以余数381为除数, 相除得: 商为2,余数为254
以除数381为被除数, 以余数254为除数, 相除得: 商为1 ,余数为127
以除数254为被除数, 以余数127为除数,
相除得: 商为2,余数为0
~~发现能整除,则127就是最大公约数。整个计算过程为:
#include<stdio.h> void main() { int a,b, temp,m,r; printf("请输入a和b: "); scanf("%d%d",&a,&b); if (b<a) //将输入的两个数中小的放在a中,大的放在b中 { temp=b; b=a; a=temp; } m=a*b; while(a!=0) { r=b%a; b=a; a=r; } printf("这两个数的最大公约数是:%d ",b); printf("这两个数的最小公倍数是:%d ", m/b); system("pause"); //屏幕结果显示 }
结果显示:
7、输出所有“水仙花”数。
注:所谓“水仙花”数是指一个三位数,其各位数字的立方和等于该数本身。如153就是一个“水仙花数”,因为153=13+53+33
#include<stdio.h> void main() { int n,i,j,k; printf("所有的水仙花数为: "); for(n=100;n<1000;n++) { i=n/100; j=n/10-i*10; k=n%10; if(n==i*i*i+j*j*j+k*k*k) printf("%d ",n); } printf(" "); system("pause"); //屏幕结果显示 }
结果显示:
8、找出1000以内的所有“完数”
注:所谓“完数”是指一个数如果恰好等于它的因子之和,这个数就称为“完数”
如 6的因子是1 2 3,且6=1+2+3,所以6称为“完数”
#include<stdio.h> void main() { int m,s,i; printf("1000以内的所有完数有: "); for(m=2;m<=1000;m++) { s=0;//此处s=0一定要加,因为前几次循环的时候s的值已经改变 for(i=1;i<m;i++) if((m%i)==0) s=s+i; if(s==m) { printf("%d 它的因子有:",m); for(i=1;i<m;i++) if(m%i==0) printf("%d ",i); printf(" "); } } system("pause"); }
结果显示:
9-1、求一个数组的逆序排列
#include <stdio.h> #define N 5 void main() { int a[N],i,temp; printf("请输入数组a的元素:"); for(i=0;i<N;i++) scanf("%d",&a[i]); printf("数组a为:"); for(i=0;i<N;i++) printf("%d ",a[i]); printf(" "); for(i=0;i<N/2;i++) { temp=a[i]; a[i]=a[N-i-1]; a[N-i-1]=temp; } printf("数组a重排后为:"); for(i=0;i<N;i++) printf("%d ",a[i]); printf(" "); system("pause"); }
结果显示:
9-2、字符串逆序排列(采用函数调用)
#include <stdio.h> void main() { void inverse(char str[]); //对inverse函数的声明,如果将main函数放在inverse函数的后面,就不必在main函数中声明 char string[20]; printf("请输入一个字符串String:"); scanf("%s",string); printf(" "); inverse(string); printf("反转后的新字符串为:%s",string); printf(" "); system("pause"); } void inverse(char str[]) { int i; char temp; for(i=0;i<strlen(str)/2;i++) { temp=str[i]; str[i]=str[strlen(str)-i-1]; str[strlen(str)-i-1]=temp; } }
结果显示:
10、输出杨辉三角形(要求前N行)
分析:
杨辉三角形是(a+b)n 展开后各项的系数。如:
(a+b)0展开后为:1 系数为:1
(a+b)1展开后为:a+b 系数为:1,1
(a+b)2展开后为:a2+2ab+b2 系数为:1,2,1
(a+b)3展开后为:a3+3a2b+3ab2+b3 系数为:1,3,3,1
(a+b)4展开后为:a4+4a3b+6a2b2+4ab3+b4 系数为:1,4,6,4,1
..................
杨辉三角形的特点:
(1)各行的第一个数都是1
(2)各行的最后一个数也都是1
(3)从第3行起,除上面指出的第一个数和最后一个数外,其余格数是上一行的同列与前一列两个数之和
表示为:a[i][j]=a[i-1][j]+a[i-1][j-1],其中i表示行,j表示列
#include <stdio.h> #define N 11 void main() { int a[N][N],i,j; //数组为11行11列,0行0列不用 for(i=1;i<N;i++) { a[i][1]=1; //各行第一个元素设为1 a[i][i]=1; //对角元素设为1 } for(i=3;i<N;i++) for(j=2;j<=i-1;j++) a[i][j]=a[i-1][j]+a[i-1][j-1]; for(i=1;i<N;i++) { for(j=1;j<i;j++) printf("%d ",a[i][j]); printf(" "); } printf(" "); system("pause"); }
结果显示:
11、将两个字符串连接起来(注:不允许用自带函数strcat)
方法1:直接进行
#include <stdio.h> void main() { char str1[20],str2[20]; int i=0,j=0; printf(" 请输入第一个字符串:"); scanf("%s",str1); printf(" 请输入第二个字符串:"); scanf("%s",str2); while(str1[i]!='