据说是腾讯的面试题:两个数组a[N],b[N],其中A[N]的各个元素值已知,现给b[i]赋值,b[i] = a[0]*a[1]*a[2]...*a[N-1]/a[i];

原题大概是:
两个数组a[N],b[N],其中A[N]的各个元素值已知,现给b[i]赋值,b[i] = a[0]*a[1]*a[2]...*a[N-1]/a[i];
要求:
1.不准用除法运算
2.除了循环计数值,a[N],b[N]外,不准再用其他任何变量(包括局部变量,全局变量等)
3.满足时间复杂度O(n),空间复杂度O(1)

一下是本人自己的一个方法,可能会有什么不对的,或者不是最优的解,有什么好的方法希望大家提出来,一起讨论呀,

以下程序本在ubuntu11.10中使用gcc 4.6.1版本运行通过,测试几组数据没有问题的

//======================================================================
//
//        Copyright (C) 2007-2012三月软件工作室    
//        All rights reserved
//
//        filename :main
//        description :思路:根据提议,我么分别将每一个数所有的结果给你写出来,我们以四个数为例。设这几个数位a,b,c,d
//        b[0]=b*c*d;b[1]=a*c*d;b[2]=a*b*d;b[3]=a*b*c;
//        这样看或许发现不了规律,看下面的图      分开后上三角    下三角
//        b[0]= 1 * b * c * d;             b * c * d    1
//        b[1]= a * 1 * c * d;                 c * d    a
//        b[2]= a * b * 1 * d;                    d    a * b
//        b[3]= a * b * c * 1;                 1    a * b * c
//        发现规律了吧,其实你可一看到这正好是两个三角行,上三角和下三角,上三角的规律是,从0-2,rol是0-2之间的数,
//        b[col]=b[rol-1]*a[rol]; 下三角的规律是1-3,rol是1-3之间的数b[col]=b[col-1]*a[i-1];
//        但是以上是分开的规律,但是如果你先算上三角在算下三角的是后会造成上次的数据,已经被计算到本次结果中。
//        从而造成程序混乱,看是我将第一行出去,让后将b[col-1]上面的规律值放到b[0]中,这样可以用保持规律的值,
//        而不被上一个规律的放到同一个变量中而出现数据错误了,最后在计算一下b[0]的值,很容易就实现了
//        All rights reserved
//
//        created by Renji at  2012-4-11
//        qq:625246906
//        url:http://www.marchsoft.cn/ 
//        
//======================================================================

#include <stdio.h>

#define MAX 100

int main ()
{
    int n =0 ;
    int a[MAX];
    int b[MAX];
    int i;
    scanf("%d",&n);
    for(i=0;i<n;i++)
        scanf("%d",a+i);
    b[n-1]=1;
    b[0]=1;
    //计算上三角
    for(i=n-2;i>0;i--)
        b[i]=a[i+1]*b[i+1];
    //计算下三角
    for(i=1;i<n;i++)
    {
        //保存当前行下三角中的值,并保存你已被下一行使用
        b[0]=b[0]*a[i-1];
        //将本行两部分的值乘倒一起,得到最后结果
        b[i]=b[i]*b[0];
    }
    b[0]=1;
    for(i=1;i<n;i++)
        b[0]=b[0]*a[i];
    for(i=0;i<n;i++)
        printf("%-9d",b[i]);
    printf("\n");
    return 0 ;
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值