以下是大计基编程题目or题目,直接来源于吴宁教授(2020年11月30日)。
B站专栏的程序块一个Bug是#include丢<>部分,用""可以,但因为基本上是<stdio.h>,不改。还有不知为何有时遇到<就自动去掉程序后半部分,起初我想截图,为了保持一致性,<换成《,>换成》。
时间仓促,并没有对每个程序进行核验,难免有错误,敬请读者指正。
一、(6)
1、C055-第一个程序(无)
2、C005-编写程序完成对应数的输出
用户输入一个8位十进制整数,编写程序取出该整数的中间4位数输出,并将取出的数加上1024的得数输出。
输入:一个整数。
输出:两个整数,用空格分隔。
#include《stdio.h》
void main()
{
unsigned a;
scanf_s("%d",&a);
a=a/100;
a=a%10000;
printf("%d\n",a);
a=a+1024;
printf("%d\n",a);
} 3、C006-编写程序,输入用户当月利润,输出发放奖金总数
企业发放的奖金根据利润提成。利润低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可提成8%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于 40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成2%,高于100万元时,超过100万元的部分按1%提成。编写程序,输入用户当月利润,输出发放奖金总数
输入:1个整数;输出:整数
#include《stdio.h》
#include《math.h》
void main()
{
long int i;
int bonus1,bonus2,bonus4,bonus6,bonus10,bonus;
scanf("%ld",&i);
bonus1=100000*0.1;
bonus2=bonus1+100000*0.08;
bonus4=bonus2+200000*0.05;
bonus6=bonus4+200000*0.03;
bonus10=bonus6+400000*0.02;
if(i<=100000) bonus=i*0.1;
else if(i<=200000) bonus=bonus1+(i-100000)*0.08;
else if(i<=400000) bonus=bonus2+(i-200000)*0.05;
else if(i<=600000) bonus=bonus4+(i-400000)*0.03;
else if(i<=1000000) bonus=bonus6+(i-600000)*0.02;
else bonus=bonus10+(i-1000000)*0.01;
printf("%d\n",bonus);
} 4、C017-按要求输出两个数的和
输入整数a和b,若a*a+b*b大于等于100,则输出a*a+b*b百位及以上的数字,否则输出两数之和。例如,输入25 25 ,它们的平方和为625+625=1250,百位及以上数为12.
输入:两个整数,中间用空格隔开
输出:一个整数。
#include《stdio.h》
int main()
{
int k1,a,b,c,d;
//printf("请输入两个整数:\n");
scanf_s("%d %d",&a,&b);
//printf("你输入的两个数为:%d,%d\n",a,b);
c=a*a+b*b;
if(c>=100){d=c/100;printf("%d\n",d);}
else printf("%d\n",c);
return 0;
} 5、C042-平均数计算(无)
从键盘输入任意3个整数,然后输出这3个数的平均值。
输入:3个整数,用空格分隔。
6、C043-3个小数求和
编写程序,用户输入任意的3个小数;将这3个小数相加并显示结果;将结果按四舍五入方法转换成整数并显示。
输入:3个小数,空格分隔;
输出:和,四舍五入后的整数,1行显示,空格分隔
#include《stdio.h》
int main()
{
float x1,x2,x3;
scanf_s("%f%f%f",&x1,&x2,&x3);
float x4=x1+x2+x3;
printf("%g %d",x4,(int)(x4+0.5));
return 0;
} 7、C044-和差积商
输入2个整数,求:和,差,积,商
输入:2个整数(第二个数是非零整数)
输出:4个整数,依次为和、差、积和商,数据间用空格分隔。
#include《stdio.h》
int main()
{
int x1,x2;
scanf("%d%d",&x1,&x2);
printf("%d %d %d %d",x1+x2,x1-x2,x1*x2,x1/x2);
return 0;
} 8、C046-时、分、秒转换
输入总秒数,转换为相应的时、分、秒。提示:在输出时,请使用下面的格式(变量名不要求一样)printf("%d:%.2d:%.2d\n", h, m, s)
输入:整数
输出:时分秒,整数,西文冒号分隔
Case: 3610 1:00:10; 3670 1:01:10; 456 0:07:36; 8421 2:20:21
#include《stdio.h》
int main()
{
int x1,x2;
scanf("%d%d",&x1,&x2);
printf("%d %d %d %d",x1+x2,x1-x2,x1*x2,x1/x2);
return 0;
} 9、C048-计算银行存款本息
计算银行存款本息。输入存款金额money(单位:元),存期years,年利率rate,计算到期存款本息(保留2位小数)。计算公式如下:sum=money(1+rate)years
提示:求x的y次幂可以使用数学函数pow(x,y),其中x,y均为double型,在程序开始加上:#include<math.h>
输入:存款金额,存期,年利率。均为浮点数,且用逗号分隔
输出:存款本息(保留2位小数)
#define _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
#include "math.h"
int main()
{
double sum,money,years,rate;
scanf("%lf,%lf,%lf",&money,&years,&rate);
sum=money*pow(1+rate,years);
printf("%.2lf\n",sum);
return 0;
} 10、C049-输出相邻的字母串
输入一个大写英文字母, 输出与其相邻的字母串(将字母A-Z看作是收尾相接的环状排列)。
输入: 大写英文字母
输出:该字母前面的字母,该字母,该字母后面的字母。(三字母间无间隔)
#include "stdio.h"
#define N 3
int main()
{
char c;
scanf_s("%c",&c);
printf("%c%c%c",(c+25-'A')%26+'A',c,(c-'A'+1)%26+'A');
return 0;
} 11、C053-输出字母的ASCII码和后继字符
输入由4个字母构成的英文单词,按如下格式输出字母,该字母的ASCII码以及该字母的后继字符。每行输出数据之间用一个空格分隔。
输入: 单词
输出:共4行,每行输出字母,该字母的ASCII码,该字母后继字符(空格分隔,每行的最后没有空格)
#include "stdio.h"
int main()
{
char c1,c2,c3,c4;
scanf("%c%c%c%c",&c1,&c2,&c3,&c4);
printf("%c %d %c\n",c1,c1,c1+1);
printf("%c %d %c\n",c2,c2,c2+1);
printf("%c %d %c\n",c3,c3,c3+1);
printf("%c %d %c\n",c4,c4,c4+1);
return 0;
} 12、编写程序,计算x=(1+r)^n
#define _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
#include "math.h"
int main()
{
float x,r;
int n;
printf("Please input r and n:\n");
scanf_s("r=%f\n",&r);
scanf_s("n=%d",&n);
x = pow(1+r,n);
printf("x=%f\n",x);
printf("\n");
return 0;
} 二、(7)
1、C001-输出平方根
从键盘输入一个小于等于1000的正整数x,输出其平方根(为整数)。若输入数大于1000,则输出0,并继续接受下一个输入直至小于等于1000。(提示:使用求平方根函数sqrt需要包含<math.h>头文件)。
#define _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
#include "math.h"
#define M 1000
int main()
{
int x;
scanf("%d",&x);
while(x>M){printf("0\n");scanf("%d",&x);}
printf("% d\n",(int)sqrt(x));
return 0;
} 2、C003-输出对应的英文星号
读取3个数(1~10)的整数值,每读取一个值,程序打印出该值个数的英文星号(""""*"""")。
输入:3个整数,3行。
输出:3行星号。
#define _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
#include "math.h"
#define M 1000
int main()
{
int i,a,n=1;
while(n<=3)
{
do{scanf("%d",&a);}
while(a<1||a>50);
for(i=1;i<=a;i++) printf("*");
printf("\n");
n++;
}
return 0;
} 3、C004-编写程序完成数据的加密
某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的,加密规则如下:
1)每位数字都用自身加上5后的和除以10的余数代替,如1用6代替,8用3代替;如3768就转换为8213;
2)再将第一步生成的数字的第一位和第四位交换,第二位和第三位交换。 如8213转换为3128,即为最终的加密密码。
编写程序完成数据的加密,输入:一个整数。
输出:一个整数。
#define _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
void main()
{
int a,i,aa[4],t;
scanf("%d",&a);
aa[0]=a%10;aa[1]=a%100/10;aa[2]=a%1000/100;aa[3]=a/1000;
for(i=0;i<=3;i++){aa[i]+=5;aa[i]%=10; }
for(i=0;i<=3/2;i++){t=aa[i];aa[i]=aa[3-i];aa[3-i]=t; }
for(i=3;i>=0;i--) printf("%d",aa[i]);
} 4、C060-统计整数个数
输入若干个整数,其值在0至4的范围内,用-1作为输入结束的标志,统计每个整数的个数。
输入:[0,4]内的整数组成的序列,最后是-1,用空格隔开。
输出:0,1,2,3,4的统计个数,用一个空格隔开。
样例:3 3 3 2 2 1 0 3 4 4 -1
1 1 2 4 2
#include "stdio.h"
#include "string.h"
int main()
{
int k1,x;
int k[5]={0,0,0,0,0};
scanf_s("%d",&x);
while(x!=-1){k[x]++;scanf_s("%d",&x);}
printf("%d %d %d %d %d\n",k[0],k[1],k[2],k[3],k[4]);
return 0;
} 5、C007-找出m到n之间的所有同构数(m<n)
找出m到n之间的所有同构数(m<n)。
说明:一个正整数x,如果是它平方数的尾部,则称x为同构数。例如,6是其平方数36的尾部,25是其平方数625的尾部,那么6和25都是同构数。
输入:输入m和n两个正整数,用空格分隔。
输出:连续输出同构数,数据间用空格分隔。
#define _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
int main()
{
int i,m,n;
do{scanf("%d%d",&m,&n);}while(m>n);
for(i=m;i<=n;i++)
{
int j=10,k,x;
do{
x=i*i;
k=x%j;
if(i==k) break;
j=10*j;
}while(x>k);
if(i==k) printf("%d ",i);
}
printf("\n");
return 0;
} 6、C009-求小球第n次落地的距离和反弹高度
一个球从100米高度自由落下,每次落地后反弹回原高度的一半,再落下,再反弹。求其在第n次落地时,共经过了多少米?第n次反弹高度是多少?
输入:第n次的值,整数
输出:小球经过的路程长度和小球反弹的高度,分2行输出。
#define _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
int main()
{
double hm=100,hg=hm/2;
int i,n;
scanf("%d",&n);
for(i=2;i<=n;i++){hm=hm+2*hg;hg=hg/2;}
printf("%lf\n%lf\n",hm,hg);
return 0;
} 7、C069-将数字替换为字母
将数字替换为字母。输入一个整数,将它除以2;再将除以2后所得数字的整数部分的各位用相应序号的字母替代。替换原则:0换为a,1换为b,2换为c,...,以此类推,9换为j。
例如,1234,除以2等于617,替换结果为gbh
输入:一个正整数
输出:除2后的整数整数部分和字符串,中间以一个空格隔开。
样例:1234
617 gbh
#define _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
void f(int a)
{
int b[30],n=0,i;
a=a/2;
printf("%d ",a);
b[0]=0;
while(a!=0){b[n]=a%10;a=a/10;n++;}
if(n==0){b[0]=0;n=1;}
for(i=n-1;i>=0;i--) printf("%c",b[i]+'a');
printf("\n");
}
int main()
{
int a; scanf("%d",&a);
f(a);
return 0;
} 8、C011-判断任意一个正整数各位数字之和是奇数还是偶数
编程判断任意一个正整数各位数字之和是奇数还是偶数。如果是奇数输出1,偶数输出0
#define _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
int main()
{
int n; scanf("%d",&n);
int m=n,sum=0;
while(n!=0){sum=sum+n%10;n=n/10;}
printf("%d\r\n",(sum%2?1:0));
return 0;
} 9、C012-求级数前n项的和
编程求以下级数前n项之和:s=1-1/3+1/5-1/7+...
#define _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
#include "math.h"
int main()
{
int t=1,sign=1,n;
double s=1;
scanf("%d",&n);
for (int i=2;i<=n;i++){sign=-sign;t=2*i-1;s=s+1.0*sign/t;}
printf("%lf\r\n",s);
return 0;
} 10、C031-求a+aa+aaa+aaaa+…+aa...a
求a+aa+aaa+aaaa+…+aa...a(n个),其中a为1~9之间的整数。
例如:当a = 1, n = 3时,求1+11+111之和为123;
输入:组成序列的数字a和求和项的数量n
输出:算式和结果。
#include "stdio.h"
int main()
{
int a,n,u=0,sum=0,i;
scanf_s("%d%d",&a,&n);
for(i=1;i<=n;i++)
{
u=u*10+a;
sum=sum+u;
printf("%d",u);
if(i《n) printf("+");
}
printf("=%d\n",sum);
return 0;
} 11、C014-找出给定范围内是7的倍数或带7的全部正整数
编程,找出[m,n]范围内是7的倍数或带7的全部正整数,m和n为正整数。
#define _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
int main()
{
int m,n,j,i;
printf("请输入m和n: ");
scanf("%d %d",&m,&n);
for(i=m;i<=n;i++){
if(i%7==0) printf("%d是7的倍数\r\n",i);
j=i;
while(j!=0){
if(j%10==7){printf("%d是带7的数\r\n",i); break;}
j=j/10;
}
}
return 0;
} 12、C032-水仙花数
“水仙花数”是指一个三位正整数,其各位数字的立方和确好等于该数本身,如:153=1^3+5^3+3^3 (其中^表示乘方,5^3表示5的3次方),则153是一个“水仙花数”。
输入n, m,100<=n,m<1000, 求出[n,m]之间的水仙花数。若该区间没有水仙花数,输出-1.
输入:n,m,用空格隔开。
输出:若干水仙花数,用空格隔开
#define _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
int main()
{
int n,m,i,a,b,c,flag;
scanf("%d%d",&n,&m);
flag=0;
for(i=n;i<=m;i++)
{
a=i/100;//百位
b=(i/10)%10;//十位
c=i%10;//各位
if(a*a*a+b*b*b+c*c*c==i){printf("%d ",i);flag=1;}
}
if(flag==0) printf("-1");
printf("\n");
return 0;
} 13、C016-求勾股数
若三个正整数a,b,c满足 a^2+b^2=c^2,则它们是一组勾股数。(^2表示平方,a^表示a的平方)。编写程序,求给定区间[m,n]中的勾股数的数量(设一组勾股数满足a<b<c)。例如[1,10]中的勾股数有(3,4,5)和(6,8,10),则[1,10]中勾股数的数量为2
输入:正整数m,n, m,n>0.
输出:[m,n]中的勾股数的数量
/*以下是方框提示:
输入M,N(枚举a、b和c,搜索所有满足勾股数条件的a,b,c)
①外循环变量i:M到N
②j循环查找i+1到N
③k循环查找j+1到N
④若k^2=i^2+j^2,则勾股数统计值+1;否则k+1。直到k=N;
⑤使j+1,继续④,直到j=N;
⑥使i+1,继续③和④,直到i=N。表示搜索完成全部a,b,c。*/
#define _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
int main()
{
int k,i,j;
int M,N,C=0;
scanf("%d%d",&M,&N);
for(i=M;i<=N;i++)
for(j=i+1;j<=N;j++)
for(k=j+1;k<=N;k++)
if(k*k==i*i+j*j){
//printf("%d %d %d\n",i,j,k);
C++;}
printf("%d\n",C);
return 0;
}
/*CASE:1 100,52;100 200,12; 90 150,3; 300 601,44*/ 14、C018-计算一个正整数各位数字的平方和
输入任意一个正整数,计算各位数字的平方和。如:1234 则:计算1*1+2*2+3*3+4*4=30
(先拆分每个数,再求平方和)
#define _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
int main()
{
int n,sum=0,x;
scanf("%d",&n);
x=n;
while(n!=0){x=n%10;sum=sum+x*x;n=n/10;}
printf("%d",sum );
return 0;
} 15、C050-检验由三边能否构成三角形
编写程序检验由三边能否构成三角形,检验方法是任意两边和均要大于第三边
#include "stdio.h"
int main()
{
double a,b,c;
scanf("%lf%lf%lf",&a,&b,&c);
if(a+b>c&&b+c>a&&c+a>b) printf("YES\n");
else printf("ERROR DATA\n");
return 0;
} 三、(8)
1、C061-最大公约数
求n个数的最大公约数。2<=n<50
输入:n个正整数,以0作为数的结束。用空格隔开。
输出:最大公约数和这n个数,用一个空格隔开。
注:输入中,输入的数的个数是不确定的,不超过50,不小于2,最后的0是结束标志。输出中,第1个数是它们的最大公约数,后面是输入的n个数,中间用一个空格隔开。
#define _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
#include "string.h"
int gcd(int p,int q)
{
int tmp,r;
if(p《q){tmp=p;p=q;q=tmp;}
r=p%q;
while(r!=0){p=q;q=r;r=p%q;}
return q;
}
int main()
{
int k1,n,i;
int a[50],b,c;
scanf("%d%d",&a[0],&a[1]);
n=2;
b=gcd(a[0],a[1]);
scanf("%d",&a[n]);
while(a[n]!=0){b=gcd(b,a[n]);n++;scanf("%d",&a[n]);}
printf("%d ",b);
for(i=0;i《n-1;i++) printf("%d ",a[i]);
printf("%d\n",a[n-1]);
return 0;
} 2、C062-最小公倍数
求n个数的最小公倍数,2<=n<10。
输入:n个正整数,以0作为数的结束。用空格隔开。
输出:最小公倍数和这n个数,用一个空格隔开。
样例:
210 54 24 0
7560 210 54 24
注:输入中,输入的数的个数是不确定的,不超过10,不小于2,最后的0是结束标志。输出中,第1个数是它们的最小公倍数,后面是输入的n个数,中间用一个空格隔开。
#define _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
#include "string.h"
int gcd(int p,int q)
{
int tmp,r;
if(p《q){tmp=p;p=q;q=tmp;}
r=p%q;
while(r!=0){p=q;q=r;r=p%q;}
return q;
}
int main()
{
int k1,n,i,sum;
int a[50],b,c;
scanf("%d%d",&a[0],&a[1]);
n=2;
b=gcd(a[0],a[1]);
scanf("%d",&a[n]);
while(a[n]!=0){b=gcd(b,a[n]);n++;scanf("%d",&a[n]);}
sum=a[0];
for(i=1;i《n;i++) sum*=a[i]/b;
printf("%d ",sum);
for(i=0;i《n-1;i++) printf("%d ",a[i]);
printf("%d\n",a[n-1]);
return 0;
} 3、C125-找素数(涉及排序,放后)
输入6个整数,用空格分隔。找出这6个整数中的所有素数,并对这些素数进行从小到大排序。若未找到素数,输出“NULL”。
#define _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
#include "math.h"
int isprime(int a)
{
int i,k;
k=(int)sqrt(a);
for(i=2;i<=k;i++){
if(a%i==0) return 0;
return 1;
}
}
int main()
{
int i,j,a[6],b,k=0;
for(i=0;i<6;i++)
{
scanf("%d",&b);
if(isprime(b)){a[k]=b;k++;}
}
if(k==0) printf("NULL\n");
else{
for(i=0;i《k-1;i++){
for(j=0;j《k-1-i;j++){
if(a[j]>a[j+1]){b=a[j];a[j]=a[j+1];a[j+1]=b;}
}
}
for(i=0;i《k;i++) printf("%d ",a[i]);
}
return 0;
} 4、C013-将一个大于4的正整数分解为连续的正整数之和
编程,将一个大于4的正整数分解为连续的正整数之和,请显示全部分别结果。
#define _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
#include "math.h"
int main()
{
int n;
printf("请输入正整数n: ");
scanf("%d",&n);
for(int i=1;i《n;i++)
{
int j=i,s=0;
for(int j=i;s《n;j++){
s=s+j;
if(s==n)
{
printf("%d=",n);
for(int k=i;k<=j;k++){if(k==j) printf("%d",k);else printf("%d+",k);}
printf("\b\r\n");
break;
}
}
}
return 0;
} 5、C033-公式计算1+1/(1+2)+1/(1+2+3)+…+1/(1+2+3+…+n)
输入整数n>=1,计算下式的值。s=1+1/(1+2)+1/(1+2+3)+…+1/(1+2+3+…+n)
输入:正整数
输出:实数,格式"%f\n".
#define _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
int main()
{
int i,n;
double s=1,x=1;
scanf("%d",&n);
for(i=2;i<=n;i++){x=x+i;s=s+1/x;}
printf("%f\n",s);
return 0;
} *6、C019-求出一个正整数的质因子的和
输入一个正整数,求出它的质因子的和。例如,12的质因子和为2+2+3=7。如果输入的是质数,直接显示0.
输入:正整数
输出:质因子的求和表达式。加号和等号是英文符号。
Case: 75779676 2+2+3+3+7+7+7+17+19+19=86
#define _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
int main()
{
int k1,a,x,k,sum=0;
scanf("%d",&x);
k=2;
a=x/2;
while(k《a)
{
if(x%k==0){
if(x==k) printf("%d=",k);
else printf("%d+",k);
sum+=k;
x=x/k;
}
else k++;
}
printf("%d\n",sum);
return 0;
} **7、C020-输入一自然数n,求组成n3的n个连续奇数(代码有误)
任何一个自然数m的立方均可写成m个连续奇数之和。例如:
1^3=1
2^3=3+5
3^3=7+9+11
4^3=13+15+17+19
编程实现:输入一自然数n,求组成n^3的n个连续奇数。
输入:一个正整数n。输出:组成n^3的连续奇数,用一个空格分隔
#define _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
int main()
{
int k1,n,a,n1,i;
scanf("%d",&n);
a=n*n*n;
if(n%2==1){
n1=a/n-n/2*2;
for(i=0;i《n;i++){printf("%d ",n1+i*2);}
printf("\n");
}else{
n1=a/n-n/2*2+1;
for(i=0;i《n;i++) printf("%d ",n1+i*2);
printf("\n");
}
return 0;
} **8、C024-求找回硬币的换法
很久以前,购物还经常找回硬币。把n张1元纸币换成一分、二分和五分面值的硬币,假设每种至少一枚,问有多少种换法?n值由用户从键盘输入,换法的数量。
输入:2 输出:1921
#include "stdio.h"
int main()
{
int n,x,y,z,c=0;
scanf("%d",&n);
for(x=1;x<=n*100;x++)
{
for(y=1;y<=n*50;y++){
z=(n*100-x-2*y)/5;
if(z>0&&x+2*y+5*z==n*100){/*printf("%d %d %d\n",x,y,z);*/c++;}
}
}
printf("%d\n",c);
return 0;
} 9、C039-电梯运行时间计算
某城市最高的楼有一部电梯,该电梯依照输入楼层数的先后次序运行。电梯最初在0层。运行完一个输入序列后就停止在该楼层,不返回0层。编写程序计算电梯运行一个序列的时间。电梯每上1层需要6秒。每下1层需要4秒。如在某层停留,无论上下人多少,均停留5秒。楼层的值大于等于1,小于100 , 0在序列中表示结束序列输入。程序输入电梯运行序列,输出电梯运行时间(秒)。
#define _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
int main()
{
int num[20]={0};
int x,i=1,time=0,j;
do{
scanf("%d",&x);
if(x>=1&& x<100){
num[i]=x;//不在范围的楼层直接就忽略不计
i++;
}
}while(x!=0);
for(j=1;j<i;j++)
{
if(num[j]>num[j-1]){time+=(num[j]-num[j-1])*6+5;}
else{time+=(num[j-1]-num[j])*4+5;}
}
printf("%d\n",time);
return 0;
} 10、C041-小明的计算(无)
11、C102-求一组数中的最大值并统计出现次数
求一组数中的最大值,然后统计该最大值在这组数中出现的次数。
输入:元素个数n和n个整数。n<200。
输出:最大值及出现的次数。数据间以一个空格隔开。
#include "stdio.h"
int main()
{
int k1,a[200],n,i,max,k=0;
scanf("%d",&n);
for(i=0;i《n;i++) scanf_s("%d",&a[i]);
max=a[0];
for(i=1;i《n;i++){if(a[i]》max) max=a[i];}
for(i=0;i《n;i++){if(a[i]==max) k++;}
printf("%d,%d\n",max,k);
return 0;
} 12、C051-求最大公约数和最小公倍
输入3个正整数,求最大公约数和最小公倍数。
输入:3个正整数
输出:最大公约数和最小公倍数,空格分隔。
#define _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
int main()
{
int a,b,c,max,min;
scanf("%d%d%d",&a,&b,&c);
max=a; min=a;
while(a%min||b%min||c%min) min--;
while(max%a||max%b||max%c) max+=a;
printf("%d %d\n",min,max);
return 0;
} 13、该整数分解为1和各个质因子的相乘
从键盘输入一个正整数(>1),然后将该整数分解为1和各个质因子的相乘,如果输入的整数本身就是质数,则应分解为1和该数本身相乘。
define _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
int main()
{
int n,i;
scanf("%d",&n);
printf("1");
for(i=2;i<=n;i++){while(n%i==0){printf("*%d",i);n=n/i;}}
return 0;
} 14、C054-输出分数序列前n项之和
有一分数序列如下: 2/1, 3/2, 5/3, 8/5, 13/8, 21/13, … 即后一项的分母为前一项的分子,后项的分子为前一项分子与分母之和,求其前n项之和。
输入:项数n(整数)
输出:前n项之和(实数,注:保留4位小数)
define _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
double SumN(int num)
{
int fenmu=2,fenzi=1,i,temp;
double ans=0;
for(i=1;i<=num;i++)
{
ans+=fenmu*(1.0)/fenzi;
temp=fenmu;fenmu+=fenzi;fenzi=temp;
}
return ans;
}
int main()
{
int n;
scanf("%d",&n);
printf("%.4lf\n",SumN(n));
return 0;
} 15、C056-月份天数计算
输入公元年份和月份,输出该月份的天数。
输入:年,月(逗号分隔)
输出:天数
#define _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
int main()
{
int year,mon,day;
scanf("%d,%d",&year,&mon);
switch(mon)
{
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(year%4==0&&year%100!=0||year%400==0) day=29;
else day=28;
}
printf("%d",day);
return 0;
} 四、(9)
1、C059-数组循环移动
"一个数组A中存有n(n>0)个整数,在不允许使用另外数组的前提下,将每个整数,循环向右移m(m>=0)个位置,即将A中的数据由(A0A1……An-1)变换为(An-m…… An-1A0A1……An-m-1)(最后m个数循环移至A的最前面的m个数)。输入n ( 1<=n<=100)、m(m>=0)及n个整数,输出循环右移m位以后的整数序列。
输入:
第1行输入n和m两个数,n和m之间用空格分隔。
第2行输入数组A中的n个数,数据间用空格分隔。
输出:占一行,数据间用一个空格分隔。
#include "stdio.h"
int main()
{
int a[100],n,m,i,j;
scanf("%d%d",&n,&m);
for(i=0;i《n;i++) scanf("%d",&a[i]);
printf("输出:\n");
for(i=1;i《=m;i++){
int x=a[n-1];
for(j=n-2;j》=0;j--) a[j+1]=a[j];
a[0]=x;
}
for(i=0;i《n;i++) printf("%d ",a[i]);
printf("\n");
return 0;
} 2、C068-去掉字符串中的空格
"去掉字符串中的空格。字符串长度不超过200.
输入:带空格的字符串。
输出:不含空格的字符串。
/*以下为方框提示:
#include
#include
int main()
{
char str[20];
int i,len,n;
gets_s(str,20);
len=strlen(str);
for(i=0;i《len;i++)
{
if(str[i]==' '){
for(n=i;n《len;n++) str[n]=str[n+1];
len--;
}
}
for(i=0;i《len;i++) printf("%c",str[i]);
printf("\n");
return 0;
}*/
#define _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
#include "string.h"
void mytrim(char *s1)
{
char tmp[200];
char *s2=tmp;
while(*s1!=0){if(*s1!=' '){*s2=*s1;s2++;} s1++;}
*s2=0;
printf("%s\n",tmp);
}
int main()
{
char str[200];
gets_s(str,200);
mytrim(str);
return 0;
}
/*学生作业:
#define _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
#include "string.h"
int main(){
char a[202],b[202]; int i,m,n=0;
gets(a); m=strlen(a);
for(i=0;i《m;i++) (a[i]== ' ')?0:(sprintf(&b[n],"%c",a[i]),n++);
puts(b);
return 0;
}*/ 5、C129-统计其中各个英文字母的出现次数
输入一个可能带空格字符的字符串(长度不超过200),统计其中各个英文字母的出现次数,不区分大小写。输出字母a~z的出现次数,数据间以英文逗号分隔。非英文字母不统计。
输入:可能带空格的字符串。
输出:26个整数,以英文逗号分隔。
#define _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
#include "string.h"
int main()
{
int f[26]={0},i=0,k;
char s[50]; gets(s);
while(s[i]!='\0')
{
if(s[i]>='a'&&s[i]<='z'){k=s[i]-'a';f[k]++;}
if(s[i]>='A'&&s[i]<='Z'){k=s[i]-'A';f[k]++;}
i++;
}
for(i=0;i<25;i++){printf("%d,",f[i]);}
printf("%d\n",f[25]);
return 0;
} 6、C015-将无符号二进制整数转换为十进制
从键盘输入一个位数不超过20位的无符号二进制整数,将其转换为十进制。
输入:二进制序列
输出:对应的十进制数
#define _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
int fun(char b[])
{
int i=0;
while(b[i]!='\0'){
if(b[i]!='1'&&b[i]!='0') return 0;
i++;
}
return 1;
}
int main()
{
int k,n=0,i=0;
char bin[30];
scanf("%s",bin);
if (fun(bin)==1){
while(bin[i]!='\0'){n=n*2+bin[i]-'0';i++;}
printf("%d\n",n);
}
else printf("Not a binary number\n");
return 0;
} 14、C113-求给定区间中的孪生数的数量
所谓孪生素数是指间隔为 2 的相邻素数,例如最小的孪生素数是3和5,5和7也是孪生数。
编写程序,求给定区间[m,n]中的孪生数的数量。例如[2,10]中的孪生数有(3,5)和(5,7),则[2,10]中孪生数的数量为2.
输入:正整数m,n, m,n>1.
输出:[m,n]中的孪生的数量
#define _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
int isprime(int n)
{
int i;
for(i=2;i《n;i++){if(n%i==0) return 0;}
return 1;
}
int main()
{
int i,M,N,C=0;
scanf_s("%d%d",&M,&N);
for(i=M;i<=N;i++){if(isprime(i)&&isprime(i+2)){/*printf("%d %d\n",i,i+2);*/C++;}}
printf("%d\n",C);
return 0;
} 五、(10)
1、C002-八进制转换十进制
编写程序,将用户输入的最多5位八进制数转换为十进制。
输入:一个整数;输出:一个整数。
编写程序,将用户输入的最多5位八进制数转换为十进制。
输入:一个整数。
输出:一个整数。
#define _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
#include "math.h"
#define M 1000
int main()
{
char *p,s[6];int n;
p=s;gets(p);
n=0;
while(*(p)!='\0'){n=n*8+*p-'0';p++;}
printf("%d",n);
return 0;
} 3、C065-求素数个数
求[n,m]区间中的所有素数及素数的个数。
输入:n,m
输出:列出[n,m]中的所有素数,中间用一个空格隔开,最后显示素数的个数。
样例:
10 30
11 13 17 19 23 29 6
#include "stdio.h"
#include "math.h"
int isprime(int n)
{
int s,i,f=1;
s=sqrt(n);
for(i=2;i<=s;i++) if(n%i==0) return 0;
return 1;
}
int main()
{
int n,m,sum=0,i;
scanf_s("%d%d",&n,&m);
for(i=n;i<=m;i++) if(isprime(i)){printf("%d ",i);sum=sum+1;}
printf("%d\n",sum);
return 0;
} 4、C126-判断一个正整数是否为回文数
编写一个函数来判断一个正整数是否为回文数,若是则返回1,否则返回0。所谓回文数是指各位数字左右对称的数,例如1221、3553等。该函数的原型为:
int ispalindrome(int n);
其中参数n是待判断的正整数,该函数有返回结果。
编写主函数,对上述函数进行测试,并找出1000∽n (1000 ≤ n <10000)之间的所有回文数,按从小到大的次序在屏幕上显示输出,每个数之间用一个空格分隔,最后一个数后面没有空格。
#define _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
int ispalindrome(int n)
{
int s=n,m=0;
while(s!=0){m=m*10+s%10;s=s/10;}
return(n==m?1:0);
}
int main()
{
int n,i;
scanf("%d",&n);
for(i=1000;i<=n;i++){if(ispalindrome(i)==1) printf("%d ",i);}
printf("\n");
return 0;
} 12、C086-按规则去掉字符串末尾多余的星号
编写程序,去掉字符串末尾多余的星号。输入带星号(*)的字符串和n,使字符串尾部的*号不得多于n个;若多于n个,则删除多余的*号;若少于或等于n个,则什么也不做,字符串中间和前面的*号不删除。字符串的长度不超过200。字符串中的星号是英文星号。
输入:一个字符串和一个非负整数,中间用空格隔开。
输出:去掉多余*号的字符串。
样例:
2
#define _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
#include "string.h"
void fun(char *a,int n)
{
int i=0,k=0; char *t; t=a;
while(*t!='\0'){t++;}
t--;
k=0;//末尾星号个数
while (*t=='*'){k++;t--;}
if(k>n){
i=0;
while(i《n){t++;i++;}
*(t+1)='\0';
}
}
int main()
{
int k1,n;
char s[200];
scanf("%s%d",s,&n);
fun(s,n);
printf("%s\n",s);
return 0;
} 15、C066-打点滴时间计算
在医院打点滴(吊针)的时候,如果滴起来有规律,先是滴一滴,停一下;然后滴二滴,停一下;再滴三滴,停一下...,现在有一个问题:这瓶盐水一共有v毫升,每一滴是d毫升,每一滴的速度是一秒(假设最后一滴不到d毫升,则花费的时间也算一秒),停一下的时间也是一秒,这瓶水什么时候能滴完呢?(0 < d < v <6000)
输入:一滴是多少毫升和一瓶盐水有多少毫升,中间用空格隔开.
输出:滴完需要多少时间.
滴液情况:102030...n0X,其中0代表停一下,1≤X≤n+1
于是总滴数a=(1+n)*n/2+X,总时间为a+n
此外(a-1)*d<v≤ad,即a-1<v/d≤a,所以a=v/d+1
/*根据1≤X≤n+1,a=(1+n)*n/2+X,可得数学关系:n^2+n+2≤2a≤n^2+3n+2*/
#include "stdio.h"
int main()
{
float d,v; int a; scanf("%g%g",&d,&v); a=v/d+1;
int n;
for(n=1;2*an*n+3*n+2;n++)
printf("%d",a+n);
system("pause");
return 0;
}
/*另附:
int main()
{
int n,i,t=0; float v,d;
scanf_s("%f%f",&d,&v);
n=v/d;
for(i=1;i<=n;i++) t=t+i;
t=t+n;
printf("%d",t);
return 0;
}*/ 六、(11)
1、C120-去掉一个字符串中除头部和尾部空格外的所有空
编写函数,去掉一个字符串中除头部和尾部空格外的所有空格,并编写主函数进行调用测试。
输入:占一行(注:输入的字符串长度不会超过80)
输出:占一行
#include "stdio.h"
#include "string.h"
char *delspace(char *str)
{
char *s,*t;//找字符串左边第一个非空格字符,由s指向;
s=str;//s的初值,指向左边第一个字符
while(*s!='\0'&&*s==' ') s++;//找字符串右边第一个非空格字符,由t指向;
t=str+strlen(str)-1;//t的初值,指向str字符串中右边第一个字符
while(*t == ' ') t--;//删除s到t之间所有空格字符;
while(t>=s)
{
if(*t==' '){
char *p=t;
while(*(p+1)!='\0'){*p=*(p + 1);p++;}
*p='\0';
}
t--;
}
return str; //返回首地址str。
}
int main()
{
char str[81];
gets_s(str,81);
puts(delspace(str));
return 0;
} 2、C092-删除相应字符组成一个新串(无)
编写程序,将s所指字符串中除了下标(从0开始)为奇数、同时ascii值也为奇数的字符之外,其余的所有字符都删除,串中剩余字符所形成的一个新串放在t所指的一个数组中并显示。若没有满足条件的字符,显示“#”。字符串长度不超过200.
输入:长度不超过200的字符串(无空格)。
输出:处理后的字符串。
Case: IN:attend OUT:e
abcdef OUT:#
celebrating OUT:ee
military OUT:iiay
3、C067-整数三位分节(无)
写出正整数的三位分节格式。如,当用户输入82668634时,程序应该输出82,668,634。
输入:正整数 输出:三位分解格式。
样例:
82668634
82,668,634
4、C093-字符串中奇数下标的字符顺序颠倒(无)
将字符串中奇数下标(从0开始)的字符顺序颠倒。如字符12345678,结果为18365472
输入:字符串,不含空格。
输出:结果字符串。
Case: 1234567890 1038567492
5、C072-删除字符(无)
编写程序,输入字符串到字符数组s中,再输入一个字符给变量c,判断s中是否有c,若有则将该字符从s中删除后输出。若没有,则输出字符串“NotFound”。
输入2行,1个字符串和1个字符:
输出:删除后的字符串
样例1:
输入:
smiles
s
输出:
mile
样例2:
输入:
smiles
a
输出:
NotFound
6、C077-找到出现最多的字符(无)
编写程序,要求在一个字符串中查找连续出现次数最多的一个字符,并显示其所在的开始下标和次数。(如果出现最多的字符不止一个,输出最靠前的字符)
输入:一个字符串
输出:出现最多的字符,次数,开始下标
样例:输入:xyxyzzzqqq1122334 输出:z 3 4
aaabbcc123 a 3 0
123abcdddd d 4 6
Aaaaa a 5 0
7、C078-加密字符串
编程函数,将字符串(长度小于20个字符)用替换加密法译成密码。
替换加密的加密规则是:将原来的字母用字母表中其后面的第3个字母来替换,对于字母表中最后的三个字母,可将字母表看成是首尾衔接的。如字母c就用f来替换,字母y用b来替换。例如输入字符串为“Study”,则加密后的字符串为“Vwxgb”。
样例:输入:Student 输出:Vwxghqw
study vwxgb
#define _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
#include "string.h"
int secret(char a[],int m);
int main()
{
char a[21]={0};
int m;
gets(a);
m=strlen(a);
secret(a,m);
return 0;
}
int secret(char a[],int m)
{
for(int i=0;i<m;i++)
{
if(a[i]>='a'&&a[i]<='z') a[i]=(a[i]-'a'+3)%26+'a';
if(a[i]>='A'&&a[i]<='Z') a[i]=(a[i]-'A'+3)%26+'A';
printf("%c",a[i]);
}
return 0;
}
8、C079-字符串反转函数(无)
编写字符串反转函数,该函数将指定字符串中的字符左右顺序颠倒排列。该函数的原型为:
char * mystrrev(char string[]);
其中参数string是待反转的字符串,该函数的返回值为左右顺序颠倒后的字符串指针。
编写主函数,对上述函数进行测试。
样例:
abcdefghijklmn
nmlkjihgfedcba
9、C100-将字符串中的空格改为逗号
编写程序,输入字符串到字符数组s中,将字符串中的空格均改为逗号(每1个空格对应1个英文逗号)。 输入一行:字符串。 输出一行:改变后的字符串; 若没有空格,则输出字符串“NotFound”。
#include "stdio.h"
#include "string.h"
int main()
{
char str[20];
int i,len,n=0;
gets_s(str,20);
len=strlen(str);
for(i=0;i《len;i++){if(str[i]==' '){str[i]=',';n++;}}
if(n==0) printf("NotFound\n");
else{
for(i=0;i《len;i++) printf("%c",str[i]);
printf("\n");
}
return 0;
} 10、C134-最大最小和平均值(无)
编写函数,寻找具有n个元素的一维数组中的最大值和最小值,并返回数组元素的平均值,函数原形如下:
double fun(int a[],int n,int *max,int *min);
输入输出格式:
输入:用户输入的n+1个数,用空格分隔。第一个数为数组元素个数n。
输出:3个数字:第一个数字为数组中的最大元素值,第二个数字为数组中的最小元素值,第三个数字为数组元素的平均值(保留小数点后6位有效数字)。3个数用空格分开。
11、C080-查字典
设5个单词的单词表,""reserve"", ""replace"", ""core"", ""nature,"" ""literature"",编写程序在单词表中查找单词,若找到,则显示YES,若找不到则显示NO。查找不区分大小写。
输入:一个表示单词的字符串。
输出:YES或NO。
样例1:literature YES
#define _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
#include "string.h"
#include "ctype.h"
int mystrcmp(char *p1,char *p2)
{
while(tolower(*p1)==tolower(*p2) && *p1!=0 && *p2!=0) {p1++;p2++;}
return tolower(*p1)-tolower(*p2);
}
int main()
{
int N=5,flag=0,i;
char s[5][20]={"reserve","replace","core","nature","literature"};
char word[20];
scanf("%s",word);
flag=0;
for(i=0;i《N;i++){if(mystrcmp(word,s[i])==0) flag=1;}
if(flag==1) printf("YES\n");
else printf("NO\n");
return 0;
} 12、C106-新兵报数问题(无)
某部队进行新兵队列训练,将新兵从1开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始1至2报数,凡报到2的出列,剩下的向小序号方向靠拢,再从头开始进行1至3报数,凡报到3的出列,剩下的向小序号方向靠拢,继续从头开始进行1至2报数,以后从头开始轮流进行1至2报数、1至3报数直到剩下的人数不超过三人为止。编写程序,输入数N为最开始的新兵人数(20 < N < 6000),输出剩下的新兵最初的编号。
第七周
14、C018-计算一个正整数各位数字的平方和
输入任意一个正整数,计算各位数字的平方和。如:1234 则:计算1*1+2*2+3*3+4*4=30
(先拆分每个数,再求平方和)
#define _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
int main()
{
int n,sum=0,x;
scanf("%d",&n);
x=n;
while(n!=0){x=n%10;sum=sum+x*x;n=n/10;}
printf("%d",sum );
return 0;
} 八、(13)
7、C121-将一个字符串str中指定的字符ch删去
编写函数,将一个字符串str中指定的字符ch删去(包括重复出现的字符),并编写主函数进行调用测试。函数原型: void delchar(char *str,char ch);。
输入:占二行。
第1行,输入任意字符串(注:输入的字符串长度不会超过80)
第2行,输入一个字符
输出:占一行
#include "stdio.h"
void delchar(char *str,char ch)
{
int k,i=0;
while(1)
{
k=i;
while(*(str+k)!='\0'&&*(str+k)!=ch) k++;
if(*(str+k)!='\0'){
i=k;
while(*(str+k+1)!='\0'){*(str+k)=*(str+k+1);k++;}
*(str+k)='\0';
}
else break;
}
}
int main()
{
char str[81],ch;
gets(str);
ch=getchar();
delchar(str,ch);
puts(str);
return 0;
} 8、C122-计算函数ack(m,n)的值
编程计算函数ack(m,n)的值,其中m,n定义域是非负整数(m<=3,n<=10)。
当m=0时,ack(0,n)=n+1;当n=0时,ack(m,0)=ack(m-1,1);其它情况下,ack(m,n)=ack(m-1,ack(m,n-1))
#define _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
#include "math.h"
int ack(int m, int n)
{
if(m==0) return n+1;
if(n==0) return ack(m-1,1);
return ack(m-1,ack(m,n-1));
}
int main()
{
int m, n;
/*printf("请输入m和n: ");*/scanf_s("%d %d",&m,&n);
printf("ack(%d,%d)=%d\r\n",m,n,ack(m, n));
return 1;
} *10、C123-电话簿排序
编写一个程序,读入n个用户姓名和电话号码,按姓名的字典顺序排列后,输出用户的姓名和电话号码,n从键盘输入。
#define _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
#include "string.h"
struct student
{
char name[100];
char tel[100];
};
typedef struct student Student;
void Bubble(Student a[],int n)
{
int i,j;
Student t;
for(i=0;i<n;i++)
for(j=n-1;j>i;j--)
if(strcmp(a[j].name,a[j-1].name)<0)
{t=a[j];a[j]=a[j-1];a[j-1]=t;}
}
int main()
{
Student a[10];
int n=5,i,j;
scanf("%d",&n);
for(i=0;i《n;i++){
scanf("%s",a[i].name);
scanf("%s",a[i].tel);
}
Bubble(a,n);
for(i=0;i《n;i++) printf("%s %s\n",a[i].name,a[i].tel);
return 0;
} 11、C091-将第n到第m个元素移到数组的末尾
一维数组中按顺序存放着1,2,3,...,15共15个整数,输入n,m, 1<=n<=m<=15为整数,将第n到第m个元素移到数组的末尾。
输入:正整数n,m,中间用空格隔开。
输出:顺序改变的数组元素,用英文逗号隔开,末尾没有逗号。
#define _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
#include "string.h"
void fun(int *w,int p,int q,int n)
{
int b[100],i,j=0,k;
for(i=p-1;i《q;i++){b[k]=w[i];/*中间元素移出来*/k++;}
k=0;
for(j=q;j《n;j++){w[p-1+k]=w[j];/*后面的元素前移*/k++;}
for(j=0;j<(q-p+1);j++){w[n-(q-p+1)+j]=b[j];/*移出的元素放回来*/}
}
int main(){
int k1,a[20],N=15; //数组元素个数
int n,m,i;
for(i=0;i《N;i++) a[i]=i+1;
scanf("%d%d",&n,&m);
fun(a,n,m,N);
for(i=0;i《N-1;i++) printf("%d,",a[i]);
printf("%d\n",a[N-1]);
return 0;
} *13、C124-学生成绩排序
有n名学生,每个学生的数据包括学号、姓名、三门课的成绩。可以从键盘输入n个学生的数据,按总成绩从小到大排序,打印包含学号、姓名、三门课成绩和总成绩的成绩单。(测试时,数据从键盘输入。)
输入:第1行为整数n,后面n行表示n个人的信息,包括学号、姓名、和三门课的成绩,每行的数据间用空格隔开。
输出:n行,表示n个人的信息,包括学号、姓名、三门课的成绩和总成绩,数据间一个空格,末尾无空格。
#define _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
#include "string.h"
#define COURSE 3
struct studentType
{
int id;//学号
char name[20];//姓名
int score[COURSE];//课程成绩
int GPA;//总成绩
};
typedef struct studentType StudentType;
void Sort(StudentType p[],int COUNT)
{
StudentType tmp;
int i,j;
for(i=0;i《COUNT;i=i+1)
for(j=COUNT-1;j》i;j=j-1)
if(p[j].GPA《p[j-1].GPA){tmp=p[j];p[j]=p[j-1];p[j-1]=tmp;}
}
int main()
{
StudentType xjtuStudent[10];
int n,i,j;
scanf("%d",&n);
for(i=0;i《n;i++)
{
scanf("%d",&xjtuStudent[i].id);
scanf("%s",xjtuStudent[i].name);
xjtuStudent[i].GPA=0;
for(j=0;j《COURSE;j++){
scanf("%d",&xjtuStudent[i].score[j]);
xjtuStudent[i].GPA=xjtuStudent[i].GPA+xjtuStudent[i].score[j];
}
xjtuStudent[i].GPA=xjtuStudent[i].GPA;
}
Sort(xjtuStudent,n);
for(i=0;i《n;i++){
printf("%d %s ",xjtuStudent[i].id,xjtuStudent[i].name);
for(j=0;j《COURSE;j++) printf("%d ",xjtuStudent[i].score[j]);
printf("%d\n",xjtuStudent[i].GPA);
}
return 0;
} 15、C064-翻译数字
编写一个程序,从键盘中读入一个数字串,把它转为数字的小写英语单词输出,如读入234,输出“two three four”。
输入:一串数字
输出:用空格隔开的英文基数词,小写。
#define _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
int main()
{
char ch;
int n;
scanf("%c",&ch);
while(ch!='\n'){
n=ch-'0';
switch(n)
{
case 0:printf("zero");break;
case 1:printf("one");break;
case 2:printf("two");break;
case 3:printf("three");break;
case 4:printf("four");break;
case 5:printf("five");break;
case 6:printf("six");break;
case 7:printf("seven");break;
case 8:printf("eight");break;
case 9:printf("nine");break;
}
printf(" ");
scanf("%c",&ch);
}
printf("\n");
return 0;
} 140、C116-计算某日是某年的第几天(难度:2)
1)定义存储年、月、日的变量,定义天数计算值变量并初始化为0;
2)输入年、月、日
3)按输入的月数,循环统计天数总数;
4)Switch(月数)
5)若月数=1,则天数值+31;
6)如果是2月(Case 2:),则调用闰月判断函数。若函数返回值为1,则为闰月;返回0则非闰月。
7)若为闰月,则天数计算值+29;否则+28;
8)若月数=3,5,7,8,10,12,则天数+31,否则天数+30。直到月数计算结束。
9)将计算总和+输入的日;
10)输出结果。
#include "stdio.h"
int isleap(int year)
{
if(year%4==0&&year%100!=0||year%400==0) return 1;
return 0;
}
int main()
{
int a,b,c,sum=0,i;
scanf("%d%d%d",&a,&b,&c);
for(i=1;i《b;i++)
{
switch(i)
{
case 2:if(isleap(a))sum=sum+29;else sum=sum+28;break;
case 1:case 3:case 5:case 7:case 8:case 10:
case 12:sum=sum+31;break;
default:sum=sum+30;
}
}
sum=sum+c;
printf("%d\n",sum);
return 0;
} **142、C056-取石子__Wythoff’s game(威佐夫博弈)(难度:5)(无)
有两堆石子,数量任意,可以不同。游戏开始由两个人轮流取石子。游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子;二是可以在两堆中同时取走相同数量的石子。最后把石子全部取完者为胜者。
现在给出初始的两堆石子的数目,如果轮到你先取,假设双方都采取最好的策略,问最后你是胜者还是败者。
输入格式: 输入表示若干种石子的初始情况,包含两个非负整数 a 和 b ,表示两堆石子的数目, a 和 b 都不大于1,000,000,000。
输出格式: 包含一个数字1或0,如果最后你是胜者,则为 1,反之,则为 0。
/*t代码提示:
import math
a = int(input("请输入:"))
b = int(input("请输入:"))
if a>b:
temp = b
b = a
a = temp
k = b - a
temp = k * (1+math.sqrt(5)) / 2;
print("0" if temp == a else "1")
*/ 第九周
12、C109-统计字符串中字符的个数
输入长度小于100的字符串(由大小写字母、数字、其它字符组成,字符串中无空格),分别统计其中大写字母,小写字母,数字字符及其它字符的个数并输出统计结果,再按统计值从多到少依次输出。
输入:任意长度的字符串。 输出:统计其中大写字母,小写字母,数字字符及其它字符的个数。
样例输入: ASDFghjkl*(),;19 样例输出: 大写字母:4 小写字母:5 数字字符:2 其它字符:5 从多到少依次输出如下: 小写字母:5 其它字符:5 大写字母:4 数字字符:2
#define _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
#include "string.h"
void bubblesort(int a[],int n,char name[][20])
{
int i,j,t;
char s[20];
for(i=0;i《n-1;i++){
for(j=0;j《n-i-1;j++){
if(a[j]《a[j+1]){
t=a[j+1];a[j+1]=a[j];a[j]=t;
strcpy(s,name[j+1]);strcpy(name[j+1],name[j]);strcpy(name[j],s);
}
}
}
}
int main()
{
char str[100];
gets(str);
int count[5]={0};
char name[5][20] = { "大写字母", "小写字母", "数字字符", "其它字符", "" };
char *p=str;
while (*p!='\0')
{
if(*p》='A'&&*p<='Z'){count[0]++;}
else if(*p>='a'&&*p<='z'){count[1]++;}
else if(*p>='0'&&*p<='9'){count[2]++;}
else count[3]++;
p++;
}
printf("%s:%d %s:%d %s:%d %s:%d ",name[0],count[0],name[1],count[1],name[2],count[2],name[3],count[3]);
printf("从多到少依次输出如下: ");
bubblesort(count,4,name);
printf("%s:%d %s:%d %s:%d %s:%d\n", name[0],count[0],name[1],count[1],name[2],count[2],name[3],count[3]);
return 1;
} 第十周
(题2)7、C097-按要求将字符串s
输入由字母和数字组成的字符串s和t(串长不超过100个字符,s、t中均无空格),将在字符串s中出现,但未在字符串t中出现的字符(区分大小写)组成一个新的字符串放在u中,u中字符按原字符串中字符顺序排列,不去掉重复字符,输出u。若s中的字符在t中都出现过,输出#。
例如:当s="112345",t="2467"时,u="1135"。若s="12", t="12",输出"#"
输入:两个字符串,中间用空格隔开。scanf("%s%s",s,t);
输出:结果串
样例: 12345 6789 12345; discussed also,dicued
#define _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
#include "string.h"
int main()
{
int k1,i,j,k;
char a[80],b[80];
int flag=0;
scanf("%s%s",a,b);
int l=strlen(a);
for(i=0;b[i]!='\0';i++){for(j=0;j《l;j++) if(a[j]==b[i]) a[j]='\0';}
for(k=0;k《l;k++)
if(a[k]!='\0'){printf("%c",a[k]);flag=1;}
if (flag==0){printf("#");}
printf("\n");
return 0;
} 8、C-038 闰年计算
闰年计算。程序输入一个正整数Y,以及另一个正整数N,以一个空格分隔。计算从Y年开始后的第N个闰年是哪一年(如果Y本身是闰年,则Y之后的第一个闰年是Y)。
样例:2005 3,2016; 1855 12,1903; 2020 1024, 6240
#include "stdio.h"
int main()
{
int num;
int year;
scanf("%d %d",&year,&num);
while(num!=0){
if((year%4==0&&year%100!=0)||(year%400==0)){num--;}
year++;
}
year--;
printf("%d",year);
return 0;
} (题1)9、C040-素数判断
输入一个整数n(n>=2),判断n是否为素数。是素数输出 "YES", 否则输出 "NO"。
样例:7 YES; 12 NO; 711 NO
#define _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
int main()
{
int n,i,k;
k=1;
scanf("%d",&n);
for(i=2;i《n;i++){
if(n%i==0)/*有因数i*/{k=0;break;}
}
if(k==1){printf("YES");}
else{printf("No");}
} 第十一周
10、C134-最大最小和平均值
编写函数,寻找具有n个元素的一维数组中的最大值和最小值,并返回数组元素的平均值,函数原形如下:
double fun(int a[],int n,int *max,int *min);
输入输出格式:
输入:用户输入的n+1个数,用空格分隔。第一个数为数组元素个数n。
输出:3个数字:第一个数字为数组中的最大元素值,第二个数字为数组中的最小元素值,第三个数字为数组元素的平均值(保留小数点后6位有效数字)。3个数用空格分开。
样例:2 1 2; 2 1 1.66667
1 0; 0 0 0.50000
#include "stdio.h"
double fun(int a[], int n, int* max, int* min)
{
int i,sum;
*max=*min=a[0];
sum=0;
for(i=0;i《n;i++)
{
if(a[i]>*max) *max=a[i];
if(a[i]<*min) *min=a[i];
sum=sum+a[i];
}
return (float)sum/n;
}
int main()
{
int n,max,min,i,a[1000];
float av;
scanf("%d",&n);
for(i=0;i《n;i++) scanf("%d",&a[i]);
av=fun(a,n,&max,&min);
printf("%d %d %f\n",max,min,av);
return 0;
} (题2)13、C-082 回文字符串判断
一个字符串,如果第1个字符和最后一个字符相同,第2个字符和倒数第2个相同,...,则称为回文字符串,简称回文串。如deed。
输入一个字符串,判断是否回文字符串。若是则显示YES,否则显示NO。输入的字符串长度不超过200.
样例:d, YES; db, NO; aba, YES; 1234567887654321, YES
#define _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
#include "string.h"
int main()
{
int k1;
char s[200],*p,*q;
scanf("%s",s);
p=s;q=s;
while(*q!='\0'){q++;}
q--;
while(*p==*q&&p《q){p++;q--;}
if(p《q){printf("NO\n");}
else printf("YES\n");
return 0;
} 第十二周
10、C141-冒泡排序和选择排序
编写冒泡排序函数,函数原型:void BubbleSort(int a[],int n);对n个整数升序排序。
编写选择排序函数,函数原型:void SelectionSort(int a[],int n);对n个整数降序排序。 编写main函数,输入10个整数,利用函数将其按升序和降序分别输出排序结果。(输入输出数据间用一个空格分隔)
输入: 5 2 8 9 10 1 3 4 7 6 ; 输出:1 2 3 4 5 6 7 8 9 10 10 9 8 7 6 5 4 3 2 1
输入: -1 -2 9 7 0 78 -90 -90;
输出: -90 -90 -90 -2 -1 0 0 7 9 78 78 9 7 0 0 -1 -2 -90 -90 -9
#define _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
#include "string.h"
void BubbleSort(int a[],int n)
{
int i,j,temp;
for(j=0;j《n-1;j++){
for(i=0;i《n-j-1;i++){
if(a[i]》a[i+1]){temp=a[i];a[i]=a[i+1];a[i+1]=temp;}}
}
}
void SelectionSort(int a[],int n)
{
int biggest;
for(int i=0;i《n-1;i++)
{
biggest=i;
for(int j=i+1;j《n;j++){if(a[j]》a[biggest]) biggest=j;}
int temp=a[biggest];a[biggest]=a[i];a[i]=temp;
}
}
void Show(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 i,array[10];
for(i=0;i<10;i++){scanf("%d",&array[i]);/*通过数组和循环输需要排序的数列*/}
BubbleSort(array,10);
Show(array,10);
SelectionSort(array,10);
Show(array,10);
return 0;
} Reference:
1、快排
#include "stdio.h"
#include "math.h"
#include "stdlib.h"
void quickSort(int *arr, int begin, int end)
{
//如果区间不只一个数
if(begin<end)
{
int temp=arr[begin];//将区间的第一个数作为基准数
int i=begin;//从左到右进行查找时的“指针”,指示当前左位置
int j=end;//从右到左进行查找时的“指针”,指示当前右位置
while(i《j)
{
//当右边的数大于基准数时,略过,继续向左查找
//不满足条件时跳出循环,此时的j对应的元素是小于基准元素的
while(i《j&&arr[j]>temp) j--;arr[i]=arr[j];
//将右边小于等于基准元素的数填入右边相应位置
//当左边的数小于等于基准数时,略过,继续向右查找
//(重复的基准元素集合到左区间)
//不满足条件时跳出循环,此时的i对应的元素是大于等于基准元素的
while(i《j&&arr[i]<=temp) i++;arr[j]=arr[i];
//将左边大于基准元素的数填入左边相应位置
}
arr[i]=temp;//将基准元素填入相应位置//此时的i即为基准元素的位置
quickSort(arr,begin,i-1);//对基准元素的左边子区间进行相似的快速排序
quickSort(arr,i+1,end);//对基准元素的右边子区间进行相似的快速排序
}
//如果区间只有一个数,则返回
else return;
}
int main()
{
int num[12]={23,45,17,11,13,89,72,26,3,17,11,13};
int n=12;
quickSort(num,0,n-1);
printf("排序后的数组为:\n");
for(int i=0;i《n;i++) printf("%d ",num[i]);
printf("\n");
system("pause");
return 0;
} 2、求素数
求质数:
判断一个整数m是否为素数(质数)的方法:
1)将m被 2~m-1 之间的每一个整数去除,如果都不能被整除,则:m就是一个素数;
2)如果m 能被 2~m-1 之间任意一个整数整除,则其两个因子中,必定有一个小于或等于根号m,另一个大于或等于根号m。因此,如果m不能被 2~根号m间任一整数整除,m 必定是素数。
/*d以下为提示:
所以有:
int i,m;
for(i=2;i*i<=m;i++)
{ if(m%i==0)
m不是质数
else*/ 3、质因子
#include "stdio.h"
int a,x,k,sum=0;
scanf ("%d",&x);
k=2;//k变量存当前质因子,从2开始
a=x/2;//a变量放循环上限,因为最大的质因子也不会大过这个
while(k《a)//循环检查每一个数,从2到a
{
if(x%k==0)//x为当前商值,如果x能被k整除,则说明当前k值为质因子
{
if(x==k) printf("%d=",k);//如果x与k相同,则说明k为最大质因子,打印出=
else printf("%d+",k);//不是最大质因子,打印出+,说明后面还有
sum+=k;//质因子累加到和值中
x=x/k;//从商值中除去质因子
}
else/*如果x不能被k整除,说明不是质因子*/ k++;/*k+1,检查下一个整数*/
}
printf("%d\n",sum);
return 0;
}