算法筆記第三章練習題_A+B和C,部分A+B,程序運行時間,划拳

部分A+B問題描述:

正整數 A 的“D​A​​(爲 1 位整數)部分”定義爲由 A 中所有 D​A​​ 組成的新整數 P​A​​。例如:給定 A=3862767,D​A​​=6,則 A 的“6 部分”P​A​​ 是 66,因爲 A 中有 2 個 6。

現給定 A、D​A​​、B、D​B​​,請編寫程序計算 P​A​​+P​B​​。
輸入格式:

輸入在一行中依次給出 A、D​A​​、B、D​B​​,中間以空格分隔,其中 0<A,B<10​10​​。
輸出格式:

在一行中輸出 P​A​​+P​B​​ 的值。
輸入樣例 1:

3862767 6 13530293 3

輸出樣例 1:

399

輸入樣例 2:

3862767 1 13530293 8

輸出樣例 2:

0

思路:

枚舉PA的每一位,如果與DA相同,就執行 PA = PA * 10 +DA。PB同理可得,最後輸出PA+PB。

爲了簡化代碼定義一個函數getP()。注意題目的範圍是1010,所以用long long定義A和B。

#include <cstdio>
int main()
{
    long long a,b,da,bd;
    scanf("%lld%lld%lld%lld",&a,&b,&da,&bd);
    long long pa = 0,pb = 0;
    while (a%10 == da)         //枚舉a的每一位,%10的意思是每次取最低位
    {

        pa = pa * 10 +da;       //如果當前位爲da,給pa增加一位pa
        a = a/10;               // /10的意思是每次取前(n-1)位
    }
    while (b%10 == bd)
    {

        bd = bd*10+bd;
        b = b /10;
    }
    printf("%lld\n",pa+pb);
    return 0;
}

程序運行時間題目描述:

要獲得一個 C 語言程序的運行時間,常用的方法是調用頭文件 time.h,其中提供了 clock() 函數,可以捕捉從程序開始運行到 clock() 被調用時所耗費的時間。這個時間單位是 clock tick,即“時鐘打點”。同時還有一個常數 CLK_TCK,給出了機器時鐘每秒所走的時鐘打點數。於是爲了獲得一個函數 f 的運行時間,我們只要在調用 f 之前先調用 clock(),獲得一個時鐘打點數 C1;在 f 執行完成後再調用 clock(),獲得另一個時鐘打點數 C2;兩次獲得的時鐘打點數之差 (C2-C1) 就是 f 運行所消耗的時鐘打點數,再除以常數 CLK_TCK,就得到了以秒爲單位的運行時間。

這裏不妨簡單假設常數 CLK_TCK 爲 100。現給定被測函數前後兩次獲得的時鐘打點數,請你給出被測函數運行的時間。
輸入格式:

輸入在一行中順序給出 2 個整數 C1 和 C2。注意兩次獲得的時鐘打點數肯定不相同,即 C1 < C2,並且取值在 [0,10​7​​]。
輸出格式:

在一行中輸出被測函數運行的時間。運行時間必須按照 hh:mm:ss(即2位的 時:分:秒)格式輸出;不足 1 秒的時間四捨五入到秒。
輸入樣例:

123 4577973

輸出樣例:

12:42:59

思路:

這題目的是模擬clock()函數,給出兩個數c1,c2(機器打點數),然後c2-c1計算出相差的打點數,由於1s內打點100次(CLK_TCK = 100),差值換算成s就是(c2-c1)/CLK_TCK。

# include <cstdio>
int main()
{

    int c1,c2;
    scanf("%d%d",&c1,&c2);
    int ans = c2 - c1;               //按題目要求作差
    if(ans %100 >=50)                //四捨五入操作
    {
        ans = ans/100+1;
    }
    else
    {

        ans = ans/100;
    }
    printf("%02d:%02d:02d\n",ans /3600,ans % 3600/60,ans%60);
    return 0;
}
/*
給出起始時間C1和終止時間C2,單位均爲CLK_TCK(1s = 200CLK_TCK),求出C1 C2相聚時間,其結果按四捨五入精確到S
其中當C2 -C1的末兩位不少於50時,說明C2 -C1需要進位 

划拳題目描述:

酒桌上兩人划拳的方法爲:每人口中喊出一個數字,同時用手比劃出一個數字。如果誰比劃出的數字正好等於兩人喊出的數字之和,誰就贏了,輸家罰一杯酒。兩人同贏或兩人同輸則繼續下一輪,直到唯一的贏家出現。

下面給出甲、乙兩人的划拳記錄,請你統計他們最後分別喝了多少杯酒。

輸入格式:

輸入第一行先給出一個正整數 N(≤100),隨後 N 行,每行給出一輪划拳的記錄,格式爲:

甲喊 甲劃 乙喊 乙劃

其中是喊出的數字,是劃出的數字,均爲不超過 100 的正整數(兩隻手一起劃)。

輸出格式:

在一行中先後輸出甲、乙兩人喝酒的杯數,其間以一個空格分隔。

輸入樣例:

5
8 10 9 12
5 10 5 10
3 8 5 12
12 18 1 13
4 16 12 15

輸出樣例:

1 2

思路:

甲贏:a2=a1+b1 且 b2≠a1+b1    乙贏:a2≠a1+b1 且 b2=a1+b1

# include <cstdio>
int main()
{

    int n,failA = 0,failB = 0;          //甲乙輸的次數
    scanf("%d",&n);                     //記錄條數
    for ( int i = 0;i < n;i++)
    {
        int a1,a2,b1,b2;
        scanf("%d%d%d%d",&a1,&a2,&b1,&b2);  //甲喊甲劃乙喊乙劃
        if(a1 + b1 ==a2 &&a1 + b1!= b2)      //甲猜中乙沒有猜中
        {

            failB++;
        }
        else if (a1 + b1 ==b2 &&a1 + b1!=a2)
        {
            failA++;
        }
    }
    printf("%d %d\n",failA,failB);              //輸出結果
}
/*
注
設計一個全局變量 failA 和failB來記錄甲乙輸的次數
判斷條件中要注意甲乙兩人都猜中的情況

A+B和C

給定區間 [−2​31​​,2​31​​] 內的 3 個整數 A、B 和 C,請判斷 A+B 是否大於 C。
輸入格式:

輸入第 1 行給出正整數 T (≤10),是測試用例的個數。隨後給出 T 組測試用例,每組佔一行,順序給出 A、B 和 C。整數間以空格分隔。
輸出格式:

對每組測試用例,在一行中輸出 Case #X: true 如果 A+B>C,否則輸出 Case #X: false,其中 X 是測試用例的編號(從 1 開始)。
輸入樣例:

    4
    1 2 3
    2 3 4
    2147483647 0 2147483646
    0 -2147483648 -2147483647

輸出樣例:

    Case #1: false
    Case #2: true
    Case #3: true
    Case #4: false
 

# include <cstdio>
int main()
{

    int T,tcase = 1;
    scanf("%d",&T);        //輸入數據組數
    while(T--)             //循環T次
    {
        long long a,b,c;
        scanf("%lld%lld%lld",&a,&b,&c);
        if(a + b > c)
        {

            printf("Case#%d:true\n",tcase++);
        }
        else
        {

            printf("case#%d:false\n",tcase++);
        }
    }
    return 0;
}
/*
注:最大值超過int 型所以變量的數據類型爲longlong型,輸入輸出類型也是%lld
    while (T--)循環的是T次 而--T循環的是T-1次

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章