1.使用辗转相除法求两个数的最大公约数和最小公倍数
int a,b,c,d,i,gcm,lcm,temp;
scanf("%d%d",&a,&b);
c=b;
d=a;//c、d用来保存原始的a b 的值
//判断输入a b 的大小,如果a < b,交换值。
if(a<b){
temp=a;
a=b;
b=temp;
}
//辗转相除法
do{
i=a%b;
if(i==0)
break;
a=b;
b=i;
}while(i != 0);
gcm=b;
lcm=d*c/gcm;//最小公倍数
printf("最大公约数gcm为%d\n",gcm);
printf("最小公倍数lcm为%d\n",lcm);
2.求几位数并且逆序输出
int num,n,h_num,t_num,n_num;
scanf("%d",&num);
if(num>999){
n=0;
}else if(num>99){
n=3;
printf("这是一个%d位数\n",n);
}else if(num>9){
n=2;
printf("这是一个%d位数\n",n);
}else {
n=1;
printf("这是一个%d位数\n",n);
}
switch(n){
case 3:h_num=num/100;t_num=num/10%10;n_num=num%10;printf("%d\n",h_num);printf("%d\n",t_num);printf("%d\n",n_num);printf("逆序输出为%d%d%d\n",n_num,t_num,h_num);break;
case 2:t_num=num/10;n_num=num%10;printf("%d\n",t_num);printf("%d\n",n_num);printf("逆序输出为%d%d\n",n_num,t_num);break;
case 1:printf("%d\n",num);
case 0:printf("输入数值超过范围\n");
}
3.求解三角形面积
需要用到sqrt函数,需引入math.h头文件
#include <math.h>
//解法1
double a, b, c, x;
scanf("%lf %lf %lf", &a, &b, &c);
x = (a+b+c)/2;
if(a+b>c && a+c>b && b+c>a){
printf("%.3f", sqrt(x*(x-a)*(x-b)*(x-c)));
}else{
printf("输入数值不能构成三角形\n");
}
//解法2
if(a<b){
if(b<c){
(a+b) > c ? printf("%.3f", sqrt(x*(x-a)*(x-b)*(x-c))): printf("输入数值不能构成三角形\n");
}else{
(a+c) > b ? printf("%.3f", sqrt(x*(x-a)*(x-b)*(x-c))): printf("输入数值不能构成三角形\n");
}
}else if(a>c){
(c+b) > a ? printf("%.3f", sqrt(x*(x-a)*(x-b)*(x-c))): printf("输入数值不能构成三角形\n");
}
4.打印水仙花数(水仙花数:一个3位数,每位数字的立方和等于该数本身)
int a,b,c,t;
for(int num=100;num<1000;num++){
a=num/100;
b=num/10%10;
c=num%10;
t=a*a*a+b*b*b+c*c*c;
if (t == num)
printf("%d\t",num);
}
程序运行结果如下:
水仙花数
5.求解兔子数量问题--Fibonacci 数列问题
int f1=1,f2=1;
printf("%12d\t%12d\t",f1,f2);//打印第一二个月的兔子数量
for(int i=1;i<=20;i++){ //一次算出两个月的数量,所以只需算20次
f1=f2+f1; //将第三个月的兔子数量赋给f1
f2=f1+f2; //将第四个月的兔子数量赋给f2
if(i%3==0){
printf("\n"); //控制输出6个数换行
}
printf("%12d\t%12d\t",f1,f2);
}
程序运行结果如下:
运行结果
6.使用冒泡排序法对输入的数字进行排序
冒泡排序法的关键在于:如果有N个数字,那么总共就需要比较N-1趟,每一趟中两个数字比较的次数是N减趟数。比如:
我们用n来代表有n个数字,j来代表趟数,第一趟 j=1,第二趟 j=2,依次类推,有n个数字就需要总的趟数 j=n-1。i来表示每一趟中两个数字比较的总次数,比如第一趟(j=1)两个数字相互比较总次数 i=4(i=n-j=5-1),第二趟(j=2)两个数字相互比较总次数 i=3(i=n-j=5-2)。(引入次数i只是为了方便理解,在实际程序中“比较次数i”并不是我们要得到的,我们要得到的是输出排序完的数字)
举个例子吧,输入的数字有5个(n=5),总共需要比较的趟数4趟(j=n-1=5-1=4),第一趟(j=1)两个数字互相比较总次数4次(i=5-1),第二趟(j=2)两个数字互相比较总次数3次(i=5-2),依次到第四趟的时候,两个数字互相比较的总次数1次,至此排序也就完成了。采用两个for循环嵌套使用来分别控制总趟数 j 和每一趟的总次数 i
int a[5]; //定义一维数组存放输入值
int i=0,j =0,t; //i用来表示数组下标,j用来表示趟数,t作为交换值的中间变量
printf("请输入5个数字:\n");
//获取键盘输入的5个值
for(i=0;i<5;i++){
scanf("%d",&a[i]);
}
for(j=0;j<4;j++){ //输入5个数字,需进行4趟排序,所以j<4;如果j原始值为1,条件就为j<5 (趟数比输入数字少1)
for(i=0;i<4-j;i++){ //每趟排序的次数比趟数少一次,如第一趟需对比4次,第二趟需对比3次 (总趟数4-第几次趟数j)
if(a[i]>a[i+1]){
t=a[i]; //相邻两个数进行比较
a[i]=a[i+1];
a[i+1]=t;
}
}
}
printf("进行排序后为:\n");
for(i=0;i<5;i++){
printf("%d\t",a[i]);
}
printf("\n");
程序运行结果:
运行结果
7.求一个3*3矩阵对角线元素之和。
int a[3][3];
int i,j;
printf("请输入9个数字:");
for(i=0;i<3;i++){
for(j=0;j<3;j++){
scanf("%d",&a[i][j]);
printf("%5d",a[i][j]);
}
printf("\n");
}
printf("对角线元素之和为:%d\n",a[0][0]+a[1][1]+a[2][2]);
/*
int sum=0;
for(i=0;i<3;i++){
sum += a[i][i]; //求对角线元素之和的第二种方法
}
printf("对角线元素之和为:%d\n",sum);
*/
输出结果如图:
3*3矩阵对角线之和
8.将一个数组中的值按逆序重新存放。
int a[5]={8,5,4,2,1};
int b,i;
for(int j=0;j<4;j++)
for(i=0;i<4-j;i++){
b=a[i];
a[i]=a[i+1];
a[i+1]=b;
}
for(i=0;i<5;i++){
printf("%d\t",a[i]);
}
输出结果如图:
逆序输出
(其实就是冒泡排序法的思路,只是冒泡排序时,需要将值交换后插入位置,而这个不用,只是简单的交换顺序而已)
8.编程实现从键盘输入一句话保存在数组中,统计其包含的英文字母个数并输出统计结果。
char strl[81];
char c;//定义字符c,用来存放输入字符串的每个字符
int i,num=0;
gets(strl);//输入一个字符串到字符数组,并得到一个函数值(也就是字符数组的起始地址)
for(i=0;(c=strl[i]) !='\0';i++){ //如果输入的是换行,结束循环
if(c >='a'&& c <= 'z' || c >='A' && c <='Z'){
num++;
}
}
printf("字母个数为%d\n",num);
运行结果:
运行结果
9.输入一行字符,统计其中有多少个单词,单词之间以空格隔开
char strl[81];
char c;//定义字符c,用来存放输入字符串的每个字符
int i,num=0,word=0;
gets(strl);//输入一个字符串到字符数组,并得到一个函数值(也就是字符数组的起始地址)
for(i=0;(c=strl[i]) !='\0';i++){ //如果输入的是换行,结束循环
if(c == ' '){
word=0;
}else if(word == 0){
word=1;
num++; //num+1,表示增加一个单词
}
}
printf("单词个数为%d\n",num);
运行结果:
运行结果
网友评论