【C语言】经典题目(一)

【C语言】字符串刷题篇在这里哦!
【C语言】字符串—刷题篇
【C】语言经典题目,五个摘录为一篇,将会持续更新啦!

C语言经典题目

  • 三位数
  • 水仙花数
  • 完数
  • 求利润
  • 三个数数字排序

三位数

题目
已知有1、2、3、4这几个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
✨分析
  已知: 1,2,3,4这几个数字;
     组成三位数;
     互不相同;
     各位十位百位数字无重复;
  输出: 有多少个;
     是多少;
  思路: 用循环嵌套进行遍历,表示三个数即百位数字 * 100+十位数字 * 10+各位数字。
     但是要控制个位十位百位数字各不相同,所以用if 语句判断,如果各位不等于十位且不等于百位,十位不等于百位,就进行输出。
     而输出要求先输出多少个,最后才依次输出三位数。所以每一次循环可以把这个三位数放到数组中,保存下来。最后输出。
     对于有多少个,符合if语句的用计数器计1。

#include
int main (void)
{
	int array[100]={0};//数组初始化为0
	int count=0,i=0;
	int a,b,c;
	for (a=1;a<5;a++)//百位
		for (b=1;b<5;b++)//十位
			for(c=1;c<5;c++)//个位
				if (a!=b && a!=c && b!=c)
				{
					array[i]=a*100+b*10+c;
					i++;
					count++;
				}
	printf("这样的三位数有%d个\n",count);
	for (i=0;i<count;i++)
		printf("%d ",array[i]);
	printf("\n");
	return 0;
}

水仙花数

题目
打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数 本身。例如:153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方。
✨分析
利用循环对100~999进行遍历,判断是不是完数,是则输出。

#include 
int main (void)
{
	int i,a,b,c;
	for (i=100;i<1000;i++)
	{
		c=i%10;//个位
		b=i/10%10;//十位
		a=i/100;//百位
		if (a*a*a+b*b*b+c*c*c==i)
		{
			printf("%d ",i);
		}
	}
	return 0;
}

完数

题目
一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如6=1+2+3编程找出1000以内的所有完数。
✨分析
  利用循环遍历1~1000;
  将它所有的因子求和;
  判断因子之后是否等于它本身,是则输出。

#include 
int main (void)
{
	int i,k,sum;
	for (i=2;i<=1000;i++)
	{
		sum=0;//注意sum的初始化必须在循环内
		for (k=1;k<i;k++)
			if (i%k==0)
				sum+=k;
		if (sum==i)
			printf("%d ",i);
	}
	return 0;
	printf("\n");
}

输出结果:

6 28 496

求利润

题目
企业发放的奖金根据利润提成:

  利润(I)低于或等于10万元时,奖金可提10%;
  利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可提成7.5%;
  20万到40万之间时,高于20万元的部分,可提成5%;
  40万到60万之间时高于40万元的部分,可提成3%;
  60万到100万之间时,高于60万元的部分,可提成1.5%;
  高于100万元时,超过100万元的部分按1%提成。
  已知: 利润(从键盘输入)
  输出: 根据利润的范围,计算提成并输出。
  思路: 可以用多分支选择语句,即多个if

#include
double f1(int n);
double f2(int n);
double f3(int n);
double f4(int n);
double f5(int n);
double f6(int n);
int main (void)
{
	int n;
	double m;
	printf("请输入利润:\n");
	scanf("%d",&n);
	if (n>0 && n <=1e5)//用科学计数法表示比较简洁
		m=f1(n);
	else if(n>1e5 && n<=2e5)
		m=f2(n);
	else if (n>2e5 && n<=4e5)
		m=f3(n);
	else if (n>4e5 && n<=6e5)
		m=f4(n);
	else if (n>6e5 && n<=1e6)
		m=f5(n);
	else if (n>1e6)
		m=f6(n);
	printf("%lf",m);
	return 0;
}
double f1(int n)
{
	return n*0.1;
}
double f2(int n)  //低于10万的部分用f1()函数
{
	return f1(1e5)+(n-1e5)*0.075;
}
double f3(int n) //低于20万的部分用f2()表示
{
	return f2(2e5)+(n-2e5)*0.05;
}double f4(int n)
{
	return f3(4e5)+(n-4e5)*0.03;

}
double f5(int n)
{
	return f4(6e5)+(n-6e5)*0.015;
}double f6(int n)
{
	return f5(1e6)+(n-1e6)*0.01;
}

三个数数字排序

题目
输入三个数,x、y、z,请把它们从小到大输出。
✨分析
  方法一: 可以使用假定法排序,思路就是:假设x是最小的,x和进行比较,若y大于x,则交换x和y的值,使得x是x、y中最小的……
  方法二: 方法二可以使用指针 ,对三个数完成排序。
  方法三: 使用三目运算符,求得三个数中最大的和最小的,然后用它们的和减去最大值最小值得到中间值。
代码实现
方法一:

#include 
int main (void)
{
	int x,y,z,tmp;
	scanf("%d%d%d",&x,&y,&z);
	if (y<x)
	{
		tmp=x;
		x=y;
		y=tmp;
	}
	if(z<x)
	{
		tmp=x;
		x=z;
		z=tmp;
	}
	if (z<y)
	{
		tmp=y;
		y=z;
		z=tmp;
	}
	printf("%d %d %d\n",x,y,z);
	return 0;
}

方法二:

#include 
void fun(int*a,int*b,int*c);
int main (void)
{
	int x,y,z;
	int *a=&x,*b=&y,*c=&z;
	//给指针a、b、c赋值(地址值)
	scanf("%d%d%d",&x,&y,&z);
	fun (a,b,c);
	printf("%d %d %d\n",*a,*b,*c);
	return 0;
}
void fun(int*a,int*b,int*c)
{
	int tmp;
	if (*b<*a)
	{
		tmp=*a;
		*a=*b;
		*b=tmp;
	}
	if (*c<*a)
	{
		tmp=*a;
		*a=*c;
		*c=tmp;
	}
	if (*c<*b)
	{
		tmp=*b;
		*b=*c;
		*c=tmp;
	}
}

▶️▶️在这里给大家补充一下,错误的程序!

#include 
void fun(int*a,int*b,int*c);
int main (void)
{
	int x,y,z;
	int *a=&x,*b=&y,*c=&z;
	//给指针a、b、c赋值(地址值)
	scanf("%d%d%d",&x,&y,&z);
	fun (a,b,c);
	printf("%d %d %d\n",*a,*b,*c);
	return 0;
}
void fun(int*a,int*b,int*c)
{
	int *tmp;
	if (*b<*a)
	{
		tmp=a;
		a=b;
		b=tmp;
	}
	if (*c<*a)
	{
		tmp=a;
		a=c;
		c=tmp;
	}
	if (*c<*b)
	{
		tmp=b;
		b=c;
		c=tmp;
	}
}

  在这个程序中,并不会实现将x、y、z三个数中按照从小到大的顺序进行输出。
  这是因为,当主函数把程序的执行控制权交给被调函数fun()时,将实参*a,*b,*c传给实参变量。若 *a>*b,则交换a和b的值,使得a指向y,b指向x。但此时并不会改变x和y的值,当函数调用结束后,释放a与b的内存空间,将程序执行的控制权交给主调函数,所以,并不能改变主函数中变量x、y、z的值。
方法三:

#include 
int main (void)
{
	int x,y,z;
	int min,mid,max,sum;
	scanf("%d%d%d",&x,&y,&z);
	sum=x+y+z;
	max=(x>y?x:y)>z?(x>y?x:y):z;
	min=(x<y?x:y)<z?(x<y?x:y):z;
	mid=sum-min-max;
	printf("%d %d %d\n",min,mid,max);
	return 0;
}

  感谢小伙伴的阅读,有错误的地方欢迎指出交流呀

你可能感兴趣的:(C语言刷题,c语言,c语言,c++)