1. 输入一个正整数n(n<1000),用筛选法求n之内的素数
源代码:
#include <stdio.h>
#include <math.h>
#define maxn 1000
int main()
{
int i,j,n;
int num,a[maxn];
while(scanf("%d",&n)!=EOF)
{
num=0;
for(i=0;i<n;i++)
{
a[i]=i+1; //数组中的每个数赋值1~n
for(j=2;j<=sqrt(a[i]);j++) //"挖掉"非素数:从2~sqrt(a[i])依次作为除数,若能整除,将其值置为0
{
if(a[i]%j==0)
{
a[i]=0;
break;
}
}
if(a[i]!=0 && i!=0) //a[i]不为0且不为1时,这个数是经筛选后的素数
{
num++;
printf("%d ",a[i]);
if(num%10==0) //控制每10个素数换一行
printf("\n");
}
}
printf("\n");
}
return 0;
}
程序截图:
2. 有一个已排好序的数组,要求输入一个数后,按原来排序的规律将它插入数组中
源代码:
#include <stdio.h>
#define maxn 1000
void InsertElement(int a[],int e,int n) //插入输入的数
{
int i,tmp=n; //记录元素下标,初值为n
for(i=0;i<n;i++) //对数组中已有元素逐个扫描
{
if(e<a[i]) //发现e比a[i]小,tmp记录下标并退出循环
{
tmp=i;
break;
}
}
for(i=n;i>tmp;i--) //元素依次后移(类似于顺序表操作)
a[i]=a[i-1];
a[tmp]=e; //在腾出的“空位”处将e插入
}
void Disp(int a[],int n) //输出
{
int i;
for(i=0;i<n-1;i++)
printf("%d ",a[i]);
printf("%d\n",a[n-1]);
}
int main()
{
int a[maxn],e,i,n;
while(scanf("%d",&n)!=EOF)
{
for(i=0;i<n;i++)
scanf("%d",&a[i]);
scanf("%d",&e);
InsertElement(a,e,n);
Disp(a,n+1); //输出时元素个数+1
}
return 0;
}
程序截图:
3. 打印杨辉三角形前n行
源代码:
#include <stdio.h>
#define maxn 50
int main()
{
int i,j,n;
int a[maxn][maxn];
for(i=0;i<maxn;i++) //各行第一个和最后一个数都是1,这里对所有元素置初值1
{
for(j=0;j<=i;j++)
a[i][j]=1;
}
for(i=2;i<maxn;i++) //从第3行开始,除上面指出的第一个和最后一个数外,其余各数是上一行同列和前一列两个数之和
{
for(j=1;j<i;j++)
a[i][j]=a[i-1][j]+a[i-1][j-1];
}
while(scanf("%d",&n)!=EOF)
{
for(i=0;i<n;i++)
{
for(j=0;j<i;j++)
printf("%d ",a[i][j]);
printf("%d\n",a[i][i]);
}
}
return 0;
}
程序截图:
4. 折半查找法的应用:输入一个数,用折半查找法找出该数在一个按递减有序、已存放15个元素的数组中的位置,找到则输出其逻辑序号(1~n),找不到则输出“无此数”
源代码:
#include <stdio.h>
void Find(int a[],int n)
{
int low=0,high=14,mid;
int flag=0;
while(low<=high)
{
mid=(low+high)/2;
if(a[mid]==n)
{
printf("%d\n",mid+1);
flag=1;
break;
}
else if(a[mid]>n)
low=mid+1;
else
high=mid-1;
}
if(flag==0)
printf("无此数\n");
}
int main()
{
int i,n,a[15];
while(scanf("%d",&a[0])!=EOF)
{
for(i=1;i<15;i++)
scanf("%d",&a[i]);
scanf("%d",&n);
Find(a,n);
}
return 0;
}
程序截图:
5. 求方程ax^2+bx+c=0的根,从主函数输入a,b,c的值(注意对a的讨论)
源代码:
#include <stdio.h>
#include <math.h>
void fun1(double a,double b,double c,double flag) //flag>0:两个不相等实根或单根
{
double x1,x2;
if(a==0)
{
x1=-c/b;
printf("%.2lf\n",x1);
}
else
{
x1=((-b)+sqrt(flag))/(2*a);
x2=((-b)-sqrt(flag))/(2*a);
printf("%.2lf %.2lf\n",x1,x2);
}
}
void fun2(double a,double b,double c,double flag) //flag=0:两个相等实根
{
double x1,x2;
x1=x2=(-b)/(2*a);
printf("%.2lf %.2lf\n",x1,x2);
}
void fun3(double a,double b,double c,double flag) //flag<0:两个共轭复根
{
double m,n;
m=(-b)/(2*a);
n=sqrt(-flag)/(2*a); //特别注意此时flag<0,开方时对flag取绝对值
printf("%.2lf+%.2lfi %.2lf-%.2lfi\n",m,n,m,n);
}
int main()
{
double a,b,c;
double flag;
while(scanf("%lf %lf %lf",&a,&b,&c)!=EOF)
{
flag=b*b-4*a*c; //根的判别式 接下来分flag>0 =0 <0三种情况讨论
if(flag>0)
fun1(a,b,c,flag);
else if(flag==0)
fun2(a,b,c,flag);
else
fun3(a,b,c,flag);
}
return 0;
}
程序截图:
6. 输入10个学生的姓名5门课的成绩,用函数求出每个学生的平均分、每门课的平均分、所有分数中最高分数对应的学生姓名和课程、平均分方差
源代码:
#include <stdio.h>
#include <math.h>
struct student
{
char name[32];
double sc[5];
double sum,aver;
}stu[10];
void Stuaver(struct student stu[],int n)
{
int i,j;
for(i=0;i<n;i++)
{
stu[i].sum=0;
for(j=0;j<5;j++)
stu[i].sum+=(stu[i].sc[j]);
stu[i].aver=stu[i].sum/5;
printf("stu%d:aver=%.2lf\n",i+1,stu[i].aver);
}
printf("\n");
}
void Classaver(struct student stu[],int n)
{
int i,j;
double clasum[5],claaver[5];
for(i=0;i<5;i++)
{
clasum[i]=0;
for(j=0;j<n;j++)
{
clasum[i]+=(stu[j].sc[i]);
claaver[i]=clasum[i]/n;
}
}
for(i=0;i<5;i++)
printf("class%d:aver=%.2lf\n",i+1,claaver[i]);
printf("\n");
}
void FindMax(struct student stu[],int n)
{
int i,j;
double scoremax=stu[0].sc[0];
for(i=0;i<n;i++)
{
for(j=0;j<5;j++)
{
if(stu[i].sc[j]>scoremax)
scoremax=stu[i].sc[j];
}
}
for(i=0;i<n;i++)
{
for(j=0;j<5;j++)
{
if(stu[i].sc[j]==scoremax)
{
printf("%s class%d\n",stu[i].name,j+1);
break;
}
}
}
printf("\n");
}
void Avfc(struct student stu[],int n)
{
int i;
double fc,sum1=0,sum2=0;
for(i=0;i<n;i++)
{
sum1+=pow(stu[i].aver,2);
sum2+=stu[i].aver;
}
fc=sum1/n-pow(sum2/n,2);
printf("Fc=%.2lf\n",fc);
}
int main()
{
int i,j;
for(i=0;i<10;i++)
{
scanf("%s",stu[i].name);
for(j=0;j<5;j++)
scanf("%lf",&stu[i].sc[j]);
}
Stuaver(stu,10);
Classaver(stu,10);
FindMax(stu,10);
Avfc(stu,10);
return 0;
}
程序截图:
7. 用函数实现:
①输入10个职工的姓名和职工号
②按职工号递增排序,姓名顺序随之调整
③输入一个职工号(主函数输入),用折半查找法找出该职工姓名(调用函数输出)
源代码:
#include <stdio.h>
#include <string.h>
struct worker
{
char name[32];
int num;
}wk[10];
void Input(struct worker wk[],int n)
{
int i;
for(i=0;i<n;i++)
scanf("%s %d",wk[i].name,&wk[i].num);
printf("\n");
}
void Output(struct worker wk[],int n)
{
int i;
for(i=0;i<n;i++)
printf("%s %d\n",wk[i].name,wk[i].num);
printf("\n");
}
void Sort(struct worker wk[],int n)
{
int i,j;
struct worker t;
for(i=0;i<n-1;i++)
{
for(j=0;j<n-1-i;j++)
{
if(wk[j].num>wk[j+1].num)
{
t=wk[j];
wk[j]=wk[j+1];
wk[j+1]=t;
}
}
}
printf("\n");
}
void Find(struct worker wk[],int num,int n)
{
int low=0,high=n-1,mid;
int flag=0;
while(low<=high) //注意临界条件
{
mid=(low+high)/2;
if(wk[mid].num==num)
{
printf("%s\n",wk[mid].name);
flag=1;
break;
}
else if(wk[mid].num<num)
low=mid+1;
else
high=mid-1;
}
if(flag==0)
printf("Not found!\n");
}
int main()
{
int num;
Input(wk,10);
Sort(wk,10);
Output(wk,10);
scanf("%d",&num);
Find(wk,num,10); //已保证职工号递增有序
return 0;
}
程序截图:
8. 输入一个十六进制数,输出相应的十进制数
源代码:
#include <stdio.h>
#include <math.h>
#include <string.h>
#define maxlen 10
void Turn(char num16[])
{
int i,num10=0;
int wei; //十六进制数对应数位
int flag=1; //判断标志:0-输入错误 1-输入正确
for(i=0;i<strlen(num16);i++)
{
if(!((num16[i]>='0' && num16[i]<='9') || (num16[i]>='A' && num16[i]<='F') || (num16[i]>='a' && num16[i]<='f')))
{
flag=0;
break;
}
}
if(flag==1)
{
for(i=0;i<strlen(num16);i++)
{
if(num16[i]=='A' || num16[i]=='a')
wei=10;
else if(num16[i]=='B' || num16[i]=='b')
wei=11;
else if(num16[i]=='C' || num16[i]=='c')
wei=12;
else if(num16[i]=='D' || num16[i]=='d')
wei=13;
else if(num16[i]=='E' || num16[i]=='e')
wei=14;
else if(num16[i]=='F' || num16[i]=='f')
wei=15;
else
wei=(num16[i]-'0');
num10+=(wei*pow(16,strlen(num16)-i-1));
}
printf("%d\n",num10);
}
}
int main()
{
char num16[maxlen];
while(scanf("%s",num16)!=EOF)
Turn(num16);
return 0;
}
程序截图:
9. 输入年月日,计算该日是该年的第几天
源代码:
#include <stdio.h>
void GetDay(int y,int m,int d)
{
int day=0;
while(m)
{
m--;
switch(m)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:day+=31;break;
case 4:
case 6:
case 9:
case 11:day+=30;break;
case 2:
{
if((y%4==0 && y%100!=0) || (y%400==0))
day+=29;
else
day+=28;
break;
}
}
}
day+=d;
printf("%d\n",day);
}
int main()
{
int year,month,day;
while(scanf("%d %d %d",&year,&month,&day)!=EOF)
GetDay(year,month,day);
return 0;
}
程序截图:
10. 用递归法将一个整数n转换成字符串
源代码:
#include <stdio.h>
void InttoString(int n)
{
char c;
int i;
if((i=n/10)!=0) //i记录n除以10取整的结果,不是最高位时,递归进行该过程
InttoString(i);
c=(n%10)+'0'; //取出n的最高位,并转换为字符
printf("%c ",c);
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
if(n<0) //n为负数时,预先打印负号,并对n取相反数后调用InttoString(n)函数
{
printf("- ");
n=-n;
}
InttoString(n);
printf("\n");
}
return 0;
}
程序截图:
11. 用递归法求n阶勒让德多项式的值
源代码:
#include <stdio.h>
double Cal(int n,int x)
{
double result;
if(n==0)
result=1;
else if(n==1)
result=x;
else
result=(2*n-1)*x*Cal((n-1),x)-(n-1)*Cal((n-2),x)/n;
return result;
}
int main()
{
int n,x;
while(scanf("%d %d",&n,&x)!=EOF)
printf("%.2lf\n",Cal(n,x));
return 0;
}
程序截图:
12. 汉诺塔问题:递归求解盘子移动路径
源代码:
#include <stdio.h>
void move(char x,char y)
{
printf("%c->%c\n",x,y);
}
void hanoi(int n,char one,char two,char three)
{
if(n==1)
move(one,three);
else
{
hanoi(n-1,one,three,two);
move(one,three);
hanoi(n-1,two,one,three);
}
}
int main()
{
int m,time=0;
while(scanf("%d",&m)!=EOF)
{
hanoi(m,'A','B','C');
}
return 0;
}
程序截图: