计算机考研复试——C语言上机练习题目及参考代码

:疫情在家学习效率低,希望能通过写博客来找一点学习的感觉,以下题目是考研学校的学长分享给我的资料中的题目,我写了以下代码,然后分享到博客上,不对的地方请大家指正。

 

1. 由键盘输入的n个整数,输出其中最大和最小数。其中,n由用户通过键盘输入。

       输入:n=10

92  756  43  32  45  78  67  82  99  65

   输出:756 (最大)

         32  (最小)

#include <iostream> 
#include <algorithm>
using namespace std;
int main()
{
	int n=0,i=0;
	int var[1000];
	cin>>n;
	int t=n;
	while(n){
		cin>>var[i];
		i++;
		n--;
	}
	sort(var,var+t);
	cout<<var[0]<<"  "<<var[t-1]<<endl;
	return 0;
}

2.求这样一个三位数,该三位数等于其中每位数字的的阶乘之和。

       即;   abc=a!+b!+c!

      输出:    145

#include <iostream>
using namespace std;

int main()
{
	for(int i=100;i++;i<=999){
		long int a=0,b=0,c=0;
		long int d=1,e=1,f=1;//注意清零,否则会超出内存 
	    a=i%10;
	    b=i%100/10;
	    c=i/100;
	    for(int j=1;j<=a;j++)
	 	    d=d*j;
	    for(int q=1;q<=b;q++)
	 	    e=e*q;
	    for(int w=1;w<=c;w++)
	    	f=f*w
		if(i==(d+e+f))
		{
			cout<<i<<endl;
			break; 	
		}
	}
	return 0;
}

3.有一分数序列:2/1,  3/2,  5/3,  8/5,  13/8 ,21/13,   

编程,求出这个数列的前20项之和。

      输出:   32.660259

#include <iostream>
using namespace std;

int main()
{
	int n=20;
	float fz=2,fm=1;
	float sum=0;
	while(n--)
	{
		float t=fz,y=fm;
		cout<<fz<<"/"<<fm<<endl;
		sum=sum+(t/y);
		fm=t;
		fz=t+y;
	}
	printf("%.6f",sum);
	return 0;
} 

4.编程,从键盘输入正整数n,求n!并输出。

      输入:  10

      输出:  3628800

#include <iostream>
using namespace std;

int main()
{
	int n,sum=1;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		sum=sum*i;
	}
	cout<<sum<<endl;
	return 0;
}

5.编程序,从键盘输入一整数,然后按反向输出。比如原数为12345,应输出54321.

     输入:56832

     输出:23865#

#include <iostream>
using namespace std;

int main()
{
	int n,var[100],i=0;
	cin>>n;
	while(n)
	{
		var[i]=n%10;
		n=n/10;
		i++;
	}
	for(int j=0;j<i;j++)
		cout<<var[j];
	cout<<"#"<<endl;
	return 0;
}

6.编程,统计输出整数100至100000之间所有数字之和为5的整数的总个数。

     输出120

#include <iostream>
using namespace std;

int main()
{
	int count=0;
	for(int i=100;i<=100000;i++)
	{
		int var[10];
		int n=i;
		int t=0,sum=0;
		while(n)
		{
			var[t]=n%10;
			sum+=var[t]; 
			n=n/10;
			t++;
		}
		if(sum==5)
			count++;
	}
	cout<<count<<endl;
	return 0;	
} 

6.1 写一个函数,输入一个四位数字,要求输出这四个数字字符,但每两个数字之间加一个下划线;并在主函数中进行测试。

输入:1990,

输出:1_9_9_0

#include <iostream>
using namespace std;

int main()
{
	int var[5],n=0,i=0;
	cin>>n;
	while(n)
	{
		var[i]=n%10;
		n=n/10;
		i++;
	}
	cout<<var[3]<<"_"<<var[2]<<"_"<<var[1]<<"_"<<var[0]<<endl;
	return 0;
}

7.编程序,有键盘输入一个字符串,将字符串中除小写元音字母以外的字符打印出来。

     输入:My  name is  Tom!

     输出:My  nm   s   Tm!

#include <iostream>
#include <string.h>
using namespace std;

int main()
{
	char str1[100],str2[100];
	gets(str1);
	int len=strlen(str1);
	int k=0;
	for(int i=0;i<len;i++)
	{
		if(str1[i]=='a'||str1[i]=='e'||str1[i]=='i'||str1[i]=='o'||str1[i]=='u'||
		   str1[i]=='A'||str1[i]=='E'||str1[i]=='I'||str1[i]=='O'||str1[i]=='U')
				continue;
		else
			str2[k++]=str1[i];
	}	
	int j=0;
	for(int j=0;j<k;j++)
		cout<<str2[j];
	return 0;
}

7.1连续输入一批以 # 结束的字符串(字符串的长度不超过80),遇 ## 则全部输入结束。对每个字符串做如下处理:滤去所有的非十六进制字符后,组成一个新字符串(十六进制形式),然后将其转换为十进制数后输出。

例:  括号内是说明

输入:

10#Pf4+1#-+A## (连续输入3 个字符串)

输出:

16                (对应10)

3905             (对应f41)

10                (对应A)

#include <iostream>
#include <string.h>
using namespace std;

//0-9的ASCII码为48-57
//A-F的ASCII码为65-70
//a-f的ASCII码为97-102 
int main()
{
	char str[100];
	int var[100],k=0;
	gets(str);
	int pow=1,sum=0;
	int len=strlen(str);
	for(int i=len-3;i>=0;)
	{
		if(str[i]=='#')
		{
			--i;
			pow=1;
			var[k++]=sum;
			sum=0;
		}
		if((str[i]>=48&&str[i]<=57))//数字 
		{
			sum+=(str[i]-'0')*pow;
			pow=16*pow;
			if(i==0)
			{
				var[k++]=sum;
			}
			i--;
		}
		else if((str[i]>=65&&str[i]<=70))//大写 
		{
			sum+=((str[i]-0)-55)*pow;
			pow=16*pow;
			--i; 
		}
		else if((str[i]>=97&&str[i]<=102))//小写 
		{
			sum+=((str[i]-0)-87)*pow;
			pow=16*pow;
			--i; 
		}
		else --i;
	}
	for(int t=k-1;t>=0;t--)
		cout<<var[t]<<endl;
	return 0;
}

7.2、连续输入一批以 # 结束的字符串(字符串的长度不超过80),遇 ## 则全部输入结束。将每个字符串中的大写字母用下面列出的对应大写字母替换, 其余字符不变, 输出替换后的字符串.

原字母 对应字母

A ──→ Z

B ──→ Y

C ──→ X

D ──→ W

……

X ──→ C

Y ──→ B

Z ──→ A

例:括号内是说明

输入:

A flag of USA#IT12#oueiaba## (连续输入3 个字符串)

输出:

Z flag of FHZ

RG12

Oueiaba

#include <iostream>
#include <string.h>
using namespace std;

//A-Z的ASCII码为 65-90
//如果是A-M则对应为A+25 B+23 C+21...M+1
//如果是N-Z则对应为N-1 O-3.....Z-25
int main()
{
	char str1[100],str2[100],var1[50],var2[50];
	int t=65,u=78;
	for(int j=1;j<=26;j+=2)
	{
		var1[j]=t;
		var2[j]=u;
		t++;
		u++;
	}
	gets(str1);
	int i=0,k=0;
	while(!(str1[i]=='#'&&str1[i+1]=='#'))
	{
		if(str1[i]=='#')
		{
			++i;
			k=0;
			puts(str2);
			memset(str2,0,sizeof(str2));
		//	continue;
		}
		else if(str1[i]>=65&&str1[i]<=77)//A-M
		{
			for(int x=1;x<=26;x++)
			{
				if(var1[x]==str1[i])
					str2[k++]=var1[x]+(26-x);
			}
			i++;
		}
		else if(str1[i]>=78&&str1[i]<=90)//N-Z
		{
			for(int x=1;x<=26;x++)
			{
				if(var2[x]==str1[i])
					str2[k++]=var2[x]-x;
			}
			i++;
		}
		else{
			str2[k++]=str1[i];
			i++;
		}
			
	}
	puts(str2);
	return 0;
}

7.3、输入一个字符并回车,再连续输入一批以 # 结束的字符串(字符串的长度不超过80),遇 ##则全部输入结束。在每个字符串中查找该字符,如果找到,则输出该字符在字符串中所对应的最大下标(下标从0 开始);否则输出“Not Found”。

例:括号内是说明

输入:

m (输入一个字符)

moon#programming#1234## (输入3 个字符串"moon","programming","1234")

输出:

0 (m在"moon"中对应的最大下标是0)

7 (m在"programming"中对应的最小下标是7)

Not Found ("1234"中没有m)

#include <iostream>
#include <string.h> 
using namespace std;

int main()
{
	char c,str[100];
	cin>>c;
	getchar();
	gets(str);
	int i=0,f=0,flag=0,k=0;
	while(!(str[i]=='#'&&str[i+1]=='#'))
	{
		if(str[i]=='#')
		{
			if(flag==0)
				cout<<"Not Found"<<endl;
			else
				cout<<f<<endl;
			f=0;
			flag=0;
			k=0;
			i++;
		}
		else if(str[i]==c)
		{
			flag=1;
			f=k;
			i++;
			k++;
		}
		else
		{
			i++;
			k++;
		}
	}
	if(flag==0)
				cout<<"Not Found"<<endl;
			else
				cout<<f<<endl;
	return 0;
}
  1. 7.4、连续输入一批以 # 结束的字符串(字符串的长度不超过80),遇 ## 则全部输入结束。统计并输出每个字符串中大写辅音字母的个数(大写辅音字母:除'A','E','I','O','U'以外的大写字母)。

例:括号内是说明

输入:

HELLO#IT12#uieiaba## (连续输入3 个字符串)

输出:

3 ("HELLO"中有3 个大写辅音字母)

1 ("IT12"中有1 个大写辅音字母)

0 ("uieiaba"中没有大写辅音字母)

#include <iostream>
#include <string.h>
using namespace std;

int main()
{
	char str1[100];
	gets(str1);
	int i=0,count=0;
	while(!(str1[i]=='#'&&str1[i+1]=='#'))
	{
		if(str1[i]=='#')
		{
			++i;
			cout<<count<<endl;
			count=0;
		}	
		else if((str1[i]>=65&&str1[i]<=90)&&(str1[i]!='A'&&str1[i]!='E'&&str1[i]!='I'&&str1[i]!='O'&&str1[i]!='U'))
		{
			i++;
			count++;
		}
		else
		{
			i++;
		}
	} 
	cout<<count<<endl;
	return 0;
}

7. 5. 连续输入一批以 # 结束的字符串(字符串的长度不超过80),遇 ## 则全部输入结束。统计并输出每个字符串的有效长度。

例:括号内是说明

输入:

hello 12#abc+0## (连续输入2 个字符串"hello 12"和"abc+0")

输出:

8 ("hello 12"的有效长度是8)

5 ("abc+0"的有效长度是5)

?#hello 12#abc+0#1234567890iop##

1

8

5

13

#include <iostream>
#include <string.h>
using namespace std;

int main()
{
	char str[100];
	int count=0,i=0;
	gets(str);
	while(!(str[i]=='#'&&str[i+1]=='#'))
	{
		if(str[i]=='#')
		{
			cout<<count<<endl;
			count=0;
			++i;
		}
		else
		{
			count++;
			i++;
		}
	}
	cout<<count<<endl;
	return 0;
}

7.6. 输入一行字符,分别统计出其中的英文字母、空格、数字和其他字符的个数。

      输入:My  teachere’s  address  is  “#123  beijing  Road,shanghai”.

      字母个数:38

      数字个数:3

      空格数:6

      其他字符:6

#include <iostream>
#include <string.h>
using namespace std;

int main()
{
	int y=0,k=0,s=0,q=0;
	char str[100];
	int i=0;
	gets(str);
	int len=strlen(str);
	while(i<len)
	{
		if((str[i]>=65&&str[i]<=90)||(str[i]>=97&&str[i]<=122))
			y++;
		else if(str[i]>=48&&str[i]<=57)
			s++;
		else if(str[i]==' ')
			k++;
		else q++;
		i++;
	}
	cout<<"字母个数:"<<y<<endl;
	cout<<"数字个数:"<<s<<endl;
	cout<<"空格数:"<<k<<endl;
	cout<<"其他字符:"<<q<<endl; 
	return 0;
}

8.编程序,由键盘输入5个整数,计算这些整数的平均值,及其所有的偶数之和。

输入:12   35  46  4  13  8  72  25  61   82

偶数之和:224

偶数平均值; 37.333333

9.编程序:由键盘输入10个整数,输出奇数和奇数平均值。

输入: 12  35  46  4   13  8  72  25  61  82 

  奇数之和:134

  奇数平均值;33.5

#include <iostream>
using namespace std;

int main()
{
	float sum1=0,sum2=0,x=0,y=0;
	int a,k=10;
	while(k--)
	{
		cin>>a;
		if(a%2==0)
		{
			sum1+=a;
			x++;
		}
		else
		{
			sum2+=a;
			y++;
		}
	}
	cout<<"偶数之和:"<<sum1<<endl;
	printf("%f",sum1/x);
	cout<<"奇数之和:"<<sum2<<endl;
	printf("%f",sum2/y);
	return 0;
}

10.编程,求S=a+aa+aaa+…+aa…a的值,其中a是一个数字,最后一项a的个数为n,a和n均有键盘输入。

输入:a=2

      n=5

输出:24690

#include <iostream>
using namespace std;

int main()
{
	int a,n,sum1=0,sum2=0;
	cin>>a>>n;
	while(n)
	{
		sum1=0;
		for(int i=1;i<=n;i++)
		{
			sum1=sum1*10+a;
		}
		sum2=sum2+sum1;
		n--;
	}
	cout<<sum2<<endl;
	return 0;
}

11.编程序, 求1!+2!+3!+…+n!并输出结果,其中n由键盘输入。

   输入:  10

   输出:  4037913

#include <iostream>
using namespace std;

int main()
{
	long int n,sum=0,temp=1;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		temp=temp*i;
		sum=sum+temp;
	}
	cout<<sum<<endl;
	return 0;
}

12.编程序,输出满足以下条件的最大的n:12+22+32+……n2<=1000

  输出  :13

#include <iostream>
using namespace std;

int main()
{
	int n,sum=12,k=12;
	while(1)
	{		
		if(sum>1000) break;
		else
		{
			k=k+10;
			sum=sum+k;
		}	
	}
	cout<<(k-10)/10<<endl;
	return 0;
}

13. 编程打印输出求0~1000中同时能被7和13整除的那些数。

  输出:  0     91   182  273  364  455  546  637 728   819  910

14.编程计算分数序列: 1/1,  1/3  1/5  1/7  1/9  1/11…….的前20项之和,并输出。

   输出:2.479674

#include <iostream>
using namespace std;

int main()
{
	float fm=1,sum=0;
	for(int i=1;i<=20;i++)
	{
		sum=sum+1/fm;
		fm=fm+2;
	} 
	printf("%f\n",sum);
	return 0;
}

15.程序,求s=1-1/3+1/5-1/7+…..,直到最后一项的绝对值小于0.00001为止。

  输出:0.78538447618

#include <iostream>
#include <math.h>
using namespace std;

int main()
{
	float sum=0.0,fm=1,fs=1.0;
	float f=1;
	while(fabs(fs)>=0.00001)//注意最后一项有没有计算上 
	{
		sum=sum+fs;
		f=-f;
		fm=fm+2.0;
		fs=(1.0/fm)*f;
	}
//	cout<<count<<endl;
	printf("%.11f\n",sum-fs);
	return 0;
}

16. 编程序,用公式e≈1+1/1!+1/2!+1/3!+…+1/n!,求e的近似值,直到1/n!<10-6负6次方为止。

   输出:2.71828174591064453

#include <iostream>
using namespace std;

int main()
{
	float sum=1.0,n=1.0;
	int i=1;
	while(1.0/n>=1e-6)
	{
		n=n*i;
		sum=sum+1.0/n;
		i++;
	}
	printf("%.15f",sum+(1.0/n));
	return 0;	
} 

17.编程序,用π/4=1-1/3+1/5-1/7+……公式请求π的近似值,直到某一项的绝对值小于10负6次方为止。

输出:3.141537904739

#include <iostream>
#include <math.h>
using namespace std;

int main()
{
	float sum=0,fm=1,k=1,fs=1.0;
	while(fabs(fs)>=1e-6)
	{
		sum=sum+fs;
		k=-k;
		fm=fm+2;
		fs=(1.0/fm)*k;
	}
	printf("%.12f",(sum+fs)*4);
	return 0;
}

18.编程序,输出1~10的阶乘值。

  输出:  1!=1

          2! =2

          3! =6

          4!=24

          5!=120

          6!=720

          7!=5040

          8!=40320

          9!=362880

          10!=3628800

#include <iostream>
using namespace std;

int main()
{
	long int n=1;
	for(int i=1;i<=10;i++)
	{
		n=n*i;
		cout<<i<<"!="<<n<<endl;
	}
	return 0;	
} 

19.在主函数输入一个整数,判断并输出是否为素数。

输入:13   输出: 是素数!

输入: 15  输出:不是素数!

#include <iostream>
#include <math.h>
using namespace std;

int isprimry(int n)
{
	int flag=0;
	for(int i=2;i<=sqrt(n);i++)
	{
		if(n%i==0)
		{
			flag=1;
			break;
		}
	}
	if(flag==1) return 0;
	else return 1;
}
int main()
{
	int n;
	cin>>n;
	int f=isprimry(n);
	if(f==1) cout<<"是素数!"<<endl;
	else cout<<"不是素数!"<<endl; 
	return 0;	
} 

20.编程序,求1+(1+2)+(1+2+3)+……..+(1+2+3+….+n)的值。其中,n由键盘输入。

   输入:20

   输出:1540

#include <iostream>
using namespace std;
int main()
{
	int sum=0,n,temp=0;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		temp=temp+i;
		sum=sum+temp;	
	} 
	cout<<sum<<endl;
	return 0;
}

20.1 求方程a2+bx+c=0的根,用三个函数分别求当b2-4ac大于0、等于0和小于0时的根,并输出结果。

要求:(1)编写函数void deltaZero(float a, float b, float c)求当b2-4ac等于0时的根;

 (2)编写函数void deltaLargerZero(float a, float b, float c)求当b2-4ac大于0时的根;

 (3)编写函数void deltaLessZero(float a, float b, float c)求当b2-4ac小于0时的根;

 (4)另外,考虑当a=0时的情况,此时方程退化为一次方程。

测试:

输入: 0 1 1 输出:  X=-1

输入:1 2 1 输出:  X1=X2= -1

输入:1 3 2 输出: X1=  -1 X2= -2

输入:1 2 2 输出: X1= -1+1i X2= -1-1i  

#include <iostream>
#include <math.h>
using namespace std;
void deltaZero(float a,float b,float c,float q)
{
	float x1=(-b+sqrt(q))/(2*a);
	cout<<"X1=X2="<<x1<<endl; 
}
void deltaLargerZero(float a,float b,float c,float q)
{
	float x1=(-b+sqrt(q))/(2*a);
	float x2=(-b-sqrt(q))/(2*a);
	cout<<"X1="<<x1<<" "<<"X2="<<x2<<endl; 
}
void deltaLessZero(float a,float b,float c,float q)
{
	float x=-b/(2*a);
	float y=sqrt(4*a*c-b*b)/(2*a);
	cout<<"X1="<<x<<"+"<<y<<"i"<<" "<<"X2="<<x<<"-"<<y<<"i"<<endl; 
}
 
int main()
{
	float a,b,c;
	float q=0,x1=0,x2=0; 
	cin>>a>>b>>c;
	q=b*b-4*a*c;
	if(a==0){
		cout<<"X="<<-(c/b)<<endl;
	}else if(q==0){
		deltaZero(a,b,c,q);
	}else if(q>0){
		deltaLargerZero(a,b,c,q);
	}else if(q<0){
		deltaLessZero(a,b,c,q);
	}
	return 0;
}

21.输入年份year和月month,求该月有多少天。(若年份year能被400整除,或能被4整除但不能被100整除,则为闰年;否则,为平年)

      输入:1992  2                      输出:29

      输入:2007  2                      输出:28

      输入:2007  1                      输出:31

      输入:2006  11                     输出:30

#include <iostream>
using namespace std;
int isleap(int year){
	int f=0;
	if((year%400==0)||(year%4==0&&year%100!=0))
	{
		f=1;//为闰年 
	}
	else f=0;
	return f;
}
int main()
{
	int m[2][12]={31,28,31,30,31,30,31,31,30,31,30,31,
	              31,29,31,30,31,30,31,31,30,31,30,31};
	int year,month;
	cin>>year>>month;
	int f=isleap(year);     
	cout<<m[f][month-1]<<endl;       
	return 0;
}

22.编写一个简单计算器程序,输入格式为:data1 op data2.其中data1和data2是参加运算的两个数,op为运算符,其取值只能是+、-、*、/。

      输入:5+8                          输出:13

      输入:5-8                           输出:-3

      输入:5*8                          输出:40

      输入:5/8                           输出:0.625

#include <iostream>
using namespace std;
int main()
{
	float a,b;
	char c;
	cin>>a>>c>>b;
	switch(c){
		case '+':
			cout<<a+b<<endl;
			break;
		case '-':
			cout<<a-b<<endl;
			break;
		case '*':
			cout<<a*b<<endl;
			break;
		case '/':
			cout<<a/b<<endl;
			break;
		break;
	}
	return 0;
}

23.编写程序求出555555的约数中最大的三位数是多少。

      输出:777

#include <iostream>
using namespace std;

int main()
{
	for(int i=999;i>=100;--i)
	{
		if(555555%i==0)
		{
			cout<<i<<endl;
			break;
		}
	}
	return 0;
}

24.“韩信点兵”问题:韩信阅兵时,让一队士兵5人一行排队从他面前走过,他记下最后一行士兵的人数(1人);再让这对士兵6人一行排队从他面前走过,他记下最后一行士兵的人数(5人);再让这对士兵7人一行排队从他面前走过,他记下最后一行士兵的人数(4人);再让这对士兵11人一行排队从他面前走过,他记下最后一行士兵的人数(10人);然后韩信就凭这些数,可以求得这队士兵的总人数(>11)。编程,求解士兵总数n。

      输出:2111

#include <iostream>
using namespace std;

int main()
{
	for(int i=11;;++i)
	{
		if(i%5==1&&i%6==5&&i%7==4&&i%11==10)
		{
			cout<<i<<endl;
			break;
		}
	}
	return 0;
}

25.求解爱因斯坦数学题。有一条长阶梯,若每步跨2阶,则最后剩余1阶,若每步跨3阶,则最后剩2阶,若每步跨5阶,则最后剩余4阶,若每步跨6阶,则最后剩余5阶,若每步跨7阶,最后才刚好剩下一阶不剩。编程,求这条阶梯共有多少阶?

      输出:119

#include <iostream>
using namespace std;

int main()
{
	for(int i=7;;i+=7)
	{
		if(i%2==1&&i%3==2&&i%5==4&&i%6==5&&i%7==0)
		{
			cout<<i<<endl;
			break;
		}
	}
	return 0;
}

26.输入两个整数m和n,求他们的最小公倍数。要求不论m和n为何值(包括负整数),都能得到正确结果。

      输入:12    8                       输出:24

      输入:24    16                      输出:48

 

27.输入两个整数m和n,求他们的最大公约数。要求不论m和n为何值(包括负整数),都能得到正确结果。

      输入:12    8                       输出:4

      输入:24    16                      输出:8

#include <iostream>
using namespace std;

int gy(int a,int b)//求最大公约数的函数,最大公倍数=a*b/最大公约数
{
	if(b==0) return a;
	else return gy(b,a%b);
}

int main()
{
	int m,n;
	cin>>m>>n;
	int y=gy(m,n);
	int b=m*n/y;
	cout<<y<<" "<<b<<endl;
	return 0;
}

29.编程对10个由键盘输入的整数排序(升序)。

       输入:6  90  45  56  1  15  44  78  58  101

       输出:1  6  15  44  45  56  58  78  90  101

#include <iostream>
#include <algorithm>
using namespace std;

int main()
{
	int a[10];
	for(int i=0;i<10;i++)
	{
		cin>>a[i];
	}
	sort(a,a+10);
	for(int i=0;i<10;i++)
	{
		cout<<a[i]<<" ";
	}
	cout<<endl;
	return 0;
}

30.求100~200间的全部素数(要求:输出时每行10个数)。

       输出:101  103  107  109  113  127  131  137  139  149

             151  157  163  167  173  179  181  191  193  197

             199

#include <iostream>
#include <math.h>
using namespace std;

int main()
{
	int count=0;
	for(int i=100;i<=200;i++)
	{
		int f=0;
		for(int j=2;j<=sqrt(i);j++)
		{
			if(i%j==0)
			{
				f=1;
				break;
			}
		}
		if(f==0)
		{
			count++;
			if(count==10)
			{
				cout<<i<<endl;
				count=0;
			}
			else cout<<i<<" ";
		}
	}
	return 0;
}

31.搬砖问题。有36块砖,由成年男、女和小孩共36人来搬,男子每人搬4块,女子每人搬3块,两个小孩抬一块,要求一次全搬完,问需要男、女、小孩各几人?(成年男、女和小孩都必须参与搬砖工作

       输出:3(男)        3(女)      30(小孩)

#include <stdio.h>

int main()
{
	int x,y,z,f=0;
	for(x=1;x<9;x++)
	{
		for(y=1;y<12;y++)
		{
			for(z=2;z<=34;z=z+2)
			{
				if(x+y+z==36&&4*x+3*y+z/2==36)
				{
					f=1;
					printf("%d(男)%d(女)%d(小孩)",x,y,z);
					break;	
				}	
			}	
			if(f==1) break;
		}	
		if(f==1) break;
	} 
	return 0;	
} 

32.从键盘输入一行字符,以换行符结束,分别以正向和反向的次序输出。

       输入:C  Programming

       输出:gnimmargorp  C

#include <stdio.h>
#include <string.h>

int main()
{
	char a[100];
	gets(a);
	int len=strlen(a);
	for(int i=len-1;i>=0;i--)
		printf("%c",a[i]);
	return 0;
}

33.输入一行字符,统计其中以空格分开的单词的个数。

       输入:The  equation  has  distinct  real  roots.

       输出:6

#include <stdio.h>
#include <string.h>

int main()
{
	char a[100];
	gets(a);
	int len=strlen(a);
	int count=1;
	for(int i=0;i<len;i++)
	{
		if(a[i]==' ')
			count++;	
	}	
	printf("%d\n",count);
	return 0;
}

34.输入一个十进制数,将其转换成二进制数,并输出转换后的结果。

       输入:103

       输出:1100111

#include <stdio.h>

int main()
{
	int n,var[100],i=0;
	scanf("%d",&n);
	while(n)
	{
		var[i]=n%2;
		n=n/2;
		++i;
	}
	for(i=i-1;i>=0;i--)
		printf("%d",var[i]);
	return 0;
}

35.输出所有的“水仙花数”,所谓的“水仙花数”是指一个3位数,其各位数字立方和等于该数本身。例:153=13+53+33,则153是水仙花数。

       输出:153  370  371  407

#include <stdio.h>

int main()
{
	for(int i=100;i<=999;i++)
	{
		int sum=0,var[5],j=0,t=i;
		while(t)
		{
			var[j]=t%10;
			t=t/10;
			++j;
		}
	sum=var[0]*var[0]*var[0]+var[1]*var[1]*var[1]+var[2]*var[2]*var[2];
		if(sum==i)
			printf("%d ",i);
	}
	return 0;
}

35.1.完全数问题:如果一个数恰好等于它的所有因子(包括1但不包括自身)之和,则称之为完全数,例如6的因子为1、2、3,且1+2+3=6,即6为一个完数。

要求定义一个判断函数wanquan(n),判断数n是否为完全数,当n为完全数时返回1,否则返回0,并在主函数输入整数n中进行测试。

输入:6

输出:1

#include <stdio.h>

int main()
{
	int n,sum=0;
	scanf("%d",&n);
	for(int i=1,j=0;i<n;i++)
	{
		if(n%i==0)
			sum=sum+i;
	}
	if(sum==n)
		printf("1");
	else printf("0");
	return 0;
}

36.编程,显示从3开始小于100的所有双素数(双素数:如果p和q都是素数且q=p+2,则p/q称为双素数,例如3/5,5/7都是双素数)。

       输出:3/5  5/7  11/13  17/19  29/31  41/43  59/61  71/73

#include <stdio.h>
#include <math.h>

int isprime(int n)
{
	int f=0;
	for(int i=2;i<=sqrt(n);i++)
	{
		if(n%i==0)
		{
			f=1;
			return 0;
		}
	}
	if(f==0) return 1; 
}

int main()
{
	int var[100],j=0;
	for(int i=3;i<=100;i++)
	{
		int f=isprime(i);
		if(f==1) var[j++]=i;		
	}
	for(int k=0;k<j;k++)
	{
		if(var[k]+2==var[k+1])
			printf("%d/%d  ",var[k],var[k+1]);
	}
	return 0;
}

37.一个素数,当她的数字位置对换以后仍为素数,这样的数称为绝对素数。

       输出:11  13  17  31  37  71  73  79  97

#include <stdio.h>
#include <math.h>

int isprime(int n)
{
	int f=0;
	for(int i=2;i<=sqrt(n);i++)
	{
		if(n%i==0)
		{
			f=1;
			return 0;
		}
	}
	if(f==0) return 1; 
}

int main()
{
	for(int i=10;i<=99;i++)
	{
		int sum=0;
		int t=i;
		while(t)
		{
			sum=sum*10+t%10;
			t=t/10;
		}
		int f1=isprime(i);
		int f2=isprime(sum);
		if(f1==1&&f2==1)
			printf("%d ",i);
	}
	return 0;
}

37.1.亲密数对问题:如果整数M的因子(包括1但不包括自身)之和为N,且N的因子之和为M,则称M与N为一对亲密数。

要求定义一个判断函数qinmi(m,n),判断数m、n是否为亲密数对,当m、n为亲密数对时返回1,否则返回0。

编程调用该函数,输入一个正整数t,输出小于t内的所有亲密数对。

输入:500

输出:220-284

#include <stdio.h>

int qinmi(int m,int n)
{
	int f=0,sum2=0;
	for(int j=2;j<n;j++)
	{
		if(n%j==0)
			sum2+=j;
	}
//	printf("%d***%d\n",sum2,m);
	if(sum2==m)
		return 1;
	else return 0;
}

int main()
{
	int t;
	scanf("%d",&t);
	for(int i=1;i<=t;i++)
	{
		int sum1=0;
		for(int j=2;j<i;j++)
		{
			if(i%j==0)
				sum1+=j;	
		}	
		int f=qinmi(i,sum1);
		if(f==1)
			printf("%d-%d\n",i,sum1);
	} 
	return 0;
} 

38.把100~150之间的能被3整除的数输出(要求:输出时每行输出5个数)。

输出:102 105 108 111 114

           117 120 123 126 129

           132 135 138 141 144

           147 150

#include <stdio.h>

int main()
{
	int cnt=0;
	for(int i=100;i<=150;i++)
	{
		if(i%3==0)
		{
			cnt++;
			if(cnt%5==0){
				printf("%d\n",i);
				cnt=0;
			}else{
				printf("%d ",i);
			}
		}
	}
	return 0;
}

39.编程对10个有键盘输入的整数排序(降序)。

       输入:6 90 45 56 1 15 44 78 58 101

       输出:101  90  78  58  56  45  44  15  6  1

#include <stdio.h>
#include <algorithm>
#include <iostream>
using namespace std;
int cmp(int a,int b)
{
	return a>b;
}

int main()
{
	int var[10];
	for(int i=0;i<10;i++)
	{
		scanf("%d",&var[i]);
	}
	sort(var,var+10,cmp);
	for(int i=0;i<10;i++)
	{
		printf("%d ",var[i]);
	}
	return 0;
}


/*冒泡排序 
	for(j=0;j<=9;j++)
		for(i=0;i<9-j;i++)
			if(a[i]<a[i+1])
			{
				t=a[i];
				a[i]=a[i+1];
				a[i+1]=t;
			}
*/ 

40.从键盘输入一个3*4的矩阵,要求:输出此矩阵,并求所有元素中的最大值。

       输入:15  38  24  75

                  12  60  80  85

                   95  8   7   2

       输出:15  38  24  75

                  12  60  80  85

                   95  8   7   2

       最大值:95

#include <stdio.h>

int main()
{
	int var[10][10];
	int max=-100000;
	for(int i=0;i<3;i++)
	{
		for(int j=0;j<4;j++)
		{
			scanf("%d",&var[i][j]);
			if(var[i][j]>max)
				max=var[i][j];
		}
	}
	for(int i=0;i<3;i++)
	{
		for(int j=0;j<4;j++)
		{
			if(j==3)
				printf("%d\n",var[i][j]);
			else 
				printf("%d ",var[i][j]);
		}
	}
	printf("%d\n",max);
	return 0;
 } 

41 从键盘输入一个3*3的矩阵,要求:输出此矩阵对应的转置矩阵(所谓转置,指的是对任意元素Pi,j和对应的Pj,i交换)。

输入:15  38  24

          12  60  80

           95  8   7

 输出:15   12  95  

            38   60  8

             24   80  7

#include <stdio.h>

int main()
{
	int a[10][10];
	for(int i=0;i<3;i++)
	{
		for(int j=0;j<3;j++)
		scanf("%d",&a[i][j]);
	}
	for(int i=0;i<3;i++)
	{
		for(int j=0;j<3;j++)
		{
			if(j==2) printf("%d\n",a[j][i]);
			else printf("%d ",a[j][i]);
		}	
	}
	return 0;
 } 

42.100匹马驼100担货,大马一匹驼3担,中马一匹驼2担,小马两匹驼1担。试编写程序计算大、中、小马的数目。(要求大、中、小马必须参与驼货)

       输出:2       30      68

             5       25      70

             8       20      72

             11      30      68

             14      10      76

             17      5       78

#include <stdio.h>

int main()
{
	int a,b,c;
	for(a=1;a<33;a++)
	{
		for(b=1;b<50;b++)
		{
			for(c=2;c<100;c=c+2)
			{
				if(a*3+b*2+c/2==100&&a+b+c==100)
				{
					printf("%d	%d	%d\n",a,b,c);
				}
			}
		}	
	}	
	return 0;
} 

43.编写程序,输出用一元人民币兑换成1分、2分和5分硬币共有多少种兑换方法。(只计算兑换方法总数,且兑换时,可不同时含有1分,2分或5分的硬币)

       输出:541

#include <stdio.h>

int main()
{
	int cnt=0;
	for(int i=0;i<=100;i++)
	{
		for(int j=0;j<=50;j++)
		{
			for(int k=0;k<=20;k++)
			{
				if(i+j*2+k*5==100)
					cnt++;
			}
		}
	}
	printf("%d\n",cnt);
	return 0;
}

44.设N是一个四位整数,它的9倍恰好是其反序数(例如:1234的反序数是4321),求N的值。

       输出:1089

#include <stdio.h>
#include <string.h>

int main()
{
	for(int i=1000;i<=9999;i++)
	{
		int b=i*9,a1[10],a2[10];
		int t1=i,t2=b,j=0,k=0;
		while(t2)//9081
		{
			a2[k]=t2%10;
			t2=t2/10;
			k++;//1089
		}
		int f=0;
		if(k==5) f=1;
		else
		{
			int s=a2[0]*1000+a2[1]*100+a2[2]*10+a2[3];
			if(s!=i)
				f=1;
		}
		
		if(f==0)
			printf("%d\n",i);
	}
	return 0;
}

44.1编写一个递归函数来组合Cm的值,已知组合数的计算公式如下:

 

并在主函数中进行测试。

输入:m=4, n=2

输出:6

#include <stdio.h>

int zuhe(int m,int n)
{
	if(n>m-n) return zuhe(m,m-n);
	else if(n>1) return zuhe(m-1,n-1)+zuhe(m-1,n);
	else if(n==0) return 1;
	else return m;
}

int main()
{
	int m,n;
	scanf("%d%d",&m,&n);
	int s=zuhe(m,n);
	printf("%d\n",s);
	return 0;
}

45.已知Fibonacci数列:1,1,2,3,5,8,13,……。观察数列,可发现这样的规则:从第3项开始,每一项都是其前面两项之和。编程,求Fibonacci数列第N项的值。(其中N的值由键盘输入)

       输入:  2                     输出:  1

       输入:  8                     输出:  21

       输入:  24                    输出:  46368

       输入:  38                    输出:  39088169

#include <stdio.h>

int fibonaci(int n)
{
	if(n==1||n==2) return 1;
	else return fibonaci(n-1)+fibonaci(n-2);	
}

int main()
{
	int n;
	scanf("%d",&n);
	int s=fibonaci(n);	
	printf("%d\n",s);
	return 0;
} 

46.任意输入一个偶数n(n>4),请将它分解为两个素数之和。

       输入:88

       输出:5+83或17+71或29+59或41+47

#include <stdio.h>

int isprime(int n)
{
	int f=0;
	for(int i=2;i<n;i++)
	{
		if(n%i==0) f=1;
	}
	return f;
}

int main()
{
	int n;
	printf("请输入一个偶数\n");
	scanf("%d",&n);
	if(n%2!=0||n<=4)
	{
		printf("输入错误\n");
		break;
	}
	else
	{
		//printf("***\n");
		int flag=1;
		for(int i=2;i<=n/2;i++)
		{
			int f1=isprime(i);
			int f2=isprime(n-i);
			//printf("%d %d %d\n",f1,f2,f1+f2);
			if(f1==0&&f2==0&&flag==1)
			{
				flag=0;
				printf("%d+%d",i,n-i);
			}
			else if(f1==0&&f2==0&&flag!=1)
			{
				printf("或%d+%d",i,n-i);	
			}				
		}
	}
	return 0;
} 

47.编写程序,以字符形式输入一个十六进制数,将其变换为一个十进制整数后输出。(要求:十六进制允许的字符是从0~9和a~f或A~F)

        输入:ffff或FFFF

        输出:65535

#include <stdio.h>
#include <string.h>

int main()
{
	char a[100];
	gets(a);
	int len=strlen(a);
	int sum=0,f=1;
	for(int i=len-1;i>=0;i--)
	{
		if(a[i]>=48&&a[i]<=57)
		{
			sum=sum+(a[i]-0)*f;	
		}	
		else if(a[i]>=65&&a[i]<=70)
		{
			sum=sum+(a[i]-0-55)*f;
		}
		else if(a[i]>=97&&a[i]<=102)
		{
			sum=sum+(a[i]-0-87)*f;
		}
		f=f*16;
	}	
	printf("%d\n",sum);
	return 0;
}

48.一辆卡车违反交通规则,撞人逃跑。现场三人目击事件,但都没记住车号,只记下车号的一些特征。甲说:牌照的前两位数字是相同的;乙说:牌照的后两位数字是相同的;丙是位数学家,他说:四位的车号刚好是一个整数的平方。请根据以上线索求出车号。

        输出:7744

#include <stdio.h>
#include <math.h>

int main()
{
	for(int i=1100;i<=9999;i++)
	{
		int t=i,var[4],j=0;
		while(t)
		{
			var[j++]=t%10;
			t=t/10;
		}
		int sq=sqrt(i);
		if(var[0]==var[1]&&var[2]==var[3]&&sq*sq==i)
		{
			printf("%d\n",i);
		}	
	}
	return 0;
}

49.编程,计算输出Fibonacci数列的前n项。其中,n的值由键盘输入。(Fibonacci数列为:1,1,2,3,5,8,13,……)

        输入:20

        输出:1  1  2  3  5  8  13  21  34  55  89  144 377  610  987  1597  2584  4181  6765

#include <stdio.h>

int fibonaic(int n)
{
	if(n==1||n==2) return 1;
	else return fibonaic(n-1)+fibonaic(n-2);
}

int main()
{
	int n;
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		int f=fibonaic(i);
		printf("%d ",f);
	}
	return 0;
}

50.编程,由键盘输入年、月、日,计算并输出该日是该年的第几天。

        输入:2008-6-29

        输出:181

#include <stdio.h>
#include <string.h>

int main()
{
	int year,month,day;
	char a[20];
	gets(a);
	int len=strlen(a),t=0,f=1;
	for(int i=0;i<len;i++)
	{
		if(a[i]=='-')
		{
			if(f==1) year=t;
			else if(f==2) month=t;
			t=0;
			f++;
			continue;
		}
		else
		{
			//printf("%d\n",a[i]-'0');
			t=t*10+a[i]-'0';
		}
	}
	day=t;
	//printf("%d %d %d\n",year,month,day);
	int m[2][12]={31,28,31,30,31,30,31,31,30,31,30,31
	              ,31,29,31,30,31,30,31,31,30,31,30,31};
	int y=0,mon=month,d=0;
	if(year%400==0||year%4==0&&year%100!=0)
		y=1;//是闰年 
		
	for(int i=0;i<mon-1;i++)
	{
		d=d+m[y][i];
	}
	d+=day;
	printf("%d\n",d);
	return 0;
}
原创文章 54 获赞 99 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_38938670/article/details/105175706