澳门网络娱乐游戏平台-澳门电子游戏娱乐网址-官方直营

Hua Wei 机试题目四---2014

     java编程题

原题:

一、计算亮灯的个数

  实现一个字符串数字转人民币的小功能

实现思路: 按照前后符号不同可以分4种情况, 分别如下

描述:一条长廊里依次装有n(1≤n≤65535)盏电灯,从头到尾编号1、2、3、…n-1、n。每盏电灯由一个拉线开关控制。开始,电灯全部关着。

  入参:一个字符串,范围是0.00~999999.99,最多两位小数

  1. input: +1.23400E-03 output: 0.00123400
  2. input: -1.2E-10 output: -0.00000000012 (一共10个0)
  3. input: -1.2E+10 output: -12000000000 (一共9个0)
  4. input: +1.23400E+03 output: 1234.00

有n个学生从长廊穿过。第一个学生把号码凡是1的倍数的电灯的开关拉一下;接着第二个学生把号码凡是2的倍数的电灯的开关拉一下;接着第三个学生把号码凡是3的倍数的电灯的开关拉一下;如此继续下去,最后第n个学生把号码凡是n的倍数的电灯的开关拉一下。n个学生按此规定走完后,长廊里电灯有几盏亮着。

  出参:对应的人民币大写或者验证不合法

首先, 经过我的测试, 明确一点, 并不存在E-0, E+0这种情况.
正如我下面的代码定义的变量一样, 通过循环我们需要拿出: 中间字符串, 第1, 第2个符号,
最后的整数.
事实上具体到代码实现, 我们只需要按照第2个符号的不同, 分2种情况即可.
首先是第2个符号是负号, 也就是E-X, 这种形式, 结果肯定是形如0.00123400这种形式,
可以看到, 唯一需要确定就是中间有多少个0的问题, 通过分析可知, 中间需要end-1个0,
也就是E后面数的绝对值-1
第2种情况是后面的符号是正号的情况, 这种情况稍微有点复杂, 需要分成小数点在中间和
小数点在末尾(也就是无小数点)两种情况. 小数点在末尾我们可以通过2次循环, 第1次把我们
提取出来的中间字符串放进结果数组, 第2次把0添加到小数点之前. 小数点在中间的情况只需
遍历我们提取出来的字符串, 在适当的位置插入小数点即可.

注:电灯数和学生数一致。不能写双重循环,会运行超时。

  例子1:

完整C语言实现:

例如:输入:10  输出:7

  input:12345.67

#include <stdio.h>

int main () {
    char input[10010];  // 输入字符串
    char one;           // 第1个符号
    char mid[10000];    // 中间数字字符串, 不包括小数点
    int mlen = 0;       // 中间字符串的长度
    char two;           // 第2个符号
    int end = 0;        // 最后的整数
    char res[20000];    // 保存最终结果
    int rlen;           // 结果数组的长度
    int pos;            // 小数点的位置
    char *ptr;
    int i;
    int temp;

    scanf("%s", input);
    one = input[0];
    ptr = input + 1;
    // 把mid[], mlen拿到
    while (1) {
        if (*ptr == '.') {
            ptr++;
            continue;
        }
        mid[mlen] = *ptr;
        mlen++;
        ptr++;
        if (*ptr == 'E') {
            two = *(ptr + 1);
            ptr += 2; // 这时候指向第2符号后面的第1个数字
            break;
        }
    }
    // 把end拿到
    while (*ptr != '') {
        end = end * 10 + (*ptr - '0');
        ptr++;
    }

    // 现在搞res结果数组, 一共分2种情况
    if (two == '-') {
        res[0] = one;
        res[1] = '0';
        res[2] = '.';
        rlen = 3;
        // 在[3, end-1]的地方放出'0'
        for (i=1; i<=end-1; i++) {
            res[rlen] = '0';
            rlen++;
        }
        for (i=0; i<mlen; i++) {
            res[rlen] = mid[i];
            rlen++;
        }
    }
    if (two == '+') {
        res[0] = one;
        rlen = 1;
        pos = end + 2; // 小数点的位置
        if (pos >= mlen + 1) {
        // 小数点在末尾
            for (i=0; i<mlen; i++) {
                res[rlen] = mid[i];
                rlen++;
            }
            temp = rlen;
            for (i=temp; i<pos; i++) {
                res[rlen] = '0';
                rlen++;
            }
        } else {
        // 小数点在中间
            for (i=0; i<mlen; i++) {
                res[rlen] = mid[i];
                rlen++;
                if (rlen == pos) {
                    res[rlen] = '.';
                    rlen++;
                }
            }
        }
    }

    // 打印
    for (i=0; i<rlen; i++) {
        // 正号不打印
        if (res[i] == '+') {
            continue;
        }
        printf("%c", res[i]);
    }

    return 0;
}

 

  output:壹万贰仟叁佰肆拾伍元陆角柒分

二、去掉字符串中连续出现三次或以上的字符

  例子2:

描述:输入一串字符(包括数字),去掉连续次数多于3的字符,如果去掉后仍有连续次数多于3的,继续进行同样的处理,直到结果中没有出现连续次数多于3的数字为止。

  input:1000000

输入:110001000100001

  output:输入值超出范围

输出:101 

本文由澳门网络娱乐游戏平台发布于编程,转载请注明出处:Hua Wei 机试题目四---2014

相关阅读