c语言 试题总结-2021版
1965. 2021C语言课前3 while循环
1. 洗衣服
#include <stdio.h>
#include <stdlib.h>
int main()
{int n,m,mt=0;
while(scanf("%d%d",&n,&m)!=EOF)
{mt=n/m;
printf("%d\n",mt);}
return 0;
}
EOF,为End Of File的缩写,通常在文本的最后存在此字符表示资料结束。
要注意的是:在终端(黑框)中手动输入时,系统并不知道什么时候到达了所谓的“文件末尾”,因此需要用<Ctrl + z>组合键然后按 Enter 键的方式来告诉系统已经到了EOF,这样系统才会结束while.
https://blog.csdn.net/henu1710252658/article/details/83040281
1966.2021C语言课前4 for循环
1.求绝对值最大值
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
int i, n, a, fa, max, maxold;
scanf("%d", &n);
scanf("%d", &a);
max = ((a >= 0)? a : -a);
maxold = a;
for(i = 1; i < n; i++)
{
scanf("%d", &a);
fa = a;
if(a < 0)
{
fa = -a;
}
if(max < fa)
{
max = fa;
maxold = a;
}
}
printf("%d\n", maxold);
return 0;
}
不能使用abs函数,会超时(runtime error)
2.判断素数
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n,i;
int flag=1;
scanf("%d",&n);
for(i=2; i<n; i++)
{
if(n%i==0)
flag=0;
}
if(n!=1)
{if(flag==1)
printf("This is a prime.");
else
printf("This is not a prime.");
}
else
printf("This is not a prime.");
return 0;
}
质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。
3.最大公约数与最小公倍数
#include <stdio.h>
int main()
{
int m,n,max,min,b,c,g;
//printf("请输入两个整数:\n");
scanf("%d %d",&m,&n);
c=m%n;
b=m*n;
while(c!=0)
{
m=n;
n=c;
c=m%n;
}
max=n;
min=b/max;
printf("%d\n%d\n",max,min);
return 0;
}
一、最大公约数求法
(1)辗转相除法
设有两整数a和b:
① a%b得余数c
② 若c==0,则b即为两数的最大公约数
③ 若c!=0,则a=b,b=c,再回去执行①。
例如求27和15的最大公约数过程为:
27÷15 余12
15÷12 余3
12÷3 余0
因此,3即为最大公约数。
(2)相减法
设有两整数a和b:
① 若a>b,则a=a-b
② 若a<b,则b=b-a
③ 若a==b,则a(或b)即为两数的最大公约数
④ 若a!=b,则再回去执行①。
例如求27和15的最大公约数过程为:
27-15=12( 15>12 )
15-12=3( 12>3 )
12-3=9( 9>3 )
9-3=6( 6>3 )
6-3=3( 3==3 )
因此,3即为最大公约数。
二、求最小公倍数算法
最小公倍数=两整数的乘积÷最大公约数
4.数列求和
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a,n,i,s,m;
scanf("%d",&a);
scanf("%d",&n);
s=0;
m=a;
for(i=1; i<n; i++)
{
s=s+m; //让个位等于a
m=m*10+a;//进位后再补a
}
s=s+m;
printf("%d\n",s);
return 0;
}
m*10 好办法
5.做乘法
#include <stdio.h>
int main()
{
int n,i,m;
scanf("%d",&n);
for(i=1; i<=n; i++)
{
m=i*n;
printf("%d*%d=%d\n",n,i,m);
}
return 0;
}
2063. 2021C实验5——函数
B . 字符串连接
#include <stdio.h>
main()
{
char a[100],b[100];
int i=0,j=0;
//printf("Please input 2 strings:\n");
gets(a); //输入字符串啊,a,b
gets(b);
while(a[i]!='\0')
i++; // i 表示字符串a的'\0'所在的位置
while(b[j]!='\0') //将b中字符一个个赋值给'\0'以及其后面的位置,i++,j++控制一一对应
a[i++]=b[j++];
a[i]='\0' ; //给一个结束标志
puts(a); //输出
return 0;
}
注意字符串的定义
输入输出流 gets和puts
在while循环中 i 表示字符串a的’\0’所在的位置
while(a[i]!='\0')
i++;
while(b[j]!='\0') //将b中字符一个个赋值给'\0'以及其后面的位置,i++,j++控制一一对应
a[i++]=b[j++];
先将i加到a的尾端,再在后面加上b串的内容,最后给a[i]一个结束标志a[i]=’\0’
实验1
A . 鲁东信电的密码
#include<stdio.h>
#define N 256
int main() {
char str[N]; int i,m;
scanf("%d",&m);
scanf("%s",str);
i=0;
while ( str[i]!=0 ) {
if ( str[i]>='a' && str[i]<='z' ) str[i]=(str[i]-'a'+m)%26+'a';
else if ( str[i]>='A' && str[i]<='Z' ) str[i]=(str[i]-'A'+m)%26+'A';
i++;
}
printf("%s\n",str);
}
B . 圆柱和圆球
#include <stdio.h>
int main()
{
double h, r, l, s, sq, vq, vz;
const double pi = 3.1415926;
scanf("%lf %lf",&r,&h);
l = 2 * pi * r;
s = r * r * pi;
sq = 4 * pi * r * r;
vq = (4.0 / 3.0 * pi * r * r * r);
vz = pi * r * r * h;
printf("%.2lf %.2lf %.2lf %.2lf %.2lf",l,s,sq,vq,vz);
return 0;
}
**1.**C语言中printf输出float和double都可以用%f,而double型数据还可以用%lf。
**2.**scanf当中若是对双精度的变量赋值是必须是%后跟lf,而printf当中可以用%f也可以用%lf没有限制。
实验2——选择结构
A . 成绩的等级转换***
#include<stdio.h>
int main()
{
int score[110],n;
scanf("%d",&n);
for(int i = 0;i<n;i++){
scanf("%d",&score[i]);
}
for(int i = 0;i<n;i++){
if (score[i]<0 || score[i]>100)
{
printf("input error\n");
}
else
{
switch(score[i]/10)
{
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:printf("E\n");break;
case 6:printf("D\n");break;
case 7:printf("C\n");break;
case 8:printf("B\n");break;
case 9:
case 10:printf("A\n");break;
}
}}
return 0;
}
*** stack smashing detected ***: <unknown> terminated
注意数组大小是否满足要求
B . 四个整数的排序
#include<stdio.h>
int main()
{
int a,b,c,d,h;
scanf("%d%%%d%%%d%%%d",&a,&b,&c,&d); //选择输入
if (b<a)
h=a, a=b, b=h;
if (c<a)
h=a, a=c, c=h;
if (d<a)
h=a, a=d, d=h;
if (c<b)
h=b, b=c, c=h;
if (d<b)
h=b, b=d, d=h;
if (d<c)
h=c, c=d, d=h;
printf("%d %d %d %d",a,b,c,d);
return 0;
}
C . 正整数的变换***
#include <stdio.h>
int main(){
int a,n,h;
int f[10];
scanf("%d",&a);
while(a!=0){
h=a%10;
a=a/10;
f[n]=h;
n++;
//TODO
}
printf("%d\n",n);
for(int i =n-1;i>=0;i--){
if(i!=0){
printf("%d ",f[i]);
//TODO
}else{printf("%d\n",f[i]);}
}
for(int i =0;i<n;i++){
printf("%d",f[i]);
}
}
注意输出格式控制
如何让最后一个字符不空格***
for(int i =n-1;i>=0;i--){
if(i!=0){
printf("%d ",f[i]);
//TODO
}else{printf("%d\n",f[i]);}
}
如果i是数组要输出的最后一个字符,那就进行if判断
D . 判断闰年***
#include<stdio.h>
int main()
{
int a,y;
int s[1001];
scanf("%d",&a);
for(int i =0;i<a;i++){
scanf("%d",&s[i]);
}
for(int i =0;i<a;i++){
y=s[i];
if((y%100!=0&&y%4==0)||y%400==0)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
判断闰年的方法
f((y%100!=0&&y%4==0)||y%400==0)
实验3
B . 找这样的5位数
#include<stdio.h>
int main(){
int n,i;
while(scanf("%d",&n)!=EOF){
int m,k,t;
int sum=0;
int ans=0;
for(i=10000;i<=99999;i++)
{
m=i/1000;
k=i%100;
t=i/100%10;
if(m%n==0&&k%n==0&&t%n==0){
++sum;
if(sum%n==0)
printf("%d\n",i);
else
printf("%d ",i);
}
}
}
return 0;
}
数字分割
C . 二分法解方程
#include<stdio.h>
#include<math.h>
int main()
{
double x0,x1, f, fd;
x1=10;
do {
x0=x1;
f = 2 * x0 * x0 * x0 - 4 * x0 * x0 + 3 * x0 - 6;
fd = 6 * x0 * x0 - 8 * x0 + 3;
x1 = x0 - f / fd;
} while (fabs(x0-x1) >=1e-2);
printf("%.6f", x1);
return 0;
}
https://blog.csdn.net/qq_45891676/article/details/107906949?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1.no_search_link&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1.no_search_link
D . 终于会求e的值了
#include<stdio.h>
//本来想用调和函数f返回int,但当n的值太大时,就超出了返回的int的最大范围会报错,所以要采用双精度
double fact(int n);
int main()
{
int n;
double sum=0;
while(scanf("%d",&n)!=EOF){
for(int i=0;i<=n;i++)
{
sum=sum+1.0/fact(i);
}
printf("%.6f\n",sum);
sum = 0;
}
return 0;
}
//实现阶乘
double fact(int n)
{
int i;
double sum=1;
for(i=1;i<=n;i++)
{
sum=sum*i;
}
return sum;
}
实验4
A . 考上大学!
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
int main()
{
long long n;
int i,j;
scanf("%lld",&n);
int a[100001][6]={};
for(i=0;i<n;i++)
{
//memset(a,0,6);
for(j=0;j<5;j++)
{
scanf("%d",&a[i][j]);
}
}
for(i=0;i<n;i++)
{
float sum=0.0;
float k;
for(j=0;j<5;j++)
{
sum+=a[i][j];
}
k=sum/5;
printf("%.1f\n",k);
}
for(i=0;i<5;i++)
{
float b[100001]={};
for(j=0;j<n;j++)
{
b[i]+=a[j][i];
}
if(i!=4)
printf("%.1f\n",b[i]/n);
else
printf("%.1f",b[i]/n);
}
return 0;
}
B . 简单的转换
#include<stdio.h>
int trans(char a[])
{
int n=0;
for(int i=0;a[i]!='\0';i++)
{
if(a[i]>='0'&&a[i]<='9')
n=n*16+a[i]-'0';
else if(a[i]>='a'&&a[i]<='f')
n=n*16+a[i]-'a'+10;
// else if(a[i]>='A'&&a[i]<='F')
// n=n*16+a[i]-'A'+10;
}
return n;
}
int main()
{
int i=0,n;
char a[20],ch;
while((ch=getchar())!='\0')
{
if((ch>='0'&&ch<='9')||(ch>='a'&&ch<='f')||(ch>='A'&&ch<='F'))
{
a[i++]=ch;
}
else
{
a[i]='\0';
n=trans(a);
printf("%d\n",n);
break;
}
}
return 0;
}
C . 超大福利
#include<stdio.h>
#include<string.h>
int main()
{
char a[100000]={'\0'},b[100000],c[100000];
int i=0,j=0,l=0,len=0;
gets(a);
len=strlen(a);
//统计字符串的长度,不包含'\0',但是包含空格
for(i=0;i<=len;i++)
//连a数组的结尾的\0'也算上,所以是<=
if(a[i]==' '|| a[i]=='\0')
{
b[j]='\0';
if(j>l)
{
strcpy(c,b);
//将数组b的内容复制到数组c中,注意写法!!
l=j;
}
j=0;
//这个要写在if的外面,
//因为不论是否是最长单词,这个计数器都要清零,也就是从b[0]开始重新输入b数组_
}
else
{
b[j]=a[i];
j++;
}
puts(c);
return 0;
}
D . 统计难题
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
int i=0,n;
int a[100001];
int j;
int b[10]={0};
scanf("%d",&n);
for(int t=0;t<n;t++)
{
scanf("%d",&a[t]);
}
//memset是计算机中C/C++语言初始化函数。作用是将某一块内存中的内容全部设置为指定的值, 这个函数通常为新申请的内存做初始化工作。
// memset(b,10,0);
for(i=0;i<n;i++)
{
j=a[i]%10;
if(j==0){
b[0]++;
}
if(j==1){
b[1]++;
}
if(j==2){
b[2]++;
}
if(j==3){
b[3]++;
}
if(j==4){
b[4]++;
}
if(j==5){
b[5]++;
}
if(j==6){
b[6]++;
}
if(j==7){
b[7]++;
}
if(j==8){
b[8]++;
}
if(j==9){
b[9]++;
}
}
for(int k=0;k<10;k++)
printf("%d\n",b[k]);
return 0;
}
E . 智商比赛
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main()
{
int i=0;
long n;
scanf("%ld",&n);
double k;
k=sqrt(n);
for(i=2;i<k;i++)
{
if(n%i==0)
break;
}
if (n <= 1)
printf("No");
else if (i <= k) //i小于n根的数n不是质数
printf("No");
else
printf("Yes");
return 0;
}
实验5
A . 回文串
//判断字符串是否是回文
#include<stdio.h>
#include<string.h>
int huiwen(char *str)
{
//char ch[100];
int len=strlen(str); //获取字符串的长度
int i,j,temp;
for(i=0,j=len-1;i<=j;i++,j--) //第一位和最后一位相比较循环判断
{
if(str[i]==str[j]) //
temp=1;
else
{
temp=0;
break;
}
}
return temp;
}
main()
{
char ch[10][100];
int n;
scanf("%d",&n);
for(int i = 0;i<n;i++){
//无法判断特殊字符如空格键;
scanf("%s",ch[i]) ; //可以判断键盘输入的任意字符
if(huiwen(ch[i]))
printf("yes\n");
else
printf("no\n");
}
}
E . 什么是鞍点?
#include<stdio.h>
#include<string.h>
int main(){
int n;
int a[11][11]={};
int i,j;
int p,q;
int N=1;
scanf("%d",&n);
for(i=0;i<n;i++){
for(j=0;j<n;j++){
scanf("%d",&a[i][j]);
}
}
for(i=0;i<n;i++){
int max=0,flag=1;
for(j=0;j<n;j++){
if(a[i][j]>max)
{
max=a[i][j];
p=i,q=j;
}
}
for(int k=0;k<n;k++){
if(max>a[k][q]){
// printf("no exists");
flag=0;
break;
}
}
if(flag==1){
N=0;
printf("%d",a[p][q]);
break;
}
}
if(N==1)
printf("no exists");
return 0;
}
F . 进制转换***
#include <stdio.h>
#include <math.h>
int main()
{
int r,i,b;
long long n,t;
char a[100];
char c[]="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
scanf("%lld%d",&n,&r);
t=n;
t=(int)fabs(t);
for(i=0;;i++) //无限循环
{
b=t%r;
if(b>=10)
a[i]=c[b-10];
else
a[i]=b+'0';
t=(t-b)/r;
if(t==0)
break;}
//if(n<0)
//printf("-");
for(;i>=0;i--)
printf("%c",a[i]);
//printf("\n");
return 0; }
G . 找一找,看一看
#include<stdio.h>
#include<string.h>
int chazhao(int a[],int len,int t)
{
int low=0;
int high=len-1;
int mid;
while(low<=high)
{
mid=(low+high)/2;
if(a[mid]==t)
return mid;
else if(a[mid]<t){
low=mid+1;}
else{
high=mid-1;}
}
}
int main(){
int n,m;
int a[100001];
int i,j;
int t;
int q;
int flag=0;
scanf("%d %d",&n,&m);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(i=0;i<m;i++)
{
flag=0;
scanf("%d",&t);
for(j=0;j<n;j++){
if(t==a[j])
flag=1;
}
if(flag==1){
q=chazhao(a,n,t);
q++;
printf("%d\n",q);}
else
printf("no exists\n");
}
}
H . 我会排序了
#include<stdio.h>
#include<string.h>
int paixu(int a[],int n)
{
int i,j;
int temp;
for(i=0;i<n;i++)
{
for(j=0;j<n-i-1;j++)
{
if(a[j]>a[j+1] ){
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
}
int main(){
int n;
scanf("%d",&n);
int a[101];
int i,j;
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
paixu(a,n);
for(i=0;i<n;i++)
{
printf("%d ",a[i]);
}
}
实验6——指针
A . 指针排序
#include<stdio.h>
int main()
{
int n;
int i,j;
int *p;
scanf("%d",&n);
int a[n];
for(i=0;i<n;i++)
scanf("%d",&a[i]);
p=a;
int t;
for(i=0;i<n;i++)
{
for(j=0;j<n-i-1;j++)
{
if(p[j]>p[j+1])
{
t=p[j];
p[j]=p[j+1];
p[j+1]=t;
}
}
}
for(i=0;i<n;i++)
{
printf("%d ",p[i]);
}
return 0;
}