考研2018复试——C语言编程题

1、一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?

方法一:

     分析: 土办法,从1到10000遍历,符合两个条件的即为所求。
#include <stdio.h>
#include <math.h> 
int main(){
	int i,x,y;
	for(i=1;i<10000;i++)
	{
		x=sqrt(i+100);
		y=sqrt(i+268);
		if(x*x==i+100 && y*y==i+268)
		   printf("%d+100=%d*%d\n",i,x,x);		
	}
}
运行结果:
21+100=11*11
261+100=19*19
1581+100=41*41

--------------------------------
Process exited after 0.5004 seconds with return value 0
请按任意键继续. . .

方法二:

     分析:

假设该数为 x。m和n分别为m2和n2的算术平方根。
1、则:x + 100 = n2, x + 100 + 168 = m2
2、计算等式:m2 - n2 = (m + n)(m - n) = 168
3、设置: m + n = i,m - n = j,i * j =168,i 和 j 至少一个是偶数。绝对不可以全是奇数,例如33=9,55=9;(奇 * 奇=奇,奇 * 偶=偶,偶 * 偶=偶)
4、可得: (i + j) =2m, (i - j)=2n,所以(i+j)和(i-j)全为偶数。(奇+奇=偶,奇-奇=偶,偶+偶=偶,偶-偶=偶),所以i 和 j 要么都是偶数,要么都是奇数。
5、又由3知i和j至少有一个为偶数,所以i和j全为偶数。
6、又由2知ij=168,所以i和 j均大于等于2。
7、于是题目就转化为已知,i和j均为大于1的偶数,i
j=168,m=(i+j)/2,n=(i-j)/2,x+100=nn,x+268=mm这6个条件的问题了

#include <stdio.h>
int main(void)
{
	int  i, j, m, n, x;
	for (i = 1; i <=168; i++)
	{
	 if(i%2==0) //确定i是偶数 
	 {
	 	j=168/i;  
	  	if(j%2==0)//确定j是偶数 
	 		{
	 			if(i>j&&i*j==168)//确定i*j=168,为防止i和j颠倒,设置i>j. 
	 			{	
				    n=(i-j)/2;				
	 				m=(i+j)/2;
					x=n*n-100;
					x=m*m-268;
				 
					printf("%d+100=%d*%d\n",x,n,n);
					printf("%d+268=%d*%d\n",x,m,m);
					printf("===============\n" );
				 } 
	 			
			}
	 }
	 	
	}
 
}
运行结果:
-99+100=1*1
-99+268=13*13
===============
21+100=11*11
21+268=17*17
===============
261+100=19*19
261+268=23*23
===============
1581+100=41*41
1581+268=43*43
===============

--------------------------------
Process exited after 0.3052 seconds with return value 0
请按任意键继续. . .

2、有五个学生,每个学生有4门课的成绩,从键盘输入以上数据(包括学生号,姓名,4门课成绩),计算出平均成绩,将原有的数据和计算出的平均分数存放在磁盘文件“student”中。

#include<stdio.h>
#include<stdlib.h>
typedef struct{
    int ID;
    int math;
    int English;
    int C;
    int python; 
    int avargrade;
    char name[20];
}Stu;
int main()
{
    FILE *fp;
    Stu stu[5];
    int i,avargrade=0;
    printf("请输入5个同学的信息:学生号,姓名,4门成绩:\n");
    for(i=0;i<5;i++)
    {
        scanf("%d %s %d %d %d %d",&(stu[i].ID),stu[i].name,&(stu[i].math),&(stu[i].English),&(stu[i].C),&stu[i].python);
        stu[i].avargrade=(stu[i].math+stu[i].English+stu[i].C+stu[i].python)/4;
    }
    
    if((fp=fopen("student.txt","w"))==NULL)
    {
        printf("error :cannot open file!\n");
        exit(0);
    }
    for(i=0;i<5;i++)
        fprintf(fp,"%d %s %d %d %d %d %d\n",stu[i].ID,stu[i].name,stu[i].math,stu[i].English,
                stu[i].C,stu[i].python,stu[i].avargrade);
    
    fclose(fp);
    system("pause");
    return 0;
}
运行结果:
请输入5个同学的信息:学生号,姓名,4门成绩:
1 谷歌 10 10 10 10
2 的数据 10 10 10 10
3 辅导班 11 11 11 11
4 地方 22 22 22 22
5 地的 55 55 55 55
请按任意键继续. . .

在这里插入图片描述

3、一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2+3.编程找出500以内的所有完数。

分析:依次for循环从1到500遍历,找出每个数的所有因子,判断这些因子之和是否等于此数,若等于则是完数。
注:数本身不是因子。
#include<stdio.h>
int main() {
	int i,j,s,k;
	int a[200];
	for(i=1; i<=500; i++) {
		s=0;
		k=0;
		for(j=1; j<i; j++) {
			if(i%j==0) {
				a[k++]=j;
				s=s+j;
			}
		}
		if(s==i) {
			for(int n=0; n<k-1; n++) {
				printf("%d+",a[n]);
			}
			printf("%d=%d\n",a[k-1],i);
		}
	}
}

运行结果:

1+2+3=6
1+2+4+7+14=28
1+2+4+8+16+31+62+124+248=496

--------------------------------
Process exited after 1.831 seconds with return value 0
请按任意键继续. . .

4、有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13…求出这个数列的前20项之和。

分析:分子为斐波那契数列,每一项为前两项之和,从2开始。分母也是斐波那契数列,从1开始。
#include<stdio.h>
int main(){
	float a=2,b=1,s=0,t;
	for(int i=1;i<=20;i++)
	{
		
		s=s+a/b;
		
		t=a;
		a=a+b;//后一个分数的分子为前一个数分子和分母之和,分母为前一个数的分子。
		b=t; 
	}
	printf("%.6f\n",s); 
}

运行结果:

32.660263

--------------------------------
Process exited after 1.499 seconds with return value 0
请按任意键继续. . .

5、编写一个函数,输入n为偶数时,调用函数求1/2+1/4+…+1/n;当输入n为奇数时,调用函数 1/1+1/3+…+1/n(利用指针函数)。

#include<stdio.h>
float even(int n)
{
	int i;
	float sum=0;
	for(i=2;i<=n;i=i+2)
	{
		sum+=(float)1/i;
	}
	return sum;
}
float odd(int n)
{
	int i;
	float sum=0;
	for(i=1;i<=n;i=i+2)
	{
		sum+=(float)1/i;
	}
	return sum;
}

int main()
{
	int n;
	float t;
	float (*p)(int);  //p是一个指向函数的指针变量  
	printf("请输入一个数:");
	scanf("%d",&n);
	if(n%2==0)
		p=even;
	else
		p=odd;
	t=(*p)(n);   //note:写法
	printf("%.2f",t);
	return 0; 
}

运行结果:
请输入一个数:4
0.75
--------------------------------
Process exited after 3.825 seconds with return value 0
请按任意键继续. . .

6、利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,70-89分之间的用B表示,60-70分之间的用C表示,60以下的用D表示。

方法1:

#include<stdio.h>
int main() {
	int s;
	printf("请输入你的成绩:") ;
	scanf("%d",&s);
	if(s>=90) {
		printf("A");

	}
	if(70<=s&&s<90) {
		printf("B");
	}
	if(60<=s&& s<70) {
		printf("C");
	}
	if(s<60) {
		printf("D");
	}
}
运行结果:
请输入你的成绩:1000
A
--------------------------------
Process exited after 2.693 seconds with return value 0
请按任意键继续. . .

方法2:

#include<stdio.h>
int main(){
	int s;
	char g;
	printf("请输入学习成绩:");
	scanf("%d",&s); 
	g=(s>=90)?'A':(s>=70?'B':(s>=60)?'C':'D');
	printf("%c",g); 
}
运行结果:
请输入学习成绩:99
A
--------------------------------
Process exited after 4.177 seconds with return value 0
请按任意键继续. . .

7、求一个4*4矩阵对角线元素之和。

#include<stdio.h>
int main(){
	int a[4][4],i,j,k;
	int s=0;
	for(i=0;i<4;i++)
	{	printf("请输入矩阵第%d行元素:",i+1); 
		for(j=0;j<4;j++)
		{
			scanf("%d",&a[i][j]);
		}
	}
	printf("该矩阵的对角元素分别为:" );
	for(k=0;k<4;k++){
		s=s+a[k][k];
		printf(" %d ",a[k][k]);
	}
	printf("\n该矩阵的对角元素之和为:%d",s);
} 
运行结果:
请输入矩阵第1行元素:1 2 3 4
请输入矩阵第2行元素:1 2 3 4
请输入矩阵第3行元素:1 2 3 4
请输入矩阵第4行元素:1 2 3 4
该矩阵的对角元素分别为: 1  2  3  4
该矩阵的对角元素之和为:10
--------------------------------
Process exited after 14.72 seconds with return value 0
请按任意键继续. . .

8、给一个不多于6位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。

分析:利用取余可得个位,取整得除个位以外的位,将一个数的各位分割开来。
例如345623 对10取余得个位,对10取整得十、百、千、万、十万位。
第一次循环为:3,34562
第二次循环为:2,3456
第三次循环为:6,345
第四次循环为:5,34
第五次循环为:4,3
第六次循环为:3,0
此时n=0,循环结束。
#include<stdio.h>
int main() {

	char a[6][10]= {"个","十", "百","千","万","十万"};
	int i=0,n; 
	printf("请输入一个不大于6位的整数:");
	scanf("%d",&n);
	while(n!=0) 
	{
			printf("%s位为:%d\n",&a[i],(n%10));//依次从个位输出
		    n=n/10;//得个位以上;
			i++;//计算有几位
 	
	}
	printf("==============");
	printf("总共%d位",i);
}
运行结果:
请输入一个不大于6位的整数:345623
个位为:3
十位为:2
百位为:6
千位为:5
万位为:4
十万位为:3
==============总共6--------------------------------
Process exited after 15.84 seconds with return value 0
请按任意键继续. . .

9、求s=a+aa+aaa+aaaa+aa…a的值,其中a是一个数字。例如3+33+333+3333+33333(此时 共有5个数相加),几个数相加有键盘控制。

#include<stdio.h>
int main() {
	int s=0,a,b,n;
	int c[n];
	printf("请分别输入数字和位数(以空格间隔):");
	scanf("%d %d",&a,&n);
	b=a;

	for(int i=0; i<n; i++) {
		c[i]=a;
		s=s+a;
		a=a*10+b;
	}
	for(int i=0; i<n-1; i++) {
		printf("%d+",c[i]);
	}
	printf("%d=%d",c[n-1],s);

}
请分别输入数字和位数(以空格间隔)3 4
3+33+333+3333=3702
--------------------------------
Process exited after 7.882 seconds with return value 0
请按任意键继续. . .

10、将一个正整数分解质因数。例如:输入42,打印出42=237。

分析:通过取余运算先找出可以整除此正整数的因子,每找到一个因子就通过取整将此正整数缩小
#include<stdio.h>
int main() {
	int i,n;
	scanf("%d",&n);
	printf("%d=",n);
	for(i=2; i<=n; i++) {
		while(n%i==0) { //找到一个因子
			printf("%d",i);
			n=n/i;//缩小
			if(n!=1) 
			{
				printf("*");
			}
		}
  }
}
756
756=2*2*3*3*3*7
--------------------------------
Process exited after 3.489 seconds with return value 0
请按任意键继续. . .

  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值