3.6 字符串處理

題號 題目 分數
B1006 換個格式輸出整數 15
B1021 個位數統計 15
B1031 查驗身份證 15
B1002 寫出這個數 20
B1009 說反話 20
B1014/A1061 福爾摩斯的約會 20
B1024/A1073 科學計數法 20
B1048 數字加密 20
A1001 A+B Format 20
A1005 Spell It Right 20
A1035 Password 20
A1077 Kuchiguse 20
A1082 Read Number in Chinese 25
B1006. 換個格式輸出整數
#include <cstdio>

int main()
{
    int n, ans[10], num = 0;
    scanf("%d", &n);

    while(n != 0)
    {
        ans[num++] = n % 10;
        n /= 10;
    }

    for(int i = num - 1; i >= 0; --i)
    {
        if(2 == i)
        {
            for(int j = ans[i]; j > 0; --j)
                printf("B");
        }
        else if(1 == i)
        {
            for(int j = ans[i]; j > 0; --j)
                printf("S");
        }
        else
        {
            for(int j = 1; j <= ans[i]; ++j)
                printf("%d", j);
        }
    }
    return 0;
}
B1021. 個位數統計
注意:段錯誤一般是因爲數組開闢的內存過少,這時返回去仔細讀題,看是不是看錯了條件.
#include <cstdio>

int main()
{
    int ans[10] = {0};
    char str[1010];
    scanf("%s", str);

    int i = 0;
    while(str[i] != '\0')
    {
        ans[str[i] - '0'] += 1;
        i += 1;
    }

    for(int i = 0; i < 10; ++i)
    {
        if(ans[i] != 0)
        {
            printf("%d:%d\n", i, ans[i]);
        }
    }
    return 0;
}
B1031. 查驗身份證
注意:二重循環中,重複使用的變量注意賦初值的地方.
#include <cstdio>

int main()
{
    int power[17] = {7 ,9 ,10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
    char mp[11] = {'1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'};

    int n;
    scanf("%d", &n);
    bool flag;
    bool flag1 = true;

    char tmp[20];
    int sum;
    for(int i = 0; i < n; ++i)
    {
        sum = 0;
        flag = true;
        scanf("%s", tmp);
        for(int j = 0; j < 17; ++j)
        {
            if(tmp[j] < '0' || tmp[j] > '9')
            {
                flag = false;
                break;
            }
            sum += (tmp[j] - '0') * power[j];
        }
        if(tmp[17] != mp[sum % 11])
            flag = false;

        if(false == flag)
        {
            flag1 = false;
            printf("%s\n", tmp);
        }

    }

    if(true == flag)
        printf("All passed");
    return 0;
}
B1002. 寫出這個數
#include <cstdio>

int main()
{
    char mp[10][10] = {"ling","yi", "er", "san", "si",\
                                "wu", "liu", "qi", "ba", "jiu"};
    char str[110];
    scanf("%s", str);

    int i = 0, sum = 0;
    while(str[i] != '\0')
    {
        sum += str[i] - '0';
        i += 1;
    }

    int ans[10], num = 0;
    while(sum != 0)
    {
        ans[num++] = sum % 10;
        sum /= 10;
    }

    for(int i = num - 1; i >= 0; --i)
    {
        printf("%s", mp[ans[i]]);
        if(i != 0)
            printf(" ");
    }

    return 0;
}
B1009. 說反話
使用EOF來判斷單詞是否輸入完畢.
#include <cstdio>

int main()
{
    int num = 0;
    char ans[90][90];

    while(scanf("%s", ans[num]) != EOF)
        num += 1;

    for(int i = num - 1; i >= 0; --i)
    {
        printf("%s",ans[i]);
        if(i > 0)
            printf(" ");
    }
    return 0;

}
使用數組做緩存,單個字符輸入.
#include <stdio.h>
#include <string.h>

int main()
{
    char str[90];
    char ans[90][90];
    gets(str);
    int len = strlen(str);
    int r = 0, h = 0;

    for(int i = 0; i < len; ++i)
    {
        if(str[i] != ' ')
            ans[r][h++] = str[i];
        else
        {
            ans[r][h] = '\0';
            r += 1;
            h = 0;
        }
    }

    for(int i = r; i >= 0; --i)
    {
        printf("%s", ans[i]);
        if(i != 0)
            printf(" ");
    }

    return 0;

}
B1014/A1061. 福爾摩斯的約會
#include <cstdio>
#include <cstring>


int main()
{
    char week[7][5] = {"MON", "TUE", "WED", "THU", "FRI", "SAT", "SUN"};
    char str1[65], str2[65], str3[65], str4[65];
    scanf("%s %s %s %s", str1, str2, str3, str4);
    int i;
    int len1 = strlen(str1);
    int len2 = strlen(str2);
    int len3 = strlen(str3);
    int len4 = strlen(str4);

    for(i = 0; i < len1 && i < len2; ++i)
    {
        if(str1[i] == str2[i])
        {
            if(str1[i] >= 'A' && str1[i] <= 'G')
            {
                printf("%s ", week[str1[i] - 'A']);
                break;
            }
        }
    }

    for(i += 1; i < len1 && i < len2; ++i)
    {
        if(str1[i] == str2[i])
        {
            if(str1[i] >= '0' && str1[i] <= '9')
            {
                printf("%02d:", str1[i] - '0');
                break;
            }

            if(str1[i] >= 'A' && str1[i] <= 'N')
            {
                printf("%02d:", str1[i] - 'A' + 10);
                break;
            }
        }
    }

    for(i = 0; i < len3 && i < len4; ++i)
    {
        if(str3[i] == str4[i])
        {
            if((str3[i] >= 'A' && str3[i] <= 'Z' )|| (str3[i] >= 'a' && str3[i] <= 'z'))
            {
                printf("%02d", i);
                break;
            }
        }
    }
    return 0;
}
B1024/A1073. 科學計數法
注意:對於比較複雜的問題,必須先有算法再下手.字符數組最後要存放’\0’,所以要多開闢一個空間.
#include <cstdio>
#include <cstring>
const int MAXN = 10010;

int main()
{
    char num[MAXN];
    scanf("%s", num);
    int len = strlen(num);

    int pos = 0;    // E's position
    while(num[pos++] != 'E')
        ;
    pos -= 1;

    if('-' == num[0])
        printf("-");

    int exp = 0;
    for(int i = pos + 2; i < len; ++i)
    {
        exp = exp * 10 + (num[i] - '0');
    }

    if(0 == exp)
    {
        for(int i = 1; i < pos; ++i)
            printf("%c", num[i]);
    }

    if('-' == num[pos + 1])
    {
        printf("0.");
        for(int i = 0; i < exp - 1; ++i)
            printf("0");
        printf("%c", num[1]);
        for(int i = 3; i < pos; ++i)
            printf("%c", num[i]);
    }
    else
    {
        for(int i = 1; i < pos; ++i)
        {
            if('.' == num[i])
                continue;
            printf("%c", num[i]);
            if(i == exp + 2 && i != pos - 1)
                printf(".");
        }

        if(exp > pos -3)
            {
                for(int i = 0; i < exp - (pos - 3); ++i)
                    printf("0");
            }
    }
    return 0;
}
B1048. 數字加密
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

int main()
{
    char a[110], b[110], ans[110];
    scanf("%s %s", a, b);
    int len1 = strlen(a);
    int len2 = strlen(b);
    reverse(a, a + len1);
    reverse(b, b + len2);

    for(int i = 0; i < len1 || i < len2; ++i)
    {
        int num1 = i < len1 ? a[i] - '0' : 0;
        int num2 = i < len2 ? b[i] - '0' : 0;
        if(i % 2 == 0)
        {
            int sum = (num1 + num2) % 13;
            if(sum >= 0 && sum <= 9)
                ans[i] = sum + '0';
            else if(10 == sum)
                ans[i] = 'J';
            else if(11 == sum)
                ans[i] = 'Q';
            else
                ans[i] = 'K';
        }
        else
        {
            int sub = num2 - num1;
            ans[i] = (sub < 0 ? sub + 10: sub) + '0';
        }
    }
    reverse(ans, ans + max(len1, len2));
    printf("%s",ans);
    return 0;
}
A1001. A+B Format
常規解法
#include <cstdio>

int main()
{
    int a, b;
    scanf("%d %d", &a, &b);
    int sum = a + b;
    int num[10];

    if(sum < 0)
    {
        printf("-");
        sum = -sum;
    }

    int i = 0;
    do
    {
        num[i++] = sum % 10;
        sum /= 10;
    }while(sum != 0);

    for(i -= 1; i >= 0; --i)
    {
        printf("%d", num[i]);
        if(i % 3 == 0 && i != 0)
            printf(",");
    }
    return 0;
}
利用printf的格式化輸出
#include <cstdio>

int main()
{
    int a, b;
    scanf("%d %d", &a, &b);
    int sum = a + b;
    if(sum < 0)
    {
        printf("-");
        sum = -sum;
    }

    if(sum >= 1000000)
        printf("%d,%03d,%03d", sum / 1000000, sum % 1000000 / 1000, sum % 1000);
    else if(sum >= 1000)
        printf("%d,%03d", sum / 1000, sum % 1000);
    else
        printf("%d", sum);
    return 0;
}
A1005. Spell It Right
常規求解
#include <cstdio>
#include <cstring>

char str[10][10] = {"zero","one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};
int main()
{
    char num[110];
    scanf("%s", num);
    int len = strlen(num);
    int sum = 0;

    for(int i = 0; i < len; ++i)
        sum += num[i] - '0';

    char digit[10];
    sprintf(digit, "%d", sum);
    int len1 = strlen(digit);

    for(int i = 0; i < len1; ++i)
    {
        printf("%s", str[digit[i] - '0']);
        if(i != len1 - 1)
            printf(" ");
    }
    return 0;
}
利用遞歸求解
#include <cstdio>
#include <cstring>

char str[10][10] = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};

void dfs(int num)
{
    if(num / 10 == 0)
    {
        printf("%s", str[num]);
        return;
    }

    dfs(num / 10);
    printf(" ");
    printf("%s", str[num % 10]);
}
int main()
{
    char num[110];
    scanf("%s", num);
    int len = strlen(num);
    int sum = 0;

    for(int i = 0; i < len; ++i)
        sum += num[i] - '0';

    dfs(sum);
    return 0;
}
A1035. Password
#include <cstdio>
#include <cstring>

struct Account
{
    char name[15], password[15];
    bool isModified;
}account[1100];

void judge(Account& account, int& cnt)
{
    int len = strlen(account.password);
    for(int i = 0; i < len; ++i)
    {
        if('1' == account.password[i])
        {
            account.password[i] = '@';
            account.isModified = true;
        }
        else if('0' == account.password[i])
        {
            account.password[i] = '%';
            account.isModified = true;
        }
        else if('l' == account.password[i])
        {
            account.password[i] = 'L';
            account.isModified = true;
        }
        else if('O' == account.password[i])
        {
            account.password[i] = 'o';
            account.isModified = true;
        }
    }
    if(true == account.isModified)
        cnt += 1;
}
int main()
{
    int n;
    scanf("%d", &n);
    for(int i = 0; i < n; ++i)
    {
        scanf("%s %s", account[i].name, account[i].password);
        account[i].isModified = false;
    }

    int cnt = 0;
    for(int i = 0; i < n; ++i)
        judge(account[i], cnt);

    if(0 == cnt && 1 == n)
        printf("There is 1 account and no account is modified");
    else if(0 == cnt)
        printf("There are %d accounts and no account is modified", n);
    else
    {
        printf("%d\n", cnt);
        for(int i = 0; i < n; ++i)
        {
            if(account[i].isModified == true)
                printf("%s %s\n", account[i].name, account[i].password);
        }
    }
    return 0;
}
A1077. Kuchiguse
注意:C++的編譯器g++無法編譯通過gets,選用了c的gcc,這樣無法使用C++中STL中的reverse函數.
#include <stdio.h>
#include <string.h>

void reverse(char a[])
{
    int len = strlen(a);
    for(int i = 0; i < len / 2; ++i)
    {
        char tmp = a[i];
        a[i] = a[len - 1 - i];
        a[len - 1 - i] = tmp;
    }
}

int main()
{
    int n;
    char str[100][260];
    scanf("%d", &n);
    getchar();

    int minLen = 256;
    for(int i = 0; i < n; ++i)
    {
        gets(str[i]);
        int len = strlen(str[i]);
        if(len < minLen)
            minLen = len;
        reverse(str[i]);
    }

    int flag = 1;
    int ans = 0;
    for(int i = 0; i < minLen && flag; ++i)
    {
        char c = str[0][i];
        for(int j = 1; j < n; ++j)
        {
            if(str[j][i] != c)
            {
                flag = 0;
                break;
            }
        }
        if(1 == flag)
            ans += 1;
    }

    if(0 == ans)
        printf("nai");
    for(int i = ans - 1; i >= 0; --i)
        printf("%c", str[0][i]);

    return 0;
}
A1082. Read Number in Chinese
注意:對0進行特判或者一般考慮.
#include <cstdio>
#include <cstring>

char str[10][5] = {"ling", "yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu"};
char wei[5][5] = {"Shi", "Bai", "Qian", "Wan", "Yi"};

int main()
{
    char num[15];
    scanf("%s", num);
    int len = strlen(num);
    int left = 0, right = len - 1;

    while(left + 4 <= right)
        right -= 4;
    if('-' == num[0])
    {
        printf("Fu");
        left = 1;
    }


    while(left < len)
    {
        bool flag = false, print = false;

        while(left <= right)
        {
            if(num[left] == '0' && left != 0)
            {
                flag = true;
            }
            else
            {
                if(true == flag)
                {
                    printf(" ling");
                    flag = false;
                }
                if(left > 0)
                    printf(" ");
                printf("%s", str[num[left] - '0']);
                print = true;
                if(left < right)
                    printf(" %s", wei[right - left - 1]);
            }
            left += 1;
        }
        if(print == true && right != len - 1)
            printf(" %s", wei[(len - 1 - right) / 4 + 2]);

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