西安交通大学 C语言作业
我在锡林郭勒等你
2021年03月28日 18:11

以下是大计基编程题目or题目,直接来源于吴宁教授(2020年11月30日)。

B站专栏的程序块一个Bug是#include丢<>部分,用&#​34;"可以,但因为基本上是<stdio.h>,不改。还有不知为何有时遇到<就自动去掉程序后半部分,起初我想截图,为了保持一致性,<换成《,>换成》。

时间仓促,并没有对每个程序进行核验,难免有错误,敬请读者指正。


一、(6)

1、C055-第一个程序(无)

2、C005-编写程序完成对应数的输出

用户输入一个8位十进制整数,编写程序取出该整数的中间4位数输出,并将取出的数加上1024的得数输出。

输入:一个整数。

输出:两个整数,用空格分隔。

代码块
clike
自动换行
复制代码
#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个整数;输出:整数

代码块
clike
自动换行
复制代码
#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.

输入:两个整数,中间用空格隔开

输出:一个整数。

代码块
clike
自动换行
复制代码
#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行显示,空格分隔

代码块
clike
自动换行
复制代码
#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个整数,依次为和、差、积和商,数据间用空格分隔。

代码块
clike
自动换行
复制代码
#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&#​34;, h, m, s)

输入:整数

输出:时分秒,整数,西文冒号分隔

Case: 3610    1:00:10;   3670  1:01:10;  456  0:07:36;  8421  2:20:21

代码块
clike
自动换行
复制代码
#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位小数)

代码块
clike
自动换行
复制代码
#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看作是收尾相接的环状排列)。

输入: 大写英文字母

输出:该字母前面的字母,该字母,该字母后面的字母。(三字母间无间隔)

代码块
clike
自动换行
复制代码
#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码,该字母后继字符(空格分隔,每行的最后没有空格)

代码块
clike
自动换行
复制代码
#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

代码块
clike
自动换行
复制代码
#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>头文件)。

代码块
clike
自动换行
复制代码
#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)的整数值,每读取一个值,程序打印出该值个数的英文星号("&#​34;"&#​34;*"&#​34;"&#​34;)。

输入:3个整数,3行。

输出:3行星号。

代码块
clike
自动换行
复制代码
#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,即为最终的加密密码。

编写程序完成数据的加密,输入:一个整数。

输出:一个整数。

代码块
clike
自动换行
复制代码
#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

代码块
clike
自动换行
复制代码
#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两个正整数,用空格分隔。

输出:连续输出同构数,数据间用空格分隔。

代码块
clike
自动换行
复制代码
#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行输出。

代码块
clike
自动换行
复制代码
#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

代码块
clike
自动换行
复制代码
#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

代码块
clike
自动换行
复制代码
#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+...

代码块
clike
自动换行
复制代码
#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

输出:算式和结果。

代码块
clike
自动换行
复制代码
#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为正整数。

代码块
clike
自动换行
复制代码
#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,用空格隔开。

    输出:若干水仙花数,用空格隔开

代码块
clike
自动换行
复制代码
#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]中的勾股数的数量

代码块
clike
自动换行
复制代码
/*以下是方框提示:
输入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

(先拆分每个数,再求平方和)

代码块
clike
自动换行
复制代码
#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-检验由三边能否构成三角形

编写程序检验由三边能否构成三角形,检验方法是任意两边和均要大于第三边

代码块
clike
自动换行
复制代码
#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个数,中间用一个空格隔开。

代码块
clike
自动换行
复制代码
#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个数,中间用一个空格隔开。

代码块
clike
自动换行
复制代码
#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”。

代码块
clike
自动换行
复制代码
#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的正整数分解为连续的正整数之和,请显示全部分别结果。

代码块
clike
自动换行
复制代码
#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&#​34;.

代码块
clike
自动换行
复制代码
#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

代码块
clike
自动换行
复制代码
#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的连续奇数,用一个空格分隔

代码块
clike
自动换行
复制代码
#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

代码块
clike
自动换行
复制代码
#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在序列中表示结束序列输入。程序输入电梯运行序列,输出电梯运行时间(秒)。

代码块
clike
自动换行
复制代码
#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。

  输出:最大值及出现的次数。数据间以一个空格隔开。

代码块
clike
自动换行
复制代码
#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个正整数

输出:最大公约数和最小公倍数,空格分隔。

代码块
clike
自动换行
复制代码
#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和该数本身相乘。

代码块
clike
自动换行
复制代码
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位小数)

代码块
clike
自动换行
复制代码
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-月份天数计算

输入公元年份和月份,输出该月份的天数。

输入:年,月(逗号分隔)

输出:天数

代码块
clike
自动换行
复制代码
#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个数,数据间用空格分隔。

输出:占一行,数据间用一个空格分隔。

代码块
clike
自动换行
复制代码
#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.

输入:带空格的字符串。

输出:不含空格的字符串。

代码块
clike
自动换行
复制代码
/*以下为方框提示: 
#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个整数,以英文逗号分隔。

代码块
clike
自动换行
复制代码
#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位的无符号二进制整数,将其转换为十进制。

    输入:二进制序列

    输出:对应的十进制数

代码块
clike
自动换行
复制代码
#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]中的孪生的数量

代码块
clike
自动换行
复制代码
#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位八进制数转换为十进制。

输入:一个整数。

输出:一个整数。

代码块
clike
自动换行
复制代码
#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

代码块
clike
自动换行
复制代码
#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)之间的所有回文数,按从小到大的次序在屏幕上显示输出,每个数之间用一个空格分隔,最后一个数后面没有空格。

代码块
clike
自动换行
复制代码
#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

代码块
clike
自动换行
复制代码
#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*/

代码块
clike
自动换行
复制代码
#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)

输出:占一行

代码块
clike
自动换行
复制代码
#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

代码块
clike
自动换行
复制代码
#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”。

代码块
clike
自动换行
复制代码
#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个单词的单词表,"&#​34;reserve"&#​34;, "&#​34;replace"&#​34;,  "&#​34;core"&#​34;, "&#​34;nature,"&#​34; "&#​34;literature"&#​34;,编写程序在单词表中查找单词,若找到,则显示YES,若找不到则显示NO。查找不区分大小写。

输入:一个表示单词的字符串。

输出:YES或NO。

样例1:literature     YES

代码块
clike
自动换行
复制代码
#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

(先拆分每个数,再求平方和)

代码块
clike
自动换行
复制代码
#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行,输入一个字符

输出:占一行

代码块
clike
自动换行
复制代码
#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))

代码块
clike
自动换行
复制代码
#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从键盘输入。

代码块
clike
自动换行
复制代码
#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,中间用空格隔开。

    输出:顺序改变的数组元素,用英文逗号隔开,末尾没有逗号。

代码块
clike
自动换行
复制代码
#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个人的信息,包括学号、姓名、三门课的成绩和总成绩,数据间一个空格,末尾无空格。

代码块
clike
自动换行
复制代码
#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”。

输入:一串数字

输出:用空格隔开的英文基数词,小写。

代码块
clike
自动换行
复制代码
#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)输出结果。

代码块
clike
自动换行
复制代码
#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。

代码块
clike
自动换行
复制代码
/*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

代码块
clike
自动换行
复制代码
#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&#​34;,t="2467&#​34;时,u="1135&#​34;。若s="12&#​34;, t="12&#​34;,输出"#​" 

输入:两个字符串,中间用空格隔开。scanf("%s%s&#​34;,s,t); 

输出:结果串 

样例: 12345 6789 12345;   discussed also,dicued

代码块
clike
自动换行
复制代码
#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

代码块
clike
自动换行
复制代码
#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&#​34;, 否则输出 "NO&#​34;。

样例:7 YES;  12  NO; 711  NO

代码块
clike
自动换行
复制代码
#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

代码块
clike
自动换行
复制代码
#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

代码块
clike
自动换行
复制代码
#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

代码块
clike
自动换行
复制代码
#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、快排

代码块
clike
自动换行
复制代码
#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 必定是素数。

代码块
clike
自动换行
复制代码
/*d以下为提示:
所以有:
int i,m;
for(i=2;i*i<=m;i++)
{ if(m%i==0)
m不是质数
else*/
复制成功

3、质因子

代码块
clike
自动换行
复制代码
#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;            
}
复制成功