基础编程题练习

一、求10 个整数中最大值

思路:
1. 采用循环的方式输入一个数组
2. 使用max标记数组中的最大值,采用循环的方式依次获取数组中的每个元素,与max进行比较,如果arr[i]大于    max,更新max标记的最大值,数组遍历结束后,max中保存的即为数组中的最大值。
#include <stdio.h>
int main()
{
    int arr[10] = { 0 };
    int i = 0;
    for(i = 0;i < 10;i++)
    {
      scanf("%d",&arr[i]);//输入十个数
    }
     ​
    int max = arr[0];//假设最大值max是数组中的第一个数
​    for(i = 1;i<10;i++)
    {
        if(max < arr[i])//如果第一个数小于第二个数,
        max = arr[i];//就将第二个数赋给最大值max,,如果依然是大于则跳出循环
    }
    printf("%d\n",max);
    return 0;
}

我出现了两个问题导致没有运行结果
1、 for(int i = 0;i < 10;i++)//没有单独初始化i
    {
       scanf("%d",&arr[i]); 
    } 


2、for(int i = 0;i<10;i++)
    {
       scanf("%d ",&arr[i]); //在%d后面加了一个空格
    } 

第一个for循环也能用while代替:

while(i<10)
{
   scanf("%d",&arr[i]);
   i++;
}

二、分数求和


计算1/1-1/2+1/3-1/4+1/5 …… + 1/99 - 1/100 的值,打印出结果

我们可以先观察这串数字的特点,分母在1~100之间依次增加,说明肯定得有循环,其次还有正负号的交替,分子不变。那么要怎样实现正负号交替就是我们要思考的了。

思路:
1. 从上述表达式可以分析出
   a. 该表达式主要由100项,基数项为正,偶数项为负
2. 设置一个循环从1~100,给出表达式中的每一项:1.0/i, 注意此处不能使用1,否则结果全部为0
    然后使用flag标记控制奇偶项,奇数项为正,偶数项为负
    然后将所有的项相加即可
#include <stdio.h>
int main()
{
    double sum = 0.0;
    int flg = 1;
    int i = 0;
    for(i = 1;i<=100;i++)
   {
       sum += 1.0/i*flg;
       flg = -flg;
   }
  printf("%lf\n",sum);
  return 0;
}

 此代码的注意事项:

分数求和,要看结果是整数还是小数,这个式子明显是小数,所以初始化sum时要用double类型。

打印时也要注意不是打印整数%d,而是浮点数%lf。

这里的正负号变换我们是定义了一个flg,赋值为1,再通过循环中的flg = -flg就能实现正负号变换。

 三、编写程序数一下 1到 100 的所有整数中出现多少个数字9

看到这个问题,我们可以先写出1~100出现了数字9的数字,有:

9  19  29  39  49  59  69  79  89  90  91  92  93  94  95  96  97  98  99

观察可以发现:9,无非是出现十位或者个位上,个位上有9的数除以10,取余数都是9;十位上有9的数除10都为9。

思路:
1. 给一个循环从1遍历到100,拿到每个数据后进行一下操作
2.  a. 通过%(取余)的方式取当前数据的个位,检测个位数据是否为9
         如果是,给计数器加1
    b. 通过/的方式取当前数据的十位,检测十位数据是否是9,
          如果是,给计数器加1
  循环一直继续,直到所有的数据检测完,所有9的个数已经统计在count计数中。

#include <stdio.h>
int main()
{
    int count =0;
    int i = 0;
    for(i=1;i<100;i++)
    {
        if(i % 10 ==9)//检测个位
           count++;
        if(i / 10 == 9)//检测十位
        count++;
    }
    printf("%d\n",count);
    return 0;
}

 3.1、编写程序数一下 1到 100 的所有整数中有多少个数字出现数字9

小小拓展一下

这个问题我们需要怎么修改一下代码呢?因为99中是有两个9出现的,总不能把99算两次噻。

很简单:只需将第二个if改成else if,这样就有了选择性,第一个执行时就不会执行第二个了 


#include <stdio.h>
int main()
{
    int count =0;
    int i = 0;
    for(i=1;i<100;i++)
    {
        if(i % 10 == 9)//检测个位,,注意是双等号,一个等号是赋值
           count++;
        else if(i / 10 == 9)//检测十位
        count++;
    }
    printf("%d\n",count);
    return 0;
}

​

四、 打印1000年到2000年之间的闰年

 这个问题其实很简单,只需了解了闰年的含义,就能解决

能被4整除并且不能被100整除能被400整除的年份就是闰年。

 一定要注意标红的关键词。

#include <stdio.h>
int main()
{
	int i = 0;
	for(i = 1000;i < 2000;i++)
	{
		if(i % 4 == 0 && i % 100 !=0 || i % 400 == 0)//&&是且,||是或
		printf("%d ",i);
	}
	return 0;
}

五、 最大公约数

给定两个数,求这两个数的最大公约数

例如:

输入:20 40

输出:20

最大公约数:即两个数据中公共约数的最大者。
求解的方式比较多,暴力穷举、辗转相除法、更相减损法、Stein算法算法
此处主要介绍:辗转相除法

#include <stdio.h>
int main()
{
   int a = 0;
   int b = 0;
   int c = 0;
   scanf("%d %d",&a,&b);
   while(c = a % b)
   {
        a = b;
        b = c;
   }
   printf("%d\n",b);
   return 0;
}

 

思路:
例子:18和24的最大公约数
第一次:a = 18  b = 24  c = a%b = 18%24 = 18
      循环中:a = 24   b=18
第二次:a = 24   b = 18  c = a%b = 24%18 = 6
      循环中:a = 18   b = 6


第三次:a = 18   b = 6   c=a%b = 18%6 = 0
  循环结束
  
此时b中的内容即为两个数中的最大公约数。

 OK,此次分析就到此结束咯,代码有很多种写法,我只是列出了一种,有问题欢迎指出哦!

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值