例题一:求最大最小平均值
#include<stdio.h>
int main()
{
int n,max,min,i=0,f;
float average=0.0;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&f);
if(i==0)
{
max=f;
min=f;
}
average+=f;
if(f>max) max=f;
else if(f<min) min=f;
}
average=average/n;
printf("最大值:%d\n",max);
printf("最小值:%d\n",min);
printf("平均值:%.1f\n",average);
return 0;
}
例题二:自建字符串连接函数
编写一个字符串连接函数
方法一
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char* cat(char* a,char* b)
{
int alen=strlen(a),blen=strlen(b),i=0;
char* p=(char*)malloc((alen+blen+1)*sizeof(char));
for(i=0;i<alen;i++)
{
p[i]=a[i];
}
for(i=alen;i<alen+blen;i++)
{
p[i]=b[i-alen];
}
p[alen+blen]='\0';
return p;
}
int main()
{
char arr1[30],arr2[30],*p;
gets(arr1);
gets(arr2);
p=cat(arr1,arr2);
puts(p);
return 0;
}
运行结果:
注:这里的cat函数有两个参数,首先使用malloc函数开辟一片空间,空间大小由传入的两个数组的长度决定,总长度为len(a)+len(b)+1,其中最后一个用来存放'\0'。首先从0~len(a)-1,分别将a的内容一一复制到新创建的数组p上,接下来将从len(a)~len(a)+len(b)-1,将b数组的内容一一复制到新数组。这里p是从len(a)开始,而b要从0开始,所以b1的下标为(i-alen)。
方法二
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char* cat(char* a,char* b)
{
int i,j,alen,blen;
alen=strlen(a);
blen=strlen(b);
char* p=(char*)malloc((alen+blen+1)*sizeof(char));
for(i=0;i<alen;i++)
{
p[i]=a[i];
}
for(j=0;j<blen;j++)
{
p[alen+j]=b[j];
}
p[alen+blen]='\0';
return p;
}
int main()
{
char arr1[30],arr2[30],*p;
gets(arr1);
gets(arr2);
p=cat(arr1,arr2);
puts(p);
return 0;
}
这里用到了两个下标,i和j,第一次循环i改变,第二次循环j改变。
例题三:计算器设计
计算器程序设计,用户输入运算数和四则运算符,输出计算结果。
#include<stdio.h>
int main()
{
float a,b;
char c;
printf("input xepression:a+(-、*、/)b=\n");
scanf("%f%c%f",&a,&c,&b);
switch(c)
{
case '+':
{
printf("%f\n",a+b);
break;
}
case '-':
{
printf("%f\n",a-b);
break;
}
case '*':
{
printf("%f\n",a*b);
break;
}
case '/':
{
printf("%f\n",a/b);
break;
}
default:printf("input error\n");
}
return 0;
}
运行结果:
例题四:车牌限行
已知某市的车牌号采用限行制度,星期一限行车牌号尾数为1、6;星期二为2、7,星期三为3、8;星期四为4、9;其他尾数为星期五。
#include<stdio.h>
int main()
{
int x,y;
scanf("%d",&x);
y=x%10;//除10取余得到最低位!
if(y==1||y==6) printf("周一限行");
else if(y==2||y==7) printf("周二限行");
else if(y==3||y==8) printf("周三限行");
else if(y==4||y==9) printf("周四限行");
else printf("周五限行");
return 0;
}
运行结果
例题五:求圆周率
求圆周率pi的近似值,计算公式为
#include<stdio.h>
#include<math.h>
int main()
{
int s=1;//以此来表示符号
double n=1.0,pi=0.0,t=1.0; //n为分母,pi为各项不断累加,t为这一个项的的值
while(fabs(t)>1e-6)
{
t=s*1/n;
pi+=t;
s=-s;//每循环一次改变一次符号
n+=2;//分母每次加2
}
pi=4*pi;
printf("PI:%lf",pi);
return 0;
}
例题六:倒序输出
从键盘输入一个非负整数,并将此数倒叙输出(如输入:12345,输出54321)
#include<stdio.h>
int main()
{
int x,s=0;
scanf("%d",&x);
while(x!=0)
{
s=x%10;//取最低位
x/=10;//将最低位舍去
printf("%d",s);
}
return 0;
}
例题七:判断素数
#include<stdio.h>
#include<math.h>
int isprime(int n)
{
if(n==1) return 0;
if(n==2) return 1;
int i,flag=1;//flag作为标记位,默认为素数
for(i=2;i<sqrt(n)+1;i++)
{
if(n%i==0)
{
flag=0; //有能够整除的,就说明不是素数。
break;
}
}
return flag;
}
int main()
{
int x;
scanf("%d",&x);
if(isprime(x)) printf("%d是素数",x);
else printf("%d不是素数",x);
return 0;
}
注意:1不是素数,2是素数要单独判断
例题八:统计个十百位不同的数字个数
统计100~999中,个位,十位,百位数字各不相同的整数的个数。
方法一
#include<stdio.h>
int main()
{
int a,b,c,count=0;
for(a=1;a<=9;a++)
{
for(b=0;b<=9;b++)
{
for(c=0;c<=9;c++)
{
if(a!=b&&a!=c&&b!=c) count++;
}
}
}
printf("count=%d",count);
return 0;
}
注:这里将a,b,c分别作为这个数字的百位、十位、个位。
方法二
#include<stdio.h>
int main()
{
int i,a,b,c,count=0;
for(i=100;i<=999;i++)
{
c=i%10;//获取个位
b=(i/10)%10;//获取十位
a=(i/100);//获取百位
if(a==b||a==c||b==c) continue;//不符合条件时,跳出本层循环,count不进行自加
count++;
}
printf("count=%d",count);
return 0;
}
例题九:百钱买百鸡(解三元二次方程)
100个铜钱买了100只鸡,其中公鸡一只5钱,母鸡一只3钱,小鸡一钱3只,问100只鸡中公鸡、母鸡、小鸡各多少?罗列出所有可能的答案。
设,公鸡、母鸡、小鸡分别位x,y,z只。则,;
#include<stdio.h>
int main()
{
int x,y,z;
for(x=0;x<=20;x++)
{
for(y=0;y<=34;y++)
{
for(z=0;z<=100;z+=3)
{
if((5*x+3*y+y/3==100)&&(x+y+z==100))
printf("公鸡:%2d个,母鸡:%2d个,小鸡:%2d个\n",x,y,z);
}
}
}
return 0;
}
例题十:求最大公因数和最小公倍数
输入两个数,打印出两个数的最小公倍数和最大公因数。
方法一:枚举法
#include<stdio.h>
int gcf(int a,int b)
{
int c;//用来存储潜在的最大公因数
c=a<b?a:b;//找出两个数中最小的,因为最大公因数一定<=两数间最小的
while(1)
{
if(a%c==0&&b%c==0)//极限境况是c自减到1
{
return c;
}
else c--;
}
}
int lcm(int a,int b)
{
int c;//存储潜在小公倍数
c=a>b?a:b;
while(1)
{
if(c%a==0&&c%b==0)
{
return c;
}
else c++;
}
}
int main()
{
int a,b;
scanf("%d%d",&a,&b);
printf("最大公因数:%d\n",gcf(a,b));
printf("最小公倍数:%d\n",lcm(a,b));
return 0;
}
方法二:欧几里得算法(辗转相除法)
只要改变一下,求最大公因数的函数gcf就可以了。
int gcf(int a,int b)
{
int t;
while(t=a%b)
{
a=b;
b=t;
}
return b;
}
例题11:s=a+aa+aaa+...
其中a是任意数,几个数需要键盘输入。
#include<stdio.h>
int main()
{
int n,a,i=0,s=0,sum=0;
scanf("n=%d,a=%d",&n,&a);
for(i=0;i<n;i++)
{
s=s*10+a;
sum+=s;
}
printf("%d\n",sum);
return 0;
}
例题12:统计“完全数”
输入一个数字n,统计1~n的完全数个数,完全数:一个属等于自身所有因子之和。
(如1+2+3=6,6就是完全数)
题目转化为求一个数的所有因子。
#include<stdio.h>
int main()
{
int n,i,j,sum=0,count=0;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
for(j=1;j<(int)(i/2)+1;j++)
{
if(i%j==0)
{
sum=sum+j;
}
}
if(sum==i)
{
count++;
printf("%d是完全数\n",i);
}
sum=0;//循环一个i,将sum归零,重新进行下一个i的判断!
}
printf("完全数共 %d个",count);
return 0;
}
这里特别要注意的是每次循环一个i后要进行对sum的归零处理!