天天看點

【C++初級】2、浮點數計算

1、概述

上一節課我們了解了什麼是C++語言,了解了寫一個C++程式的基本步驟,知道了如何定義變量,本節課是在上一節課的基礎上繼續深化基礎知識的學習,将詳細介紹資料類型,如何格式化輸出并且包括計算機的一些基礎知識。在文章的最後會有幾道習題,用于鞏固本節課學習的内容。

2、資料類型

上一節課我們講到對于一個變量,我們要确定他的類型,這就像分類,舉個例子:水果和蔬菜是兩種類别,把蘋果,香蕉歸入水果類,把洋芋,洋蔥歸入蔬菜類,變量的類型就相當于這裡的類别,變量名就相當于具體是哪一種水果(具體是哪一種蔬菜)。是以資料類型對于變量來說十分重要。

下面介紹一下常用的資料類型

  • 整數
    • int
    • long long
  • 浮點數
    • float
    • double
資料類型 辨別符 所占位元組數 取值範圍
整型 int 4 -2147483648~2147483647
長整型 long long 8 $-2 ^{63} $~ 2 63 − 1 2^{63}-1 263−1
單精度浮點數 float 4 7位有效數字
雙精度浮點數 double 8 15位有效數字

浮點數可以了解為小數,上面的float和double的有效數字指的是小數點後有多少位

C++中的浮點數預設是下取整,例如
10/3 = 3
如果想要表示具體的小數是多少,則需要使用double或float類型
10.0/3 = 3.3333333
10.0預設是double類型,一般來說也是double用的比較多
           

目前階段需要先掌握這幾個簡單的類型,更多的類型在後續的學習中逐漸介紹。

注意

  • 一般數字大小在 ± 1 0 9 \pm10^9 ±109内都使用int,如果超過了 1 0 9 10^9 109,俗稱爆int,需要使用long long
  • long long隻能表示 ± 1 0 18 \pm10^{18} ±1018内的數字
  • 不是開的越大越好,long long雖然表示範圍大,但是占用記憶體也大,題目都有記憶體限制,是以要按照實際需求來選擇合适的類型
  • 浮點數一般使用double
  • C++整數除法(兩個都是整數的情況)預設是下取整

3、輸出格式控制

輸出保留小數點位數

上節課已經介紹過了,這裡再強調一下

以固定浮點的形式輸出,如保留小數點後3位可寫為:

cout<<fixed<<setprecision(3)<<a;

格式化輸出

基本格式:printf(“格式化控制字元串”,輸出清單);

  • 格式化控制字元串:
    1. 以%開頭,後面跟格式字元
    2. 非格式字元串(即要輸出的内容)
  • 輸出清單:即輸出的表達式清單

常見的格式字元

【C++初級】2、浮點數計算

舉個栗子

1、輸出整數
int t = 100;
printf("%d\n",t);//\n是換行的意思
結果:100
    
2、輸出浮點數
double f = 3.1415926;
double a = 7.1;
printf("%f %.3f\n",f,a);//輸出f,輸出a并保留三位小數
結果:3.1415926 7.100
    
           

常用庫函數

函數名 格式 功能說明 執行個體
絕對值函數 abs(x) 求一個數x的絕對值 abs(-5)=5
向下取整 floor(x) 求不大于實數x的最大值 floor(3.14)=3
向上取整 ceil(x) 求不小于實數x的最小值 ceil(3.14)=4
指數函數 pow(x,y) 計算xy,結果為雙精度實數 pow(2,3)=8
平方根函數 sqrt(x) 求實數x的平方根 sqrt(36)=6

疑惑解答

有些同學看到這就會有疑問,你這明明是C語言的輸出,怎麼C++還在用?

是這樣的,C++是C語言的更新,是以在C++程式中使用C語言風格的輸入輸出是被允許的。也就是說C++向下相容C語言,實際的做題中是混用的,看哪個友善就用哪個。

實際上競賽學的是C語言+STL,STL是常用的一些庫函數。

4、記憶體容量

計算機的一些基礎知識

  • 比特位,bit,存一個0或者1
  • 1位元組(byte) = 8 比特(bit)
  • 千位元組(KB) = 1024位元組(B)
  • 兆位元組(MB) = 1024千位元組(KB)
  • 吉位元組(GB) = 1024兆位元組(MB)

5、例題

題目連結:https://www.luogu.com.cn/problem/P5709

【深基2.習6】Apples Prologue / 蘋果和蟲子

題目描述

八尾勇喜歡吃蘋果。她現在有 m m m( 1 ≤ m ≤ 100 1 \le m \le 100 1≤m≤100)個蘋果,吃完一個蘋果需要花費 t t t( 0 ≤ t ≤ 100 0 \le t \le 100 0≤t≤100)分鐘,吃完一個後立刻開始吃下一個。現在時間過去了 s s s( 1 ≤ s ≤ 10000 1 \le s \le 10000 1≤s≤10000)分鐘,請問她還有幾個完整的蘋果?

輸入格式

輸入三個非負整數表示 m , t , s m, t, s m,t,s。

輸出格式

輸出一個整數表示答案。

如果你出現了 RE,不如檢查一下被零除?

樣例 #1

樣例輸入 #1

50 10 200
           

樣例輸出 #1

30
           

解題思路

s/t表示吃了幾個蘋果,預設下取整,要注意如果t不能整除s則代表還有一個蘋果是殘缺的,是以可求得還有幾個完整的蘋果,當然還需要特判t = 0的情況。這裡特判需要用到if,

if(判斷條件)
{
	//判斷條件為真的情況
}
else
{
    //判斷條件為假的情況
}
           

參考代碼

#include<bits/stdc++.h>
using namespace std;

int main()
{
    int m,t,s;
    cin>>m>>t>>s;
    if(t == 0) cout<<0; //如果if隻有一行指令要執行,可以省略大括号,但是超過1行必須使用大括号
    else if(s % t == 0){
        if(s/t >= m) cout<<0;    //這邊可以簡化成cout<<max(m-s/t,0);max函數是求兩個數中最大值
        else cout<<m - s/t;
    }else{
        if(s/t >= m) cout<<0;   //可以簡化成cout<<max(m-s/t-1,1);
        else cout<<m - s/t - 1;
    }
    return 0;
}
           

6、課後習題

  • https://www.luogu.com.cn/problem/P5681
  • https://www.luogu.com.cn/problem/P5708
  • https://www.luogu.com.cn/problem/P5703
  • https://www.luogu.com.cn/problem/P3954

繼續閱讀