【剑指 offer】第六十五题(不用加减乘除做加法) 和 第六十六题(构建乘积数组)

第六十五题:不用加减乘除做加法

题目:

写一个函数,求两个整数之和,要求在函数体内不得使用“+”、“-”、“*”、“/” 四则运算。

解题程序:

#include<iostream>
#include<stdio.h>
using namespace std;

// 加法运算

int Add(int num1,int num2)
{
    int sum,carry;

    while(num2 != 0)
    {
        sum = num1 ^ num2;
        carry = (num1 & num2) <<1;
        num1 = sum;
        num2 = carry;
    }
    return num1;
}

// 不使用新变量,交换两个变量的值

// 方法一:加减法交换数值

void Swap1(int *num1,int *num2)
{
   *num1 = *num1 + *num2;
    *num2 = *num1 - *num2;
    *num1 = *num1 - *num2;
}

// 方法二: 位运算

void Swap2(int *num1,int *num2)
{
    int a = *num1;
    int b = *num2;

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

    *num1 = a;
    *num2 = b;
}

// 测试用例:

void test()
{
    int num1,num2;
    printf("请输入两个整数:\n");
    scanf("%d%d",&num1,&num2);
    
    int ret = Add(num1,num2);
    
    printf("%d + %d = %d\n",num1,num2,ret);

    Swap1(&num1,&num2);
    printf("交换后的结果是:num1 = %d,num2 = %d\n",num1,num2);
    Swap2(&num1,&num2);
    printf("交换后的结果是:num1 = %d,num2 = %d\n",num1,num2);
}


int main(void)
{
   test();

    return 0;
}

第六十六题:构建乘积数组

题目:

给定一个数组 A[0,1,2,3,..............n-1],请构建一个数组 B[0,1,2,.......n-1],其中 B 中的元素 B[i] = A[0] * A[1] * ......... * A[i-1]*A[i+1]*........*A[n-1]。不能使用除法。

解题程序:

#include<iostream>
#include<vector>
#include<stdio.h>
using namespace std;

void multiply(const vector<int> &array1,vector<int>& array2)
{
    int len1 = array1.size();
    int len2 =array2.size();

    if( len1 == len2 && len2>1 )
    {
        array2[0] = 1;
        for(int i =1 ;i<len1;i++)
        {
            array2[i] = array2[i-1] * array1[i-1];
        }
        
        double temp = 1;
        for(int i=len1-2;i>=0;i--)
        {
           temp *= array1[i+1];
            array2[i] *= temp;
        }

    }

}

// 测试用例

void test()
{
    int input[] = {1,2,3,4,5,6,7};
    int output[] = {0,0,0,0,0,0,0};
    vector<int> v1(input,input+sizeof(input)/sizeof(int));
    vector<int> v2(output,output+sizeof(output)/sizeof(int));
    
    multiply(v1,v2);

    for(vector<int>::iterator it = v2.begin();it != v2.end();++it)
    {
       printf("%d\t",*it); 
    }
    printf("\n");
}

int main(void)
{
    test();
    return 0;
}


猜你喜欢

转载自blog.csdn.net/qq_35396127/article/details/80067247