C语言基础习题50例(一)1-5

简介: 代码如下

习题1

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

实现思路:

显然,这个题目需要用到循环,并且是循环嵌套,先列出所有可能的组合,再去掉重复的组合即可。

代码如下:

#include <stdio.h>
int main(){
  int i, j, k, n = 0;
  for(i = 1; i < 5; i++){
    for(j = 1; j < 5; j++){
      for(k = 1; k < 5; k++){
        if(i != j && i != k && j != k){
          n++;
          printf("%d%d%d", i, j, k);
          if(n % 5){
            printf(" ");
          }
          else{
            printf("\n");
          }
        }
      }
    }
  }
  printf("\n\nThere are %d numbers.\n", n);
  return 0;
} 

打印:

123 124 132 134 142
143 213 214 231 234
241 243 312 314 321
324 341 342 412 413
421 423 431 432
There are 24 numbers.

习题2

企业发放的奖金根据利润提成。利润 (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% 提成,从键盘输入当月利润 I ,求应发放奖金总数?

实现思路:

该题需要用到if条件判断或switch语句。

方式一——if语句:

#include <stdio.h>
int main(){
  long profit, bonus;
  float ratio;
  printf("Please input the profit:");
  scanf("%ld", &profit);
  if(profit > 0 && profit <= 100000){
    bonus = profit * 0.1;
  }
  else if(profit > 100000 && profit < 200000){
    bonus = 100000 * 0.1 + (profit - 100000) * 0.075;
  }
  else if(profit >= 200000 && profit < 400000){
    bonus = 100000 * 0.1 + 100000 * 0.075 + (profit - 200000) * 0.05;
  }
  else if(profit >= 400000 && profit < 600000){
    bonus = 100000 * 0.1 + 100000 * 0.075 + 200000 * 0.05 + (profit - 400000) * 0.03;
  }
  else if(profit >= 600000 && profit < 1000000){
    bonus = 100000 * 0.1 + 100000 * 0.075 + 200000 * 0.05 + 200000 * 0.03 + (profit - 600000) * 0.015;
  }
  else{
    bonus = 100000 * 0.1 + 100000 * 0.075 + 200000 * 0.05 + 200000 * 0.03 + 400000 * 0.015 + (profit - 1000000) * 0.01;
  };
  printf("The bonus is %ld", bonus);
  return 0;
} 

打印:

Please input the profit:1234567
The bonus is 41845

方式二——switch语句:

#include <stdio.h>
int main(){
  long profit, bonus = 0;
  printf("Please input the profit:");
  scanf("%ld", &profit);
  int pr = profit / 100000;
  if(pr > 10){
    pr = 10;
  }
  switch(pr){
    case 0:
      bonus = profit * 0.1;break;
    case 1:
      bonus = 100000 * 0.1 + (profit - 100000) * 0.075;break;
    case 2:
    case 3:
      bonus = 100000 * 0.1 + 100000 * 0.075 + (profit - 200000) * 0.05;break;
    case 4:
    case 5:
      bonus = 100000 * 0.1 + 100000 * 0.075 + 200000 * 0.05 + (profit - 400000) * 0.03;
    case 6:
    case 7:
    case 8:
    case 9:
      bonus = 100000 * 0.1 + 100000 * 0.075 + 200000 * 0.05 + 200000 * 0.03 + (profit - 600000) * 0.015;break;
    case 10:
      bonus = 100000 * 0.1 + 100000 * 0.075 + 200000 * 0.05 + 200000 * 0.03 + 400000 * 0.015 + (profit - 1000000) * 0.01;break;
    default:
      printf("Input Error!!\n");break;
  }
  printf("The bonus is %ld", bonus);
  return 0;
} 

效果与方式一相同。

习题3

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


实现思路:

方式一——使用简单循环:

#include <stdio.h>
#include <math.h>
int main(){
  int i;
  for(i = 0; i <= 100000; i++){
    int root1 = sqrt(i + 100), root2 = sqrt(i + 268);
    if(pow(root1, 2) == (i + 100) && pow(root2, 2) == (i + 268)){
      printf("%8d", i);
    }
  }
  printf("\n");
  return 0;
} 

打印:

      21     261    1581

方式二:

假设该数为 x。

则:x + 100 = n2, x + 100 + 168 = m2;

计算等式:m2 - n2 = (m + n)(m - n) = 168;

设m + n = i,m - n = j,i * j =168,i 和 j 至少一个是偶数;

可得m = (i + j) / 2, n = (i - j) / 2,因为m、n为整数,所以i 和 j 要么都是偶数、要么都是奇数;

从 3 和 4 推导可知道,i 与 j 均是大于等于 2 的偶数;

由于 i * j = 168, j>=2,则 1 < i < 168 / 2 + 1;

接下来将 i 的所有数字循环计算即可。

#include <stdio.h>
int main (void)
{
    int  i, j, n, x;
    for (i = 1; i < 168 / 2 + 1; i++){
        if (168 % i == 0){
            j = 168 / i;
            if ( i > j && (i + j) % 2 == 0 && (i - j) % 2 == 0){
                n = (i - j) / 2;
                x = n * n - 100;
                printf ("%8d", x);
            }
        }
    }
    printf("\n");
    return 0;
}

打印:

     -99      21     261    1581

显然,此时比方式一多了一个数-99,只要在方式一中i的初始值减小为-100即可。

习题4

输入某年某月某日,判断这一天是这一年的第几天?


实现思路:

假设月份为n,则天数为前n-1个月的天数加第n月的天数,如果n大于3时,要考虑是否为闰年,如果为闰年,则2月还要多加1天。

#include <stdio.h>
int main (void)
{
    int year, month, day, days, leap = 0;
    printf("Please input the date(YYYY_MM-DD):");
    scanf("%d-%d-%d", &year, &month, &day);
    switch(month){
      case 1:
        days = 0;break;
      case 2:
        days = 31;break;
      case 3:
        days = 59;break;
      case 4:
        days = 90;break;
      case 5:
        days = 120;break;
      case 6:
        days = 151;break;
      case 7:
        days = 181;break;
      case 8:
        days = 212;break;
      case 9:
        days = 243;break;
      case 10:
        days = 273;break;
      case 11:
        days = 304;break;
      case 12:
        days = 334;break;
    default:
      printf("Input Error");break;    
  }
  days += day;
  if(year % 4 ==0 && year % 100 != 0 || year % 400 == 0){
    leap = 1;
  }
  if(leap && month > 2){
    days += 1;
  }
  printf("Days = %d\n", days);
    return 0;
}

打印:

Please input the date(YYYY_MM-DD):2020-05-26
Days = 147

习题5

输入三个整数 x、y、z ,请把这三个数由小到大输出。


实现思路:

通过两两比较找出三者中最大和最小的数。

#include <stdio.h>
int main (void)
{
    int x, y, z, temp;
  printf("Please input 3 numbers:\n");
  scanf("%d %d %d", &x, &y, &z);
  if(x > y){
    temp = x;
    x = y;
    y = temp;
  }
  if(x > z){
    temp = x;
    x = z;
    z = temp;
  }
  if(y > z){
    temp = y;
    y = z;
    z = temp;
  }
  printf("Small to big: %d %d %d", x, y, z);
    return 0;
}

打印:

Please input 3 numbers:
12 34 23
Small to big: 12 23 34
相关文章
TU^
|
5月前
|
存储 C语言
C语言习题~day35
C语言习题~day35
TU^
27 1
|
3月前
|
机器学习/深度学习 C语言
【C语言篇】递归详细介绍(基础概念习题及汉诺塔等进阶问题)
要保持最小的步数,每一次汉诺塔问题(无论是最初还是递归过程中的),如果此时初始柱盘子数为偶数,我们第一步是把最上面的盘子移动到中转柱,如果为奇数,我们第一步则是将其移动到目标柱。
67 0
【C语言篇】递归详细介绍(基础概念习题及汉诺塔等进阶问题)
TU^
|
5月前
|
编译器 C语言
C语言习题~day31
C语言习题~day31
TU^
21 2
TU^
|
5月前
|
算法 程序员 C语言
C语言习题~day36
C语言习题~day36
TU^
38 1
TU^
|
5月前
|
存储 C语言
C语言习题~day34
C语言习题~day34
TU^
26 1
TU^
|
5月前
|
算法 C语言
C语言习题~day33
C语言习题~day33
TU^
25 1
TU^
|
5月前
|
C语言
C语言习题~day32
C语言习题~day32
TU^
17 1
TU^
|
5月前
|
C语言
C语言习题~day30
C语言习题~day30
TU^
22 1
TU^
|
5月前
|
自然语言处理 C语言 C++
C语言习题~day29
C语言习题~day29
TU^
21 1
TU^
|
5月前
|
存储 C语言
C语言习题~day28
C语言习题~day28
TU^
19 1