C精华练习系列(1)

简介: C精华练习系列(1)

C 练习实例1


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


程序分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去 掉不满足条件的排列。


参考代码为:


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


代码运行结果为:


0a2653c851af460fa595bd959398a8f1.png


C 练习实例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,求应发放奖金总数?


程序分析:注意定义时需把奖金定义成长整型。


参考代码为:


#include <stdio.h>
int main()
{
  long long n = 0;
  scanf("%lld", &n);
  long long  sum = 0;
  if ((n > 0) && (n <= 100000))
  {
  sum = n * 0.1;
  }
  if ((n > 100000) && (n <= 200000))
  {
  sum = 100000 * 0.1 + (n - 100000) * 0.075;
  }
  if ((n > 200000) && (n <= 400000))
  {
  sum = 100000 * 0.1 + 100000 * 0.075 + (n - 200000) * 0.05;
  }
  if ((n > 400000) && (n <= 600000))
  {
  sum = 100000 * 0.1 + 100000 * 0.075 + 200000 * 0.05 + (n - 400000) * 0.03;
  }
  if ((n > 600000) && (n <= 1000000))
  {
  sum = 100000 * 0.1 + 100000 * 0.075 + 200000 * 0.05 + 400000 * 0.03 + (n - 600000) * 0.015;
  }
  if (n > 1000000)
  {
  sum = 100000 * 0.1 + 100000 * 0.075 + 200000 * 0.05 + 400000 * 0.03 + 600000 * 0.015+(n-1000000)*0.01;
  }
  printf("%lld\n", sum);
  return 0;
}


C 练习实例3


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


程序分析:


假设该数为 x。


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 至少一个是偶数


4、可得: m = (i + j) / 2, n = (i - j) / 2,i 和 j 要么都是偶数,要么都是奇数。


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


6、由于 i * j = 168, j>=2,则 1 < i < 168 / 2 + 1。


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


参考代码为:


#include <stdio.h>
int main (void)
{
    int  i, j, m, 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)
            {
                m = (i + j) / 2;
                n = (i - j) / 2;
                x = n * n - 100;
                printf ("%d + 100 = %d * %d\n", x, n, n);
                printf ("%d + 268 = %d * %d\n", x, m, m);
            }
        }
    }
    return 0;
}

另外一种写法为:


#include <stdio.h>
#include <math.h>
int my_sqart(int i)
{
  int n = sqrt(i);
  if (i == n * n)
  {
  return 1;
  }
  return 0;
}
int main()
{
  int i = 0;
  for (i=-100; i <= 20000; i++)
  {
  if (my_sqart(i + 100) == 1)
  {
    if (my_sqart(i + 100 + 168) == 1)
    {
    printf("%d ", i);
    }
  }
  }
}

运行结果为:


6de278e6d6694ce5bb08e7e842b7e74b.png


C 练习实例4


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


程序分析:以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天,特殊情况,闰年且输入月份大于3时需考虑多加一天。


#include <stdio.h>
int main()
{
  int arr[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
  int n = 0;
  int y = 0;
  int r = 0;
  scanf_s("%d%d%d", &n, &y, &r);
  if ((n % 4 == 0) && (n % 100 != 0) || (n % 400) == 0)
  {
  arr[2] = 29;
  }
  int i = 0;
  int sum = 0;
  for (i = 0; i < y; i++)
  {
  sum = sum + arr[i];
  }
  printf("%d\n", sum + r);
  return 0;
}


运行结果为:


12c3b7f3f8814309a195c64f051d4445.png


另外一种写法为:


#include <stdio.h>
int main()
{
    int day,month,year,sum,leap;
    printf("\n请输入年、月、日,格式为:年,月,日(2015,12,10)\n");
    scanf("%d,%d,%d",&year,&month,&day);  // 格式为:2015,12,10
    switch(month) // 先计算某月以前月份的总天数
    {
        case 1:sum=0;break;
        case 2:sum=31;break;
        case 3:sum=59;break;
        case 4:sum=90;break;
        case 5:sum=120;break;
        case 6:sum=151;break;
        case 7:sum=181;break;
        case 8:sum=212;break;
        case 9:sum=243;break;
        case 10:sum=273;break;
        case 11:sum=304;break;
        case 12:sum=334;break;
        default:printf("data error");break;
    }
    sum=sum+day; // 再加上某天的天数
    if(year%400==0||(year%4==0&&year%100!=0)) {// 判断是不是闰年
        leap=1;
    } else {
       leap=0;
    }
    if(leap==1&&month>2) { // *如果是闰年且月份大于2,总天数应该加一天
        sum++;
    }
    printf("这是这一年的第 %d 天。",sum);
    printf("\n");
}


C 练习实例5


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


程序分析:我们想办法把最小的数放到x上,先将x与y进行比较,如果x>y则将x与y的值进行交换,然后再用x与z进行比较,如果x>z则将x与z的值进行交换,这样能使x最小


参考代码为:


#include <stdio.h>
void jiaohuan(int* x, int* y)
{
  int tmp = *x;
  *x = *y;
  *y = tmp;
}
int main()
{
  int x = 0;
  int y = 0;
  int z = 0;
  scanf_s("%d %d %d", &x, &y, &z);
  if (x > y)
  {
  jiaohuan(&x, &y);
  }
  if (x > z)
  {
  jiaohuan(&x, &z);
  }
  if (y > z)
  {
  jiaohuan(&y, &z);
  }
  printf("%d %d %d\n", x, y, z);
  return 0;
}

代码的运行结果为:

34e8d716411043c08c7ffba9fbba23de.png


相关文章
|
9月前
|
编译器 C++
【C++精华铺】8.C++模板初阶
什么是泛型编程?泛型编程是避免使用某种具体类型而去使用某种通用类型来进行程序编写的方式,依次来复用某段代码而避免大规模功能相似重复冗余的代码。下面的代码如果想用泛型编程该如何实现。马云有次说了这么一句话:“世界是懒人创造的,懒不是傻懒,如果你想少干,就要想出懒的方法。要懒出风格,懒出境界。”C++必然也是有风格有境界的,所以C++中设计了实现了泛型编程。
|
10月前
|
存储 SQL 自然语言处理
计算机基础必读书籍
计算机基础必读书籍
75 0
|
运维 搜索推荐 安全
第一章 学前必读
第一章 学前必读
|
Web App开发 移动开发 前端开发
前端工程师学习路线分析
首先学习的时候,不要想着大而全; 很多知乎上包括网上列举的学习路线都是想着大而全,什么都去搞,恨不得把前面5年的学习路线都安排好的; 我觉得新手不应该这么做,新手学习的时候应该有自己的主要方向; 不要贪心,不要想着大而全,前端是很繁荣,是新技术层出不穷,但是新手的大部分时间应该死磕核心部分;
340 0
|
消息中间件 缓存 边缘计算
总结牛客前端工程师精选面经合集(四)
总结牛客前端工程师精选面经合集(四)
|
Web App开发 前端开发 JavaScript
总结牛客前端工程师精选面经合集(三)
总结牛客前端工程师精选面经合集(三)
|
缓存 移动开发 JavaScript
总结牛客前端工程师精选面经合集(一)
总结牛客前端工程师精选面经合集(一)
|
存储 移动开发 JavaScript
总结牛客前端工程师精选面经合集(二)
总结牛客前端工程师精选面经合集(二)
|
Web App开发 JavaScript 关系型数据库
【精华】Web开发必备资源汇总
导读:原文来自《Best “must know” open sources to build the new Web》,译文由酷壳网陈皓整理编译《开源中最好的Web开发的资源 》。文中收集的资料相当的齐全,供大家学习、参考。
2359 0