ps:建议结合书本食用哟!
5.7 输出一个不大于五位数的数的每个位的数字,并倒序输出,并指出它是几位数
思路:由于规定了不大于五位数,所以利用除法得到每个位置的数字,然后判断输入的数字范围,进行对应的输出
#include
#include
//输出一个不大于五位数的数的每个位的数字,并倒序输出,并指出它是几位数
int main()
{
int x,y,z,a,b,c;
printf("输入一个不大于五位数的数字\n");
scanf("%d",&x);
y = x/10000;
z=(x-(y*10000))/1000;
a=(x-y*10000-z*1000)/100;
b=(x-y*10000-z*1000-a*100)/10;
c=(x-y*10000-z*1000-a*100-b*10);
if(x>=10000)
{
printf("五位数\n");
printf("输出每个位置的数字,并按逆序排序:\n");
printf("%d %d %d %d %d\n",y,z,a,b,c);
printf("%d %d %d %d %d\n",c,b,a,z,y);
}
else
{
if(x>=1000)
{
printf("四位数\n");
printf("%d %d %d %d\n",c,b,a,z);
}
else
{
if(x>=100)
{
printf("三位数\n");
printf("%d %d %d\n",c,b,a);
}
else
{
if(x>=10)
{
printf("两位数\n");
printf("%d %d\n",c,b);
}
else
{
printf("一位数\n");
printf("%d\n",c);
}
}
}
}
}
5.8 (switch实现)利润计算
思路:输入I后,利用switch进行分段处理
#include
#include
int main()
{
printf("输入本月利润:\n");
float I,S;
int x;
scanf("%f",&I);
x = I/100000;
if(x>10)
S=(I-x*100000)*0.01+10000+7500+10000+6000+6000;
else
{
switch(x)
{
case 0:S=I*0.1;break;
case 1:S=(I-x*100000)*0.075+10000;break;
case 2:
case 3:S=(I-x*100000)*0.05+10000+7500;break;
case 4:
case 5:S=(I-x*100000)*0.03+10000+7500+10000;break;
case 6:
case 7:
case 8:
case 9:S=(I-x*100000)*0.015+10000+7500+10000+6000;break;
default:printf("error!\n");
}
}//一定要记得加break 使switch能够出来而不是继续执行下面语句
printf("该发的奖金为:%f",S);
return 0;
}
5.9 输入四个整数,从小到大顺序输出
思路:if 慢慢比大小就行
这里用了指针进行两数交换的方法(maxs函数中,注意写法)
#include
#include
#include
int maxs(int*x,int*y);
int main()
{
float a,b,c,d,e;
printf("输入四个整数,按从小到大顺序排列\n");
scanf("%d%d%d%d",&a,&b,&c,&d);
if(a>b)
maxs(&a,&b);
if(a>c)
maxs(&a,&c);
if(a>d)
maxs(&a,&d);
if(b>c)
maxs(&b,&c);
if(b>d)
maxs(&b,&d);
if(c>d)
maxs(&c,&d);
printf("将排好的顺序输出:\n");
printf("%d,%d,%d,%d\n",a,b,c,d);
return 0;
}
int maxs(int*x,int*y)
{
float e;
e=*x;
*x=*y;
*y=e;
}
5.10 判断坐标是否在四个圆形建筑上
int main()
{
float x,y;
printf("输入横纵坐标:\n");
scanf("%f%f",&x,&y);
if((x-2)*(x-2)+(y-2)*(y-2)<=1)
printf("该地建筑高10m");
else
{
if((x-2)*(x-2)+(y+2)*(y+2)<=1)
printf("该地建筑高10m");
else
{
if((x+2)*(x+2)+(y-2)*(y-2)<=1)
printf("该地建筑高10m");
else
{
if((x+2)*(x+2)+(y+2)*(y+2)<=1)
printf("该地建筑高10m");
else
printf("该地没有建筑,为0m");
}
}
}
}
练习1:斐波那契数列输出
1 1 2 3…
#include
#include
//斐波那契数列输出
int main()
{
int a=1,b=1,c=0,i;
printf("1\n1\n");
//注意循环中的迭代
for(i=1;i<=38;i=i+1)
{
c=a+b;
printf("%d\n",c);
a=b;
b=c;
}
return 0;
}
练习2:输出100-200之间的所有的素数
//该程序来实现在100-200之间输出所有的素数
int main()
{
int a,b,c;
scanf("%d%d%D", &a, &b, &c);
for(a=100;a<200;a=a+1)//a在100-200之间变化
{
for(c=2;c<a;c=c+1)//c在2-a之间变化
{
b=1;
if(a%c==0)//如果a能整除c
break;//退出循环
else
b=0;//当a无法整除2-a之间的任意数,它应该是素数
}
if(b==0)
printf("%d\n",a);//输出a
}
return 0;
}
6.1 求两个正整数的最大公约数和最小公倍数
方法一:纯枚举法。。。大一写的(变量也很混乱。。。大家写程序千万别这样写。。。)
int main()
{
int x,y,i,k,a,b,c,d;//c为最大公因数,d为最小公倍数
printf("enter two number:\n");
scanf("%d %d",&x,&y);
for(i=1;;i=i+1)
{
for(k=1;;k=k+1)
{
if(x%k==0)
a=k;
if(y%k==0)
b=k;
if(a==b)
c=a;
if(x>y)
{
if(k==y)
break;
}
else
{
if(k==x)
break;
}
}
if(i%x==0)
{
if(i%y==0)
{
d=i;
break;
}
}
}
printf("最大公因数为:%d\n",c);
printf("最小公倍数为:%d\n",d);
return 0;
}
方法二:辗转相除+递归
//得到最大公因数
int gcd(int a, int b)
{
return !b?a:gcd(b, a%b);
}
int main()
{
int a, b;
scanf("%d%d", &a, &b);
int c = gcd(a, b);
int d = a*b/c;//由最大公因数得到最小公倍数
printf("最大公因数为:%d\n",c);
printf("最小公倍数为:%d\n",d);
return 0;
}
6.3 求a+aa+aaa+aaa…的值
思路:找到每个值构成的规律即可使用循环完成
int main()
{
int n,i,s=0,a;
printf("请输入n的值和a的值:\n");
scanf("%d%d",&n,&a);
for(i=1;i<=n;i=i+1)
{
s=s+a;
a=s+a*10;
}
printf("输出值为:%d",s);
}
6.4 求阶乘
int main()
{
long long int n,i,s1,s2=0;
for(n=1;n<=20;n=n+1)
{
for(i=1,s1=1;i<=n;i=i+1)//内循环求1-20每个数的阶乘
{
s1=s1*i;
}
s2=s2+s1;//阶乘求和
}
printf("%lld",s2);
return 0;
}
//上述存在重复计算,我们可以知道3!=3*2*1 4!=4*3*2*1,
//所以我们每次保存前一个阶乘的结果,乘以当前n值即可
int main()
{
long long int s1, s2;
s1 = 1;
s2 = 0;
for(int n=1;n<=20;n++)
{
s1 = s1*n;
printf("%lld\n", s1);
s2 = s2 + s1;
}
printf("%lld", s2);
return 0;
}
6.6 水仙花数
思路:取位然后判断
int main()
{
printf("输出所有的水仙花数:\n");
int a,b,c,i;
for(i=101;i<=999;i=i+1)
{
a=i/100;
b=(i-a*100)/10;
c=(i-a*100-b*10);
if(i==a*a*a+b*b*b+c*c*c)
printf("%d\n",i);
}
return 0;
}
6.8 找规律求和——分子和分母分别是前两个之和
int main()
{
int a=2,b=3,d=1,e=2,k;
float s,t,c,f;
for(k=1;k<=18;k=k+1)
{
c=a+b;
a=b;
b=c;
f=d+e;
d=e;
e=f;
t=c/f;
s=s+t;
}
s=2+1.5+s;
printf("%f",s);
}
6.9 小球反弹高度
int main()
{
printf("小球从100M落下反弹十次的高度:\n");
float h=100,i=1,s=0;
for(i=1;i<=10;i=i+1)
{
h=h/2;
s=s+h;
}
s=s+100;
printf("共经过%fM,第十次反弹%fM高",s,h);
return 0;
}
6.15 比赛顺序
思路:这个比较有意思,简单来说就是要满足所述的条件,利用一个三重循环来确定a,b,c各自的对手,两个条件
条件一:三个人的对手不同(if判断)
条件二:A不和X打、C不和X, Z打
满足条件输出即可
int main()
{
char a,b,c;
for(a='x';a<='z';a=a+1)
for(b='x';b<='z';b=b+1)
if(a!=b)
for(c='x';c<='z';c=c+1)
if(a!=c&&b!=c)
if(a!='x'&&c!='x'&&c!='z')
printf("正确的比赛顺序为:\na-%c\nb-%c\nc-%c",a,b,c);
return 0;
}
7.2 选择排序
#include
#include
int main()
{
int a[10];
printf("please input 10 numbers:\n");
int i,j,pos,temp;
for(i=0;i<=9;i++)
scanf("%d",&a[i]);
for(i=0;i<9;i++)
{
pos=i;
for(j=i+1;j<=9;j++)
if(a[j]<a[pos])
pos=j;//记录当前最小数的位置
temp=a[i];
a[i]=a[pos];
a[pos]=temp;
}
for(i=0;i<=9;i++)
printf(" %d",a[i]);
return 0;
}
7.3 求3x3矩阵对角线之和
int main()
{
int a[3][3];
printf("please input some number:\n");
int i,j,k=0;
for(i=0;i<=2;i++)
for(j=0;j<=2;j++)
scanf("%d",&a[i][j]);
for(i=0;i<=2;i++)
{
k=k+a[i][i];
}
k=k+a[0][2]+a[2][0];
printf("对角线的总和为%d",k);
return 0;
}
int main()
{
int a[20]={1,4,5,6,7,8,9,15,18,19};
int i,k,l;
printf("please input a number:\n");
scanf("%d",&i);
for(k=9;k>=0;k--)
{
if(i<a[k])//输入的数小,则原来位置的数后移
{
a[k+1]=a[k];
l=k;
}
else//否则当前位置就是需要插入的位置
break;
}
a[l]=i;
for(i=0;i<=10;i++)
printf(" %d",a[i]);
return 0;
}
//上述程序有点问题:已经假设了原来的排序是升序,但其实题目并没有给是升序还是降序,需要额外判断一下
7.6 打印杨辉三角
思路:第一行补0,第一列补1
按a[ i ] [ j ] = a [i-1] [j-1] + a[i-1] [j]计算即可
//杨辉三角7.6
int main()
{
int n;
printf("请输入n的值:\n");
scanf("%d",&n);
int a[n][n];
int row,col,i,j;
for(j=0;j<=n-1;j++)
a[0][j]=0;
for(i=0;i<=n-1;i++)
a[i][0]=1;
for(row=1;row<=n-1;row++)
for(col=1;col<=n-1;col++)
a[row][col]=a[row-1][col-1]+a[row-1][col];
for(row=0;row<=n-1;row++)
{
printf("\n");
for(col=0;col<=row;col++)
printf("%d ",a[row][col]);
}
return 0;
}
7.7 魔方三角
思路:根据填方阵的规律进行填数
//方案一:自己也看不懂了。。。
int main()
{
int n,i;
printf("please input the line of the magic mat:\n");
scanf("%d",&n);
int a[n][n];
int row=0,col=n/2;
a[row][col]=1;
for(i=2;i<=n*n;i++)
{
if((i-1)%n==0)
row++;
else
{
if(row==0)
row=n-1;
else
row--;
if(col==n-1)
col=0;
else
col++;
}
a[row][col]=i;
}
for(row=0;row<=n-1;row++)
{
printf("\n");
for(col=0;col<=n-1;col++)
printf("%d",a[row][col]);
}
return 0;
}
//方案二:
/*
四种填数的规则,复现即可:
1. 右上角没填且在可填的矩阵范围内,直接填,则行-1,列+1
2. 右上角不在范围内,但行在范围内,则行-1,列=0
3. 右上角不再范围内,但列在范围内,则行=n-1, 列+1
4. 其余情况则往正下方填数即可,则行+1, 列不变
*/
int main()
{
int n,i;
printf("please input the line of the magic mat:\n");
scanf("%d",&n);
int a[n][n];
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
a[i][j] = 0;
int row=0,col=n/2;
a[row][col]=1;
for(i=2;i<=n*n;i++)
{
int num = i*i;
if(row-1>=0&&col+1<n&&a[row-1][col+1]==0)
{
row--;
col++;
}
else if(row-1<0&&col+1<n&&a[n-1][col+1]==0)
{
row = n-1;
col ++ ;
}
else if(row-1>=0&&col+1>=n&&a[row-1][0]==0)
{
row--;
col = 0;
}
else
{
row = row+1;
col = col;
}
a[row][col]=num;
}
for(row=0;row<=n-1;row++)
{
printf("\n");
for(col=0;col<=n-1;col++)
printf("%d ",a[row][col]);
}
return 0;
}
7.11 输出指定图形
思路:前缀空格+星星和空格交替
int main()
{
char a[5][20];
int i,j;
char x='*',y=' ',z;
int k=8;
for(i=0;i<=4;i++)
for(j=0;j<=20;j++)
{
if(i>j)//前缀‘ ’
a[i][j]=' ';
else//交替‘*’和‘ ’
{
a[i][j]=x;
z=x;
x=y;
y=z;
}
}
for(i=0;i<=4;i++)
{
k=k+1;
printf("\n");
for(j=0;j<=k;j++)
printf(" %c",a[i][j]);
}
}
7.13 实现strcat
//这个写的有点不负责任了。。。
int main()
{
char a[30]={"qwertyuiop"};
char b[10]={"asdfghjkl"};
int j=0,i,k;
for(i=10;i<=19;i++)
for(;j<=9;)
{
a[i]=b[j];
j++;
break;
}
for(k=0;k<=29;k++)
printf(" %c",a[k]);
return 0;
}
//正确写法(需要用到第八章的函数知识)
//c = a + b
//简陋版,没返回strcat后得到的字符串,需要利用指针
void strcat(char a[], char b[])
{
int a_len = strlen(a);
int b_len = strlen(b);
int c_len = a_len + b_len;
char c[c_len];
for(int i=0;i<a_len;i++)
c[i] = a[i];
int index = a_len-1;
for(int j=0;j<b_len;j++)
c[index++] = b[j];
for(int i=0;i<c_len;i++)
printf("%c", c[i]);
}
7.15 实现strcpy
int main()
{
char s2[8]={"zxcvbnm"};
char s1[20];
int i,j;
for(i=0;i<=7;i++)
s1[i]=s2[i];
for(j=0;j<=7;j++)
printf(" %c",s1[j]);
return 0;
}
void strcpy(char a[])
{
char b_len = strlen(a);
char b[b_len+1];
for(int i=0;;i++)
{
if(a[i]=='\0')
{
break;
}
b[i] = a[i];
}
b[b_len] = '\0';
}
8.3 判断素数
int prime(int number);//函数声明
int main()
{
int number;
printf("请输入一个正整数:\n");
scanf("%d",&number);
if(prime(number))
printf("\n%d是素数",number);
else
printf("\n%d不是素数",number);
}
int prime(int number)
{
if(number==1)
return 0;
if(number==2)
return 1;
for(int i=2;i*i<=number;i++)
{
if(number%i==0)//可以整除除了1和本身的其他数则不是素数
return 0;
}
return 1;
}
8.4 3x3矩阵转置,行列交换
swap(int a[][3],int b[][3]);//注意二维数组传入时,列参数无法省略
int main()
{
int i,j;
int a[3][3];
int b[3][3];
printf("please input 9 numbers:\n");
for(i=0;i<=2;i++)
for(j=0;j<=2;j++)
scanf("%d",&a[i][j]);
swap(a,b);
for(i=0;i<=2;i++)
{
printf("\n");
for(j=0;j<=2;j++)
printf(" %d",b[i][j]);
}
return 0;
}
int swap(int a[][3],int b[][3])
{
int i,j;
for(i=0;i<=2;i++)
for(j=0;j<=2;j++)
b[i][j]=a[j][i];//行列转置
}
8.6 字符串连接函数
没什么好说的,跟第七章的题目类似
void pinjie(char a[],char b[],char c[],int n,int m);
int main()
{
char a[100];
char b[100];
char c[300];
int n,m,l;
printf("please input a string:\n");
scanf("%s",a);
printf("please input another string:\n");
gets(b);
scanf("%s",b);
n=strlen(a);
m=strlen(b);
pinjie(a,b,c,n,m);
for(l=0;l<=n+m-1;l++)
printf("%c",c[l]);
return 0;
}
void pinjie(char a[],char b[],char c[],int n,int m)
{
int i,j;
for(i=0;i<=n-1;i++)
c[i]=a[i];
for(j=0;j<=m-1;j++)
c[i+j]=b[j];
}
8.7 复制元音字母并输出
int copyyuanyin(char a[],char b[],int i);
int main()
{
char a[100];
char b[50];
int i,m;
printf("please input a string:\n");
gets(a);
i=strlen(a);
copyyuanyin(a,b,i);
m=strlen(b);
for(i=0;i<m;i++)
printf(" %c",b[i]);
return 0;
}
int copyyuanyin(char a[],char b[],int i)
{
int j,k=0;
for(j=0;j<=i-1;j++)
{
switch(a[j])
{
case'a':
case'e':
case'i':
case'o':
case'u':b[k]=a[j];k++;
}
}
}
8.8 间隔输出
int shuchu(char a[],char b[],int i);
int main()
{
char a[4];
char b[9];
int i,l;
gets(a);
i=strlen(a);
shuchu(a,b,i);
for(l=0;l<=6;l++)
printf("%c",b[l]);
return 0;
}
int shuchu(char a[],char b[],int i)
{
int j;
for(j=i;j>=1;j--)
{
b[j*2-2]=a[j-1];//判断位置即可
b[j*2-3]=' ';
}
}
8.10 求字符串中最长单词
思路:首先是读入含空格的字符串,可以用gets(不推荐,有的编译器不给通过),所以还是老老实实用getchar一个字符一个字符读吧,千万要记得在结尾加上\0(不然strlen无法正确识别长度噢)。然后就是函数getMaxStr,利用变量来存储最长单词所在的位置,输出即可(以空格为间隔)
//简化:字符串仅由单词和空格构成
void getMaxStr(char str[])
{
int len = strlen(str);
int start, end;
int max_len = 0;
int pos1, pos2;
start=end=0;
for(int i=0;i<len;i++)
{
if(str[i]!=' ')
{
end++;
}
else
{
if(end-start>max_len)
{
pos1 = start;
pos2 = end;
max_len = end-start;
}
start=end=i+1;//每次读完需要重置位置的始末
}
}
//最后一个单词,防止结尾为最长单词的情况被漏算
if(end-start>max_len)
{
pos1 = start;
pos2 = end;
}
for(int i=pos1;i<=pos2;i++)
printf("%c", str[i]);
}
int main()
{
printf("input the string:\n");
char str[100];
int index = 0;
char c;
c = getchar();
while(c!='\n')
{
str[index++] = c;
c = getchar();
}
//不要忘记补上终止符\0
str[index] = '\0';
getMaxStr(str);
return 0;
}
8.11 冒泡排序
思路:交换法,相邻交换
int paixu(int a[]);
int main()
{
int a[10];
int i;
printf("please input 10 numbers:\n");
for(i=0;i<=9;i++)
scanf("%d",&a[i]);
//int a[10]={1,5,6,7,8,9,12,11,15,14};
paixu(a);
for(i=0;i<=9;i++)
printf(" %d",a[i]);
return 0;
}
int paixu(int a[])
{
int n,m,t;
//每轮交换后可以使得末尾的一个位置有序
for(n=0;n<=9;n++)
for(m=0;m<=9-n;m++)//注意这里内循环的写法
{
if(a[m]>a[m+1])//大则交换
{
t=a[m];
a[m]=a[m+1];
a[m+1]=t;
}
}
}
8.12 牛顿迭代法求根
//每次用切线与X轴的交点来近似根
float xpoint(float x,float a,float b,float c,float d);
float root(float x,float a,float b,float c,float d);
float f(float x,float a,float b,float c,float d);
int main()
{
float a,b,c,d;
float gen=0,x=1;
printf("请输入abcd的值:\n");
scanf("%f%f%f%f",&a,&b,&c,&d);
gen=root(x,a,b,c,d);
printf("该方程的根为%f",gen);
}
float f(float x,float a,float b,float c,float d)//求函数值
{
float y;
y=a*x*x*x+b*x*x+c*x+d;
return y;
}
float xpoint(float x,float a,float b,float c,float d)
{
float k1,y1,x1;
k1=3*a*x*x+2*b*x+c;
y1=f(x,a,b,c,d);
x1=-(y1/k1)+x;
return x1;
}
float root(float x,float a,float b,float c,float d)
{
float xx,yy;
do
{
xx=xpoint(x,a,b,c,d);//切线与x轴的交点
yy=f(xx,a,b,c,d);
if(fabs(yy)<=1e-6)
break;
else
x=xx;
}
while(fabs(yy)>1e-6);
return xx;
}
8.14 十个学生五门课程,完成计算
思路:体力活。。。在学完结构体后,代码会间接美观一些。。。
int average_student(int a[]);
int average_socre(int a[],int b[],int c[],int d[],int e[],int f[],int g[],int h[],int i[],int j[]);
int max_student_class(int a[],int b[],int c[],int d[],int e[],int f[],int g[],int h[],int i[],int j[]);
int pinfangcha(int a[],int b[],int c[],int d[],int e[],int f[],int g[],int h[],int i[],int j[]);
int main()
{
int a[5],b[5],c[5],d[5],e[5],f[5],g[5],h[5],i[5],j[5];
int w,x,y,z;
printf("请输入第一位学生的语数英理综体育成绩:\n");
for(x=0;x<=4;x++)
scanf("%d",&a[x]);
printf("请输入第二位学生的语数英理综体育成绩:\n");
for(x=0;x<=4;x++)
scanf("%d",&b[x]);
printf("请输入第三位学生的语数英理综体育成绩:\n");
for(x=0;x<=4;x++)
scanf("%d",&c[x]);
printf("请输入第四位学生的语数英理综体育成绩:\n");
for(x=0;x<=4;x++)
scanf("%d",&d[x]);
printf("请输入第五位学生的语数英理综体育成绩:\n");
for(x=0;x<=4;x++)
scanf("%d",&e[x]);
printf("请输入第六位学生的语数英理综体育成绩:\n");
for(x=0;x<=4;x++)
scanf("%d",&f[x]);
printf("请输入第七位学生的语数英理综体育成绩:\n");
for(x=0;x<=4;x++)
scanf("%d",&g[x]);
printf("请输入第八位学生的语数英理综体育成绩:\n");
for(x=0;x<=4;x++)
scanf("%d",&h[x]);
printf("请输入第九位学生的语数英理综体育成绩:\n");
for(x=0;x<=4;x++)
scanf("%d",&i[x]);
printf("请输入第十位学生的语数英理综体育成绩:\n");
for(x=0;x<=4;x++)
scanf("%d",&j[x]);
}
int average_student(int a[])
{
int score=0,y;
for(y=0;y<=4;y++)
score=score+a[y];
printf("该学生的平均成绩为:%d",score/5);
}
int average_socre(int a[],int b[],int c[],int d[],int e[],int f[],int g[],int h[],int i[],int j[])
{
int chinese,math,english,maxture;
chinese=(a[0]+b[0]+c[0]+d[0]+e[0]+)
}
int age(int n)
{
int c;
if(n==1)
c=10;
else
c=age(n-1)+2;
return c;
}
int main()
{
printf("%d\n",age(5));
}
int main()
{
float fac(int n);
int n;
float y;
printf("please input a number:\n");
scanf("%d",&n);
y=fac(n);
printf("%d!=%10.0f\n",n,y);
return 0;
}
float fac(int n)
{
float f;
if(n<0)
printf("n<0,dataerror!");
else
{
if(n==0||n==1)
f=1;
else
f=fac(n-1)*n;
}
return f;
}
int move(char x,char y);
void hanoi(int n, char A, char B, char C);
int main()
{
int m;
printf("input the number of disks:\n");
scanf("%d",&m);
printf("The step to moving %d disks:\n",m);
hanoi(m,'A','B','C');
}
void hanoi(int n,char A, char B,char C)
{
if(n==1)
move(A,C);
else
{
hanoi(n-1,A,C,B);
move(A,C);
hanoi(n-1,B,A,C);
}
}
int move(char x,char y)
{
printf("%c-->%c\n",x,y);
}