免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12345678
最近访问板块 发新帖
楼主: _google
打印 上一主题 下一主题

[C] HELP!我是C新手,看到两个oracle的C语言面试题 [复制链接]

论坛徽章:
0
71 [报告]
发表于 2007-06-12 22:21 |只看该作者
第二题应该使用递归而不是循环,这样才能减少程序行数
然而递归却是经常使用命令式语言的人的死穴
本题的考察目的可能就在于此

[ 本帖最后由 sltk 于 2007-6-12 22:23 编辑 ]

论坛徽章:
0
72 [报告]
发表于 2007-06-13 13:48 |只看该作者

  1. #include<math.h>
  2. #include<stdlib.h>
  3. #include<stdio.h>

  4. int p(char *src)
  5. {
  6.         int cnt=(int)pow(10, (strlen(src)-1));
  7.         if(*(src+1)=='\0')
  8.                 return *src-'0';
  9.         return (*src - '0')*cnt + p(src+1);
  10. }
  11. int main(void)
  12. {
  13.         char a[]="1234";
  14.         printf("%d", p(a));
  15.         return 0;
  16. }
复制代码

递归不太好实现啊。也没少几行代码,还没加入测试功能,还调用了两个库函数。
兄弟们还有好的递归方案不?

论坛徽章:
0
73 [报告]
发表于 2007-06-13 14:09 |只看该作者
个人觉得,
写程序,最好还是用常规的思路来写,特别是效率差别不大的时候,
好维护。

更不要去和编译器较劲,通用一点的好。
有力气,还是多花在用户需求、扩展性、可维护性方面好一些。

不要走火入魔了

论坛徽章:
0
74 [报告]
发表于 2007-06-29 10:26 |只看该作者
1.(1)用位运算.用位运算时,必须判断数是否存在相等情况,此外,对于浮点数,位运算就不行.
  
  (2)
void swap(int *a,int *b,int *c)
{
    *a = *a + *b + *c;
    *c = *a - *b - *c;
    *b = *a - *b - *c;
    *a = *a - *b - *c;
}
这样方法对浮点数可行,但存在溢出问题,当*a,*b,*c数比较大时,它们的和就可能溢出了.
以上两种方法,视情况而用吧

论坛徽章:
0
75 [报告]
发表于 2007-06-29 16:49 |只看该作者
(2)


#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>


long fun(char *in) {
        char out[257];
        memset(out, '\0', sizeof(out));
    sprintf(out, "%0*ld", strlen(in), atol(in));
    if(strcmp(in, out) != 0) {
        //    printf("**********error************\n");
            return -1;
    } else {
            return atol(in);
    }
}


main()
{
        printf("$$$$$$$$$$$ %ld $$$$$$$$$$$$\n", fun("-12345"));
        printf("$$$$$$$$$$$ %ld $$$$$$$$$$$$\n", fun("0000"));
        printf("$$$$$$$$$$$ %ld $$$$$$$$$$$$\n", fun("000125"));
        printf("$$$$$$$$$$$ %ld $$$$$$$$$$$$\n", fun("sfdg12"));
        printf("$$$$$$$$$$$ %ld $$$$$$$$$$$$\n", fun("1234gh"));
        printf("$$$$$$$$$$$ %ld $$$$$$$$$$$$\n", fun("654"));

}




测试结果:
$$$$$$$$$$$ -12345 $$$$$$$$$$$$
$$$$$$$$$$$ 0 $$$$$$$$$$$$
$$$$$$$$$$$ 125 $$$$$$$$$$$$
$$$$$$$$$$$ -1 $$$$$$$$$$$$
$$$$$$$$$$$ -1 $$$$$$$$$$$$
$$$$$$$$$$$ 654 $$$$$$$$$$$$

论坛徽章:
0
76 [报告]
发表于 2007-10-10 01:04 |只看该作者
http://c-faq-chn.sourceforge.net/ccfaq/node40.html
里的内容

4.4 这是个巧妙的表达式:  a ^= b ^= a ^= b  它不需要临时变量就可以交换 a 和 b 的值。
这不具有可移植性。它试图在序列点之间两次修改变量 a, 而这是无定义的。

例如,有人报告如下代码:

    int a = 123, b = 7654;
    a ^= b ^= a ^= b;

在 SCO 优化 C 编译器 (icc) 下会把 b 置为 123, 把 a 置为 0。

论坛徽章:
0
77 [报告]
发表于 2007-10-10 09:38 |只看该作者
int atoi(char *s)
{
    int i,sign;
    for(i=0,sign=*s=='-'?(s++,-1):1;(*s!='\0')&&((*s>='0')&&*(s<='9'));s++)
         i = i*10 + (*s - '0');
    return (*s=='\0') ? i*sign : printf("Error!");
}

[ 本帖最后由 weiqiboy 于 2007-10-10 09:56 编辑 ]

论坛徽章:
1
技术图书徽章
日期:2014-03-06 15:32:30
78 [报告]
发表于 2007-10-10 09:56 |只看该作者
俺也凑个热闹

a ^= b; b ^= a; a ^= b;
b ^= c; c ^= b; b^= c;



int atoi(const char *str)
{
    if ( *str == '-' ) return - atoi(str + 1);
    int retval = 0;
    for (  ;   (*str <= '9' )   &&   ( *str >= '0' );  str++ )  retval = *str - '0' + retval * 10;
    return retval;
}

论坛徽章:
0
79 [报告]
发表于 2007-10-12 14:39 |只看该作者
int str_to_num( const char *t, int len)
{
  
    int   num =0;

    for( i = 0; i< len && num != -1; i++)
         num = (t[ i ] >= '0' && t[ i ] <='9') ? num * 10 + ( t[ i ] - '0') : ( printf( "data error\n" ), -1);


    printf("%ld\n", num);
    return num;
}

[ 本帖最后由 geba168 于 2007-10-23 17:21 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP