P47: 用getchar 读入int


// P47 use getchar input a int
#include <iostream>
#include <cstdio>
using namespace std;

int main()
{
    int a[10];
    int bit = 1;
    int sum = 0;
    int i = 0;
    while((a[i] = getchar()) && a[i] != '\n')
    {
        sum = sum * 10 + (a[i] - '0');
    }
    printf("%d\n", sum);
    return 0;
}

2、用fgets读入int

#include <cstdio>
#include <iostream>

using namespace std;

int main()
{
    char a[10];
    int sum = 0;
    fgets(a, 10, stdin);

    for(int i = 0; a[i] != '\n'; ++i)
    {
        sum = sum * 10 + a[i] - '0';
    }

    printf("%d\n", sum);
    return 0;
}

3、用getchar实现fgets


#include <cstdio>
#include <iostream>

using namespace std;

int main()
{
    char a[80];
    int i = 0;
    while((a[i] = getchar() )&& a[i] != '\n')
    {
        i++;
    }
    a[i] = '\0';
    puts(a);
    return 0;
}

4、实现strchr

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 100;

int main()
{
    char a[maxn];
    fgets(a, maxn, stdin);
    char c = 'c';
    int len = strlen(a);

    for(int i = 0; i < len; ++i)
    {
        if(a[i] == c)
        {
            printf("%x\n", sizeof(char) * i + a); /// strchr
        }
    }
    return 0;
}

5、实现   ctype.h    中的isalpha 和 isdigit

#include <iostream>
#include <ctype.h>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 100;

int main()
{
    char a[maxn];
    fgets(a, maxn, stdin);
    int len = strlen(a);
    int c1, c2, c3, c4;

    c1 = c2 = c3 = c4 = 0;
    for(int i = 0; i< len; ++i)
    {
        if(isalpha(a[i]))
            c1++;
        if(isdigit(a[i]))
            c2++;
        if(a[i] >= '0' && a[i] <= '9')
            c3++;
        if((a[i] >= 'a' && a[i] <= 'z') || (a[i] >= 'A' && a[i] <= 'Z'))
            c4++;
    }

    cout << c1 << endl;
    cout << c2 << endl;
    cout << c3 << endl;
    cout << c4 << endl;
    return 0;
}


字符串处理的常见问题

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <ctime>
using namespace std;
const int maxn = 1000000;
char s[maxn];

int main()
{
    //fgets(s, maxn, stdin);
    for(int i = 0; i < 1000000; ++i)
    {
        s[i] = (rand() % 26) + 'a';
    }
    int tot = 0;
    int len = strlen(s);

    for(int i = 0; i < len; ++i)
    {
        if(s[i] == 'a')
            tot++;
    }
    printf("There are %d character(s) '1' in the string.\n", tot);
    printf("Time = %0.2lf\n", (double)clock() / CLOCKS_PER_SEC);
    return 0;
}

sscanf()输入


// sscanf http://wwwblogs/kex1n/archive/2011/06/09/2076501.html
#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

int main()
{
    int a, b, c;
    char s[20] = "12:34:56";
    sscanf(s, "%2d:%2d:%2d", &a, &b, &c);
    printf("%d %d %d\n", a, b, c);
    return 0;
}


P50:上机练习

3、乘积的末3位


#define LOCAL
#include <cstdio>
#include <iostream>
#include <ctype.h>
#include <cstring>
using namespace std;

int main()
{
#ifdef LOCAL
    freopen("data11.in", "r", stdin);
    freopen("data11.out", "w", stdout);
#endif
    char a[10];
    int bit[10] = {1};
    int sum = 1;
    int cnt = 0;
    for(int i = 1; i < 10; i++)
    {
        bit[i] = bit[i-1]*10;
        //printf("%d\n", bit[i]);
    }

    while(scanf("%s", a) != EOF)
    {
        int tag = 0;
        if(isalpha(a[0]))   continue;

        if(a[0] == '-')
        {
            tag = 1;
            cnt++;
        }
        int aa = 0;
        int len = strlen(a);
        if(tag == 1)
        {
            for(int i = len -1, j = 0; i > 0; --i)
            {
                aa += (a[i] - '0') * bit[j++];
            }
        }
        else
        {
            for(int i = len - 1, j = 0; i >=0; --i)  ///  -_-!  (++)!
            {
                aa += (a[i]-'0') * bit[j++];
            }
        }

        sum = (sum%1000) * (aa % 1000);
    }
    printf("%d\n", sum%1000);
    return 0;
}

4、计算器

#define LOCAL
#include <cstdio>
#include <cstring>
#include <iostream>
#include <ctype.h>
using namespace std;

int main()
{
#ifdef LOCAL
    freopen("data12.in", "r", stdin);
    freopen("data12.out", "w", stdout);
#endif

    char *tmp = NULL;
    char a[20];
    int b, c;
    while(fgets(a, 20, stdin) != NULL)
    {
        for(tmp = a; *tmp != '\n'; ++tmp)
        {
            if(*tmp == '+' || *tmp == '-' || *tmp == '*')
                break;
        }

        if(*tmp != '\n')
        switch(*tmp){
        case '+' :
            sscanf(a, "%d + %d", &b, &c);
            printf("%d\n", c+b);
            break;
        case '-':
            sscanf(a, "%d - %d", &b, &c);
            printf("%d\n", b-c);
            break;
        case '*':
            sscanf(a, "%d * %d", &b, &c);
            printf("%d\n", c*b);
            break;
        }
    }
    return 0;
}

用sscanf进行了输入问题简化


5、旋转(rotate)

#define LOCA
#include <cstdio>
#include <cstring>
#include <iostream>

using namespace std;
char str[100][100];
char s[100][100];

void revolve(int m, int n)
{
    for(int i = m; i <= n; ++i)
    {
        s[n][i] = str[i][m];
    }
    for(int i = n; i >= m; --i)
    {
        s[i][n] = str[n][n+m-i];
    }
    for(int i = m; i <= n; ++i)
    {
        s[m][i] = str[i][n];
    }
    for(int i = n; i >= m; --i)
    {
        s[i][m] = str[m][n+m-i];
    }
    return;
}

int main()
{
#ifdef LOCAL
    freopen("data13.in", "r", stdin);
    freopen("data13.out", "w", stdout);
#endif // LOCAL

    FILE *fin, *fout;
    fin = fopen("data13.in", "rb");
    fout = fopen("data13.out", "wb");
    int n;
    fscanf(fin, "%d%*c", &n);   /// 总是忘记吸收空格,这怎么能行?
    for(int i = 1; i <= n; ++i)
    {
        for(int j = 1; j <= n; ++j)
        {
            fscanf(fin, "%c", &str[i][j]);
            //printf("%c", str[i][j]);
        }
        getchar();
    }

    for(int i = 1, j = n; i <= j; ++i, --j)
    {
        revolve(i, j);
    }

    for(int i = 1; i <= n; ++i)
    {
        for(int j = 1; j <= n; ++j)
        {
            fprintf(fout, "%c", s[i][j]);
        }
        puts("");
    }

    fclose(fin);
    fclose(fout);
    return 0;
}

6、进制转化两题

#include <cstdio>
#include <cstring>
using namespace std;
int trans[32];
int bit;
int base;

int handle(int m, int n)
{
    int i = 0;
    memset(trans, -1, sizeof(trans));
    while(m / n != 0)
    {
        trans[i++] = m % n;
        m /= n;
    }
    trans[i++] = m % n;
    trans[i] = '\0';
    return i;
}

int main()
{
    FILE *fin, *fout;
    fin = fopen("data14.in", "rb");
    fout = fopen("data14.out", "wb");

    while(fscanf(fin, "%d %d", &base, &bit) == 2)
    {
        int len = handle(base, bit);
        for(int i = len - 1; i >= 0; --i)
        {
            fprintf(fout, "%d", trans[i]);
        }
        fprintf(fout, "  (%d)\n", bit);
    }

    fclose(fin);     //不要忘记关掉!
    fclose(fout);
    return 0;
}

#include <cstdio>
#include <cstring>
using namespace std;

int bit;
char base[32];
int res;

int handle(int len, int b)
{
    int result = 0;
    int bt = b;             ///用以保存bit的数值,下边的核心啊!
    for(int i = len-1; i >= 0; --i)
    {
        result += (i == len-1) ? (base[i] - '0') : (base[i] - '0') * (b / bt);
        b *= bt;        ///b *= b 这个不对啊, 增长的也太快了点
    }
    return result;
}

int main()
{
    FILE *fin, *fout;
    fin = fopen("data15.in", "rb");
    fout = fopen("data15.out", "wb");
    //fin = stdin;
    //fout = stdout;
    while(fscanf(fin, "%s %d%*c", base, &bit) != EOF)
    {
        fputs(base, fout);
        fprintf(fout ,"\nbit is %d\n", bit);
        int len = strlen(base);
        fprintf(fout ,"len is %d\n", len);
        fprintf(fout, "%d\n", handle(len, bit));
    }
    fclose(fin);
    fclose(fout);
    return 0;
}



更多推荐

算法竞赛入门经典第3章总结