ACM-字符串的相关联系,进制

字符串的相关处理练习

3-3 乘积的末3位

主要在于EOF的判断,以及清空缓冲区的处理(gcc编译器没有fflush(stdin))。
如果scanf得到了错误的数值,返回值0

c#include 

#define MAXN 3000

int main()
{
    int a;
    int b;
    int sum = 1;

    // EOF int值为-1
    while(b != EOF)
    {
        b = scanf("%d", &a);
        if(b)
            sum = (sum * a) % 1000;
        else
            // 清空缓冲区
            while ( getchar() != '\n' ); 
        printf("sum: %d\n", sum);
    }
    return 0;
}

3-4 计算器

c#include 


// 用于判断是否符号
int belong(char c)
{
    switch(c)
    {
        case '+':
            return 1;
        case '*':
            return 1;
        case '-':
            return 1;
        default:
            return 0;
    }
}

int cal(int a1, int a2, char c)
{
    if(c == '+')
        return a1 + a2;
    else if(c == '*')
        return a1 * a2;
    else if(c == '-')
        return a1 - a2;
    else
        return 0;

}

int main()
{
    // 考虑使用fgets但是一行的字符不确定,所以放弃

    int b;
    char c;
    int a1, a2;
    while(b != EOF)
    {
        b = scanf("%d", &a1);
        while((c = getchar()) != '\0')
        {
            if(belong(c))
                break;
        }
        b = scanf("%d", &a2);

        int result = cal(a1, a2, c);
        printf("%d\n", result);
    }
    return 0;
}

3-5 Matrix

旋转矩阵

c
#include #define sci(a) scanf("%d", &a) #define fori(a, b) for(i = a; i < b; i++) #define forj(a, b) for(j = a; j < b; j++) #define MAXN 1000 int n; // void trans(int a[][MAXN]) { int i, j; for(j = n-1; j >= 0; j--) { for(i = 0; i < n; i++) { printf("%5d", a[i][j]); } printf("\n"); } } void check(int a[][MAXN]) { int i, j; fori(0, n) { forj(0,n) printf("%5d", a[i][j]); printf("\n"); } } int main() { int i, j; int a[MAXN][MAXN]; while(~sci(n)) { for(i = 0; i < n; i++) { for(j = 0; j < n; j++) { sci(a[i][j]); } } check(a); puts("trans: "); trans(a); } return 0; }

3-6 进制转换,10进制转换为b进制

求每次除以b得到的余数,反向输出余数即可。

c#include 
#include 

#define forj(a, b) for(j = a; j < n; j++)

void trans(int b, int c)
{
    int i;
    int tc = c;
    int a[100];

    i = 0;
    while(tc != 0)
    {
        a[i] = tc % b;
        tc = tc / b;
        i++;
    }

    int j;
    for(j = i-1; j >= 0; j--)
        printf("%d", a[j]);
    printf("\n");
}

int main()
{
    int b;
    int c;
    while(~scanf("%d", &b))
    {
        scanf("%d", &c);
        trans(b, c);
    }
    return 0;
}

3-6 进制转换,包含大数

输入的数字为大数。主要依据是模拟手算。

因为test的时候调用了一次eval,结果调试的时候半天找不出错误。

c#include 
#include 

// 大数

/**
 * 模拟手算
 * @param b, c
 * b为int型进制,c为大数
 * @return rest
 */
int divide(int b , char *c)
{
    int len = strlen(c);
    int i;
    int temp, rest;
    rest = 0;
    for(i = 0; i < len; i++)
    {
        temp = c[i] - '0';
        rest = rest * 10 + temp;
        temp = rest / b;
        c[i] = temp + '0';
        rest = rest % b;
    }
    return rest;
}

// 判断是否为0
int eval(char *c, char b)
{
    int i = 0;
    int len = strlen(c);
    for(i = 0; i < len; i++)
    {
        if(c[i] != b)
            return 0;
    }
    return 1;
}

/**
 * 100位最大位数
 */

// 用于测试
void output(char *c)
{
    printf("---------------------output----------------------\n");
    int i = 0;
    int len = strlen(c);
    for(i = 0; i < len; i++)
    { 
        printf("%c", c[i]);
    }
    printf("\n");
    printf("---------------------output----------------------\n");
}

// 仅作测试
void test()
{
    // 测试函数
    char ss[] = "00";
    int temp = eval(ss, '0');
    int len = strlen(ss);

    printf("temp: %d, len: %d\n", temp, len);

    char n1[] = "10";
    int n2 = 2;
    int re = divide(n2, n1);

    printf("str: %s\n", n1);
    printf("rest: %d\n", re);
}

void transCHAR(int b, char *c)
{
    int a[100];
    int i = 0;
    /* test(); */
    /* output(c); */

    while(!eval(c, '0'))
    {
        a[i] = divide(b, c);
        i++;
    }

    /* printf("i: %d\n", i); */
    /* printf("b: %d\n", b); */
    /* printf("s: %s\n", c); */

    int j;
    for(j = i-1; j >= 0; j--)
        printf("%d", a[j]);
    printf("\n");
}

int main()
{
    int b;
    char a[100];
    while(~scanf("%d", &b))
    {
        scanf("%s", a);
        transCHAR(b, a);
    }
    return 0;
}

3-7 进制转换2 b进制转换为10进制

c#include 
#include 
#include 

#define MAXN 1000

// 如果是大数

/**
 * c为数字,b为进制
 */
void trans(char *c, int b)
{
    // 输入数字不正确的可能处理没有添加
    int len = strlen(c);
    int j, temp, tt;
    int res = 0;
    temp = pow(b, len-1);
    for(j = 0; j < len; j++)
    {
        tt = c[j] - '0';
        res += tt * temp;
        temp /= b;
    }

    printf("%d\n", res);
}


int main()
{
    int b;
    char c[MAXN];
    while(~scanf("%d", &b))
    {
        scanf("%s", c);
        trans(c, b);
    }
    return 0;
}

3-8 感觉没有什么含量。。主要是输出的不确定,所以不做了

你可能感兴趣的:(进制转换,算法,acm)