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

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

三位数

💫题目

已知有1、2、3、4这几个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?

✨分析

  已知: 1,2,3,4这几个数字;

     组成三位数;

     互不相同;

     各位十位百位数字无重复;

  输出: 有多少个;

     是多少;

思路:循环嵌套进行遍历,表示三个数即百位数字 * 100+十位数字 * 10+各位数字。

     但是要控制个位十位百位数字各不相同,所以用if 语句判断,如果各位不等于十位且不等于百位,十位不等于百位,就进行输出。

而输出要求先输出多少个,最后才依次输出三位数。所以每一次循环可以把这个三位数放到数组中,保存下来。最后输出。

     对于有多少个,符合if语句的用计数器计1。

#include<stdio.h>
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 <stdio.h>
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 <stdio.h>
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<stdio.h>
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 <stdio.h>
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 <stdio.h>
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 <stdio.h>
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 <stdio.h>
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语言:数组和指针笔试题解析(包括一些容易混淆的指针题目)
200 1
|
存储 C语言 C++
C语言------------指针笔试题目深度剖析
C语言------------指针笔试题目深度剖析
2.C语言题目---字符串左旋
2.C语言题目---字符串左旋
169 1
|
存储
1.C语言题目---指针类(基础)
1.C语言题目---指针类(基础)
137 1
|
程序员 C语言
【C语言】LeetCode(力扣)上经典题目
【C语言】LeetCode(力扣)上经典题目
237 1
|
存储 编译器 C语言
【C语言】指针练习题目
【C语言】指针练习题目
204 2
|
测试技术 C语言
数据结构学习记录——树习题—Tree Traversals Again(题目描述、输入输出示例、解题思路、解题方法C语言、解析)
数据结构学习记录——树习题—Tree Traversals Again(题目描述、输入输出示例、解题思路、解题方法C语言、解析)
190 1
|
算法 编译器 API
C语言易混淆、简单算法、结构体题目练习、常见关键字总结-1
C语言易混淆、简单算法、结构体题目练习、常见关键字总结
|
C语言
PTA 浙大版《C语言程序设计(第3版)》题目集 习题8-4 报数 (20分)
PTA 浙大版《C语言程序设计(第3版)》题目集 习题8-4 报数 (20分)
|
C语言
C语言 浙大版《C语言程序设计(第3版)》题目集 练习8-8 移动字母 (10分)
C语言 浙大版《C语言程序设计(第3版)》题目集 练习8-8 移动字母 (10分)