算法竞赛入门经典:第三章思考题

题目1:

/*
 * @Descripttion: 
 * @version: 
 * @Author: Arabrast
 * @Date: 2020-02-22 18:45:19
 * @LastEditors: Arabrast
 * @LastEditTime: 2020-02-23 17:09:59
 * @Abrastact: 思考题:题目1
 * 
 *题目1(必要的存储量):数组可以用来保存很多数据,但在一些情况下,并不需要把
数据保存下来。下面哪些题目可以不借助数组,哪些必须借助数组?请编程实现。假设输入
只能读一遍。
输入一些数,统计个数。
输入一些数,求最大值、最小值和平均数。
输入一些数,哪两个数最接近。
输入一些数,求第二大的值。
输入一些数,求它们的方差。
输入一些数,统计不超过平均数的个数。
 */

#include <stdio.h>
#include<iostream>
#include<math.h>

using namespace std;

void num1()
{
    int i=0;
    int x;
    while(scanf("d",&x)!=EOF)
    {
        i++;
        /*
        if(x=='\n')
        {
            break;
        }
        else
        {
            ++i;
        }*/
    }
    cout<<i<<endl;
}

void num2()
{
    int max,min,avg,sum=0;
    int flag=1;
    int n;
    int x;
    while(1==scanf("%d",&n))
    {
        if(flag==1)
        {
            max=min=n;
            flag=0;
        }
        if(max<n)
        {
            max=n;
        }
        if(min>n)
        {
            min=n;
        }
        sum+=n;
        x++;
    }
    avg=sum/x;
    printf("min is %d,max is %d,average is %d",min,max,avg) ;
}

void num3()
{
    int nums[100],i=0;

    while(1==scanf("%d",&nums[i]))
    {
        i++;
    }

    int x,y;
    int temp;
    int a=nums[0],b=nums[1];
    int distance=a-b;
    for(x=0;x<i;x++)
    {
        for(y=x+1;y<i;y++)
        {
            if(abs(nums[x]-nums[y])<distance)
            {
                distance=abs(nums[x]-nums[y]);
                a=nums[x];
                b=nums[y];
            }
        }
    }
    printf("%d and %d",a,b);
    
}

void num4()
{
    int max,secondmax,n;
    scanf("%d%d",&max,&secondmax);
    int t1=max>secondmax ? max:secondmax;
    int t2=max<secondmax ? max:secondmax;
    max=t1;
    secondmax=t2;
    while(1==scanf("%d",&n))
    {
        if(n>max)
        {
            secondmax=max;
            max=n;
            continue;
        }
        if(n>secondmax &&n!=max)
        {
            secondmax=n;
        }
    }
    printf("max=%d,secondmax=%d",max,secondmax);
}

void num41()
{
    int i=0;
    int nums[100];
    while(1==scanf("%d",&nums[i]))
    {
        ++i;
    }
    int x,y;
    for(x=0;x<i;x++)
    {
        for(y=x+1;y<i;y++)
        {
            if(nums[x]>nums[x+1])
            {
                int temp=nums[x+1];
                nums[x+1]=nums[x];
                nums[x]=temp;
            }
        }
        
    }
    printf("%d",nums[i-2]);

}

void num5()
{
    int nums[100];
    int ct=0,n,i;
    double ave=0.0,sum=0.0,psum=0.0;
    while(1==scanf("%d",&n))
    {
        nums[ct++]=n;
        sum+=n;
    }
    ave=sum/ct;
    for(i=0;i<ct;i++)
    {
        psum+=pow((nums[i]-ave),2);
    }
    psum/=ct;
    printf("variance:%.3f\n",psum);
}

void num6()
{
    int nums[100];
    int ct=0,n,i;
    int sct=0;
    double ave=0.0,sum=0.0;
    while(1==scanf("%d",&n))
    {
        nums[ct++]==n;
        sum+=n;
    }
    ave=sum/ct;
    for(i=0;i<ct;i++)
    {
        if(nums[i]<ave)
        {
            sct++;
        }
    }
    printf("%d numbers smaller than average %f\n",sct,ave);
    
}


int main()
{
   // num1();
   // num2();
   // num3();
   // num41();
   // num5();
   num6();
}

题目2:

/*
 * @Descripttion: 
 * @version: 
 * @Author: Arabrast
 * @Date: 2020-02-29 18:41:29
 * @LastEditors: Arabrast
 * @LastEditTime: 2020-02-29 18:43:29
 * @Abrastact: 题目2(统计字符1的个数):
 * 下面的程序意图在于统计字符串中字符1的个数,可惜有
瑕疵:
#include<stdio.h>
#define maxn 10000000 + 10
int main() {
char s[maxn];
scanf("%s", s);
int tot = 0;
for(int i = 0; i < strlen(s); i++)
if(s[i] == 1) tot++;
printf("%d\n", tot);
}
该程序至少有3个问题,其中一个导致程序无法运行,另一个导致结果不正确,还有一
个导致效率低下。你能找到它们并改正吗?
 */
#include <stdio.h>
#include<string.h>


#define maxn 1000000+10

int main()
{
    char s[maxn];
    scanf("%s",s);
    int tot=0;
    int n=strlen(s);
    for (int i=0;i<n;i++)
    {
        if (s[i]== '1')
        tot++;
    }
    printf("%d\n",tot);
}

回答:

  1. 引用string.h
  2. s是’char’型, 而原来的1是’int’型
  3. strlen(i)多进行了一次遍历.
  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值