第六十五题:不用加减乘除做加法
题目:
写一个函数,求两个整数之和,要求在函数体内不得使用“+”、“-”、“*”、“/” 四则运算。
解题程序:
#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;
}