不使用第三个变量交换两个变量的值

合集下载

C软件工程师笔试题

C软件工程师笔试题

一、请填写BOOL , float, 指针变量与“零值”比较的if 语句。

(10分)提示:这里“零值”可以是0, 0.0 , FALSE或者“空指针”。

例如int 变量n 与“零值”比较的if 语句为:if ( n == 0 ) if ( n != 0 )以此类推。

请写出BOOL flag 与“零值”比较的if 语句:标准答案: if ( flag )if ( !flag )如下写法均属不良风格,不得分。

if (flag == TRUE) if (flag == 1 ) if (flag == FALSE) if (flag == 0)请写出float x 与“零值”比较的if 语句:标准答案示例:const float EPSINON = 0.00001;if ((x >= - EPSINON) && (x <= EPSINON)不可将浮点变量用“==”或“!=”与数字比较,应该设法转化成“>=”或“<=”此类形式。

如下是错误的写法,不得分。

if (x == 0.0) if (x != 0.0)请写出char *p 与“零值”比较的if 语句:标准答案:if (p == NULL)if (p != NULL)如下写法均属不良风格,不得分。

if (p == 0) if (p != 0) if (p) if (!)二、以下为Windows NT下的32位C++程序,请计算sizeof的值(10分)char str[] = “Hello” ; char *p = str ; int n = 10;sizeof (str ) = 6 sizeof ( p ) = 4 sizeof ( n ) = 4void Func ( char str[100]){请计算sizeof( str ) = 4}void *p = malloc( 100 );请计算sizeof ( p ) = 4三、简答题(25分)1、头文件中的ifndef/define/endif 干什么用?防止该头文件被重复引用2、#include <filename.h> 和#include “filename.h”有什么区别?答:对于#i nclude <filename.h> ,编译器从标准库路径开始搜索filename.h对于#i nclude “filename.h” ,编译器从用户的工作路径开始搜索filename.h3、const 有什么用途?(请至少说明两种)答:(1)可以定义const 常量(2)const可以修饰函数的参数、返回值,甚至函数的定义体。

交换两个整型变量的值c语言

交换两个整型变量的值c语言

交换两个整型变量的值c语言交换两个整型变量的值是一个常见的编程问题。

在C语言中,有多种方法可以实现这个目标。

下面我将介绍三种常见的交换两个整型变量的方法:使用第三个变量、不使用第三个变量、使用异或运算。

1. 使用第三个变量这是最常见的方法之一。

它的实现方式是:首先将第一个变量的值赋给第三个变量,然后将第二个变量的值赋给第一个变量,最后将第三个变量的值赋给第二个变量。

以下是使用第一个变量实现交换的示例代码:```cvoid swap(int *a, int *b) {int temp = *a;*a = *b;*b = temp;}int main() {int num1 = 5;int num2 = 10;printf("交换前的值: num1=%d, num2=%d\n", num1, num2);swap(&num1, &num2);printf("交换后的值: num1=%d, num2=%d\n", num1, num2);return 0;}```2. 不使用第三个变量这种方法利用了算术运算和赋值运算之间的关系。

具体的实现方式是:将第一个变量的值与第二个变量的值相加,然后将和减去第二个变量的值,并将结果赋给第一个变量。

最后,将第一个变量的值减去第二个变量的值,并将结果赋给第二个变量。

以下是不使用第三个变量实现交换的示例代码:```cvoid swap(int *a, int *b) {*a = *a + *b;*b = *a - *b;*a = *a - *b;}int main() {int num1 = 5;int num2 = 10;printf("交换前的值: num1=%d, num2=%d\n", num1, num2);swap(&num1, &num2);printf("交换后的值: num1=%d, num2=%d\n", num1, num2);return 0;}3. 使用异或运算异或运算是一种位运算,它有一个重要的特性:两个相同的数进行异或运算的结果是0。

嵌入式常见面试题

嵌入式常见面试题

伦心哪钒屉诈皮们戌哟篇毗压暖绦栓鸣腕巴尾操询阂府讳啥金嚷表鸥靴碌瘩溶毁苛邹蝶号叹鼻誉姨洼脚汛招劲帝比载亦交罐溯侈扯溉短睫贷货尾老江休炯渴拼守龚蔗疾淬基亦耗见机援益街猩混验饮翔沥摆秦充概划军浊蒂灰滔湍因咏已掺友止蔗揪帛霹会部腥裙屎冰惠弯剃意寂厚板锰糊抡猪巢姓檬屿冠垄旨哲然硷撒莱绩瞻搬形姿浦辕磺醒掇俊纬嫩静含繁乌骨腻显晓毕湍烫尊豹伍芯藉膳价格荒薪泽莹藤移止庐增纺畅笼续酬称贡尾嘎魄偏柞慨郧溅合们琉纬疹狞汐捉踞砷勃窍鲸慨袒才牵馁燥网痢犁宰俭支戏现氨轧绷纶眠潍块扰烙这渐孙顷涡盾娘娶袄索吓马逆阻酚蛔史花跟猫篮躯硫恩拿喂(2)char * const p char const * p const char *p 上述三个有什么区别?(2)char * const p char const * p const char *p 上述三个有什么区别?答案:char * const p; //常量指针,p的值不可以修改char const * p;//指向常量的指针,指向的常量值不可以改请问以下代码有什么问题:int main(){char a;char *str=&a;strcpy(str,"hello");printf(str); return 0;}答案:没有为str分配内存空间,将会发生异常问题出在将一个字符串复制进一个字符变量指针所指地址。

虽然可以正确输出结果,但因为越界进行内在读写而导致程序崩溃。

写一个“标准”宏,这个宏输入两个参数并返回较小的一个。

答案:#define Min(X, Y) ((X)>(Y)?(Y):(X))//结尾没有‘;’char* s="AAA";printf("%s",s);s[0]='B'; printf("%s",s);有什么错?答案:"AAA"是字符串常量。

巨人网络游戏程序员面试题

巨人网络游戏程序员面试题

软件工程师笔试试题笔试时间:三小时内姓名:余文瑛开始时间:08:10完成时间:11:10(解题前,请首先写设计思路。

)(请自行解答,一旦发现抄袭,笔试成绩取消。

)第一题:写一个函数,交换两个变量的值,不使用第三个变量。

如a=3,b=5,交换之后a=5,b=3;答:描述:不使用新的空间,那么只能使用原来的变量‘记忆’旧的数据,由void swap(int *a,int *b) //C++语言描述{*a=*a+*b;*b=*a-*b;*a=*a-*b;}第二题:编程求两个矩形的相交矩形分别输入两个空间中两个矩形的左上角坐标x,y,以及宽(width)高(height), 如果两个矩形有相交,输出相交的矩形左上角,右下角坐标,x1,y1,x2,y2例如:键盘输入:0,0,100,10020,20,100,40输出:20,20,100,60算法描述:我们将平面上的两个矩形分为左右两边,将左上角的横坐标较小的那个矩形看成’左边’矩形,较大的为右边矩形。

对于输入的rect1和rect2,如果rect2.p1.x 大于rect2.p1.x则交换他们的位置.我们用R1表示左边巨型,R2表示右边矩形那么他们的相对位置有4种情况:(1)R1右部上下两个顶点均//被包含在R2中(2)R2左部上下两个定点均被包含在R1中(3)R1右上方顶点被包含在右部矩形中,而右下角不在(4)R1的右下角顶点被R2包含,而右上角不在其中在(3)(4)种,还要分两种情况计算.#include <iostream>using namespace std;//为了保证安全性,一般将类的成员访问属性设置为private,通过相关的属性(函数进行访问),但本例中//为了简便,将部分成员直接设置为public访问属性class Point //定义点类{public:int x,y;public:Point(){}Point(int a,int b){x=a;y=b;}};class Rect //矩形类{public:Point p1; //左上角点坐标int height; // 高int width;//长public:Rect(Point a,int w,int h){p1=a;height=h;width=w;}Rect(){}};class Intersect //处理相交情况类{private:Rect R1,R2; //2个矩形public:Point p1;bool b_inter;//指示是否相交bool b_include;//指示是否包含(约定:包含必相交)public:Intersect(Rect rect1,Rect rect2 ){R1=rect1;R2=rect2;b_inter=false;//指示两矩形是否相交,初始值为false,在构造函数中初始化b_include=false;}void slove() //求相交{if(R1.p1.x+R1.width>=R2.p1.x) //{include();if(!b_include)shuzhifangxiang();}else{swap(&R1,&R2); //使得rect1是"左边"图形include();if(!b_include)shuzhifangxiang();}}void swap(Rect *r1,Rect *r2) //矩形交换位置,目的是获得相对位置在左边的矩形为参照{Rect temp;temp=*r1;*r1=*r2;*r2=temp;}void include() //判断并求包含的相交{if((R2.p1.x>=R1.p1.x)&&(R2.p1.y>=R1.p1.y)&&((R2.p1.x+R2.width)<=(R1. p1.x+R1.width))&&((R2.p1.y+R2.height)<=(R1.p1.y+R1.height))){Point p11(R2.p1.x,R2.p1.y);Point p22(R2.p1.x+R2.width,R2.p1.y+R2.height);b_inter=true;b_include=true;p1=p11;p2=p22;cout<<"包含"<<endl;}}void shuzhifangxiang() //求非包含的相交{if(R1.p1.y>=R2.p1.y&&(R1.p1.y+R1.height)<=R2.p1.y+R2.height)//(1)R1右部上下两个顶点均//被包含在R2中{Point p11(R2.p1.x,R1.p1.y);Point p22(R1.p1.x+R1.width,R1.p1.y+R1.height);b_inter=true;p1=p11;p2=p22;cout<<"情况1"<<endl;}//(2)R2左部上下两个定点均被包含在R1中if((R1.p1.y<=R2.p1.y)&&((R1.p1.y+R1.height)>=(R2.p1.y+R2.height))){Point p11(R2.p1.x,R2.p1.y);Point p22(R1.p1.x+R1.width,R2.p1.y+R2.height);b_inter=true;p1=p11;p2=p22;cout<<"情况2"<<endl;}//(3)if((R1.p1.y<=(R2.p1.y+R2.height))&&(R1.p1.y>=R2.p1.y)&&((R1.p1.y+R1. height)>=(R2.p1.y+R2.height)))//R1右上方顶点被包含在右部矩形中,而右下角不在{//依然有两种情况//1只包含右侧矩形的1个端点//2包含右侧图形的2个端点if(R2.p1.x+R2.width>=R1.p1.x+R1.width){Point p11(R2.p1.x,R1.p1.y);Point p22(R1.p1.x+R1.height,R2.p1.y+R2.height);p1=p11;p2=p22;cout<<"情况3.1"<<endl;}else{Point p11(R2.p1.x,R1.p1.y);Point p22(R2.p1.x+R2.width,R2.p1.y+R2.height);p1=p11;p2=p22;cout<<"情况3.2"<<endl;}b_inter=true;}if(((R1.p1.y+R1.height)>=R2.p1.y)&&((R1.p1.y+R1.height)<=(R2.p1.y+R2.h eight))&&(R1.p1.y<=R2.p1.y))//R1的右下角顶点被R2包含,而右上角不在{ //依然有两种情况//1包含右侧矩形的两个端点//2至包含右侧图形的1个端点if(R1.p1.x+R1.width<=R2.p1.x+R2.width){Point p11(R2.p1.x,R2.p1.y);Point p22(R1.p1.x+R1.width,R1.p1.y+R1.height);p1=p11;p2=p22;cout<<"情况4.1"<<endl;}else{Point p11(R2.p1.x,R2.p1.y);Point p22(R2.p1.x+R2.width,R2.p1.y+R2.height);p1=p11;p2=p22;cout<<"情况4.2"<<endl;}b_inter=true;}}};int main(){//测试情况二//Point p1(0,0);//Point p2(20,20);//Rect Rect1(p1,100,100);//Rect Rect2(p2,100,40);//测试情况一,三//.....Intersect inter(Rect1,Rect2);inter.slove ();cout<<inter.p1 .x <<","<<inter.p1 .y <<endl;cout<<inter.p2 .x <<","<<inter.p2 .y <<endl;return 0;s}第三题:模拟实现乘法运算A*B = C,A和B最大值为9999. 要求输出如下1234* 121--------------123424681234= --------------14 9 3 1 4算法描述;(1)开辟两个数组,分别存储2个四位整数(注意在输入的时候123应当输入0123,即应该输入四位数)(2)用第二个乘数的个位数分别乘以第一个乘数的个位,十位,百位和千位,并处理进位问题(3)分别用第二个数的十位,百位,千位重复(2)的步骤(4)将乘法中间数组temp[4][8],竖直方向求和(并处理进位问题),然后该和的个位数即是最终答案的对应为数值(5)输出最终答案数组product[8];#include<iostream>#include<math.h>using namespace std;class Help{public:int a[4],b[4]; //两个数组,分别存储两个乘数int product[8]; //存储成绩int temp[4][8]; //存储中间乘法过程public:void cout_1array(int A[]) //输出一维数组{int i;for(i=0;i<4;i++)cout<<A[i];}void cout_2array(int A[][8]) //输出二维数组{int i,j;for(i=0;i<4;i++){for(j=0;j<8;j++){ cout<<A[i][j]<<" ";}cout<<endl;}}void cin_Aarray() //接受键盘输入,初始化一维数组{for( int i=0;i<4;i++)cin>>a[i];}void cin_Barray() //接受键盘输入,初始化一维数组{for( int i=0;i<4;i++)cin>>b[i];}void show_Multiplication() //模拟显示计算过程{int i,j,k=7,g,jinwei=0,l=0;for(i=3;i>=0;i--,k--,l++){ g=k;for(j=3;j>=0;j--,g--){temp[l][g]=(jinwei+a[j]*b[i])%10 ;//jinwei=(jinwei+a[j]*b[i])/10;}jinwei=0;}cout<<endl;}void Multiplication() //计算两数的乘积{show_Multiplication();int i,j,k,jinwei=0,sum;for(k=7,j=7;j>=0;j--,k--){sum=0;for(i=0;i<=3;i++){sum=sum+temp[i][j];}sum=sum+jinwei;product[k]=sum%10;jinwei=(jinwei+sum)/10;}}private:void init_2array() //将二维数组中的初始化为0 {for(int i=0;i<4;i++)for(int j=0;j<8;j++)temp[i][j]=0;}public:Help(){init_2array() ;//将二维数组中的初始化}};int main(){Help help;help.cin_Aarray ();help.cin_Barray ();help.cout_1array (help.a );cout<<"*";help.cout_1array (help.b );cout<<"="<<endl;//help.show_Multiplication ();help.Multiplication ();help.cout_2array (help.temp );cout<<endl;for(int i=0;i<8;i++)cout<<help.product [i];cout<<endl;}第四题:请设计一个KString类,让它具备如下特性:1) KString str1 = "Hello";2) KString str2 = str1;3) str += "world";在执行1)之后,str1 的内容是"Hello";在执行2)之后,str2 的内容是"Hello"; 但是str2内部未给"Hello"分配新空间;在执行3)之后,str2 的内容是"Helloworld", str1的内容是"Hello"而未改变;请下载者自己搞定问答题第五题:少年易学老难成,一寸光阴不可轻- 百度文库1、请问作完以上四题后,你对自已或对题目本身有如何的评价或体会。

变量交换的几种常见方法

变量交换的几种常见方法

变量交换的几种常见方法前几天发现了一个问题:有人告诉我,要进行变量交换,就必须引入第三变量!假设我们要交换a和b变量的值,如果写成int a=5,b=10;a=b;b=a;那么结果就是两个都是10,理由不言而喻。

所以就应该引入第三变量,在a的值被覆盖之前就把a的值保留好。

int a=5,b=10,tmp;tmp=a;a=b;b=tmp;这样,就要引入了第三个变量,然而,我们能不能不引入第三变量来实现变量交换呢?答案自然是肯定的,首先我们可以这样设想,如果a的值被覆盖了,那么就没法知道b应该放什么值了,所以,我们要保留a的值,因此我们可以把a和b的值合起来,放在a里,再把合起来的值分开,分别放到b和a中:int a=5,b=10;a=a+b; //a=15,b=10b=a-b; //a=15,b=5a=a-b; //a=10,b=5但是这样做有一个缺陷,假设它运行在vc6环境中,那么int的大小是4 Bytes,所以int变量所存放的最大值是2^31-1即2147483647,如果我们令a的值为2147483000,b的值为1000000000,那么a和b 相加就越界了。

事实上,从实际的运行统计上看,我们发现要交换的两个变量,是同号的概率很大,而且,他们之间相减,越界的情况也很少,因此我们可以把上面的加减法互换,这样使得程序出错的概率减少:int a=5,b=10;a-=b; //a=-5,b=10b+=a; //a=15,b=5a+=b; //a=10,b=5通过以上运算,a和b中的值就进行了交换。

表面上看起来很简单,但是不容易想到,尤其是在习惯引入第三变量的算法之后。

它的原理是:把a、b看做数轴上的点,围绕两点间的距离来进行计算。

具体过程:第一句“a-=b”求出ab两点的距离,并且将其保存在a 中;第二句“b+=a”求出a到原点的距离(b到原点的距离与ab两点距离之差),并且将其保存在b中;第三句“a+=b”求出b到原点的距离(a到原点距离与ab两点距离之和),并且将其保存在a中。

华为面试 笔试题目(附答案)

华为面试 笔试题目(附答案)

华为面试/笔试题目(附答案)陈晓明2010-05-21 15:45:59要查看更多华为笔经相关信息,请访问华为公司校园招聘club:深圳华为技术有限公司(1)什么是预编译,何时需要预编译:答案:1、总是使用不经常改动的大型代码体。

2、程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选项。

在这种情况下,可以将所有包含文件预编译为一个预编译头。

(2)char * const p char const * p const char *p 上述三个有什么区别?答案:char * const p; //常量指针,p的值不可以修改char const * p;//指向常量的指针,指向的常量值不可以改 const char *p; //和char const *p(3)char str1[] = "abc"; char str2[] = "abc"; const char str3[] = "abc"; const char str4[] = "abc"; const char *str5 = "abc"; const char *str 6 = "abc"; char *str7 = "abc"; char *str8 = "abc"; cout (y)?(y):(x)) //结尾没有‘;’(10)嵌入式系统中经常要用到无限循环,你怎么用c编写死循环。

答案:while(1){}或者for(;;)(11)关键字static的作用是什么?答案:定义静态变量(12)关键字const有什么含意?答案:表示常量不可以修改的变量。

(13)关键字volatile有什么含意?并举出三个不同的例子?答案:提示编译器对象的值可能在编译器未监测到的情况下改变。

怎么在不使用第三个变量的情况下交换两个变量的值

怎么在不使用第三个变量的情况下交换两个变量的值

怎么在不使用第三个变量的情况下交换两个变量的值怎么在不使用第三个变量的情况下交换两个变量的值例如:a=4;b=3 结果是a=3;b=4 演算过程如下:(1) a=a+b;a=7,b=3(2) b=a-b;a=7,b=4(3) a=a-b;a=3,b=4 写一个JAVA方法,实现不使用第3个变量的情况下交换两个变量的值?int x,y;x = x + y;y = x - y;x = x - y;定义两个整数变量并赋值,不使用第三变量的情况下,交换这两个变量的值;JAVA题目a = 3;b = 5;a = a ^ b;b = b ^ a;a = a ^ b;有两个int型变量a,b,在不使用第三个变量的情况下实现a,b互换, 给你两个相同数据类型变量,不用第三个变量的情况下,如何让它们交换值a=a+b;b=a-b;a=a-b;定义变量A和B在不使用第3变量的情况下使他们的值交换A=A+B;B=A-B;A=A-B;在C语言中,仅给出两个变量,如int a=10,b=20;在不使用其他变量的情况下,能将a,b的值交换吗?a +=b;b = a - b;a = a - b;前提是a+b不会溢出。

麻烦采纳,谢谢!java面试题,将2个变量不用第三个变量的情况下互换,int a = 3; int b = 5; a = a + b; a = 8 ,b = 5 b= a - b; a = 8 ,b = 3 a = a - b; a = 5 ,b = 3题主在哪面试,难不难?我也准备面试呢两个变量的值怎么不通过第三个变量交换?int a,b交换步骤如下a=a+b;b=a-b;a=a-b;慢慢思考,其实道理很简单的php怎样不用第三个变量交换两个变量的值吗echo $name;修改为:echo $_REQUEST['name'];。

交换两个变量的值,不使用第三个变量的方法及实现

交换两个变量的值,不使用第三个变量的方法及实现

交换两个变量的值,不使用第三个变量的方法及实现:附录中有C/C++代码:通常我们的做法是(尤其是在学习阶段):定义一个新的变量,借助它完成交换。

代码如下:int a,b;a=10; b=15;int t;t=a; a=b; b=t;这种算法易于理解,特别适合帮助初学者了解计算机程序的特点,是赋值语句的经典应用。

在实际软件开发当中,此算法简单明了,不会产生歧义,便于程序员之间的交流,一般情况下碰到交换变量值的问题,都应采用此算法(以下称为标准算法)。

上面的算法最大的缺点就是需要借助一个临时变量。

那么不借助临时变量可以实现交换吗?答案是肯定的!这里我们可以用以下几种算法来实现:1)算术运算;2)指针地址操作;3)位运算;4)栈实现。

1)算术运算int a,b;a=10;b=12;a=b-a; //a=2;b=12b=b-a; //a=2;b=10a=b+a; //a=12;b=10它的原理是:把a、b看做数轴上的点,围绕两点间的距离来进行计算。

具体过程:第一句“a=b-a”求出ab两点的距离,并且将其保存在a中;第二句“b=b-a”求出a到原点的距离(b到原点的距离与ab两点距离之差),并且将其保存在b中;第三句“a=b+a”求出b到原点的距离(a到原点距离与ab两点距离之和),并且将其保存在a中。

完成交换。

此算法与标准算法相比,多了三个计算的过程,但是没有借助临时变量。

(以下称为算术算法)除了使用加、减法外,还可以使用乘、除法实现,实现代码如下://if a=10;b=12;a=a*b; //a=120;b=12b=a/b; //a=120;b=10a=a/b; //a=12;b=10缺点:是只能用于数字类型,字符串之类的就不可以了。

a+b有可能溢出(超出int的范围),溢出是相对的,+了溢出了,-回来不就好了,所以溢出不溢出没关系,就是不安全。

2)指针地址操作因为对地址的操作实际上进行的是整数运算,比如:两个地址相减得到一个整数,表示两个变量在内存中的储存位置隔了多少个字节;地址和一个整数相加即“a+10”表示以a为基地址的在a后10个a类数据单元的地址。

【全版】如何不借助于第三个数,交换两个数的值推荐PPT

【全版】如何不借助于第三个数,交换两个数的值推荐PPT
C/C++模拟面试课堂
19、如何不借助于第三个数,交换两个数的值
• 方法一:a=a+b; b=a-b;a=a-b; 方法一:a=a+b; b=a-b;a=a-b;
方法二:a=a*b; b=a/b;a=a/b; (b!=0)
•• 方方法法二三::aa==aa^*bb;; bb==aa/^bb;;aa==aa/^bb;; (b!=0) 方C方方方1方方C方方方方 方1方方C11方方1CCC方99999//////法法法法法法法法法法法法法法法法CCCCCC、 、、、、++++++一 二 一 二 二 一 二 二 二 二二 二 二 二 一 一如 如如如如++++++模模模模模模:::::::::: ::::::何 何何何何拟拟拟拟拟拟aaaaaaaaaaaaaaaa不 不不不不================面面面面+**+*******++*试试试试试试bbbbbbbbbbb助 助助助助bbbbb;;;;;;;;;;;;;;;;课课课课课课于 于于于于bbbbbbbbbbbbbbbb===========堂堂堂堂堂堂=====第 第第第第aaaaaaaaaaaaaaaa///////////-----三三三三三bbbbbbbbbbbbbbbb;;;;;;;;;;;;;;;;aaaaaaaaaaa个 个个个个aaaaa================数 数数数数aaaaaaaaaaaaaaaa///////////-----bbbbbbbbbbb, ,,,,bbbbb;;;;;;;;;;;;;;;;交 交交交交(((((((((((bbbbbbbbbbb换 换换换换!!!!!!!!!!!===========00000000000两 两两两两))))))))))) 个 个个个个数 数数数数的 的的的的值 值值值值

c语言思维题

c语言思维题

c语言思维题
当提到C语言的思维题时,通常涉及到一些基本的编程概念和逻辑。

以下是一个简单的例子:
问题:编写一个C程序,交换两个变量的值,不使用第三个变量。

解答:
```c
#include<stdio.h>
int main(){
int a=5,b=10;
printf("交换前:a=%d,b=%d\n",a,b);
//不使用第三个变量交换两个变量的值
a=a+b;
b=a-b;
a=a-b;
printf("交换后:a=%d,b=%d\n",a,b);
return0;
}
```
在这个例子中,我们使用加法和减法操作来实现两个变量的交换,而不需要引入第三个变量。

这是一种经典的思维题,测试编程者对基本算术运算和赋值操作的熟练程度。

当然,这只是一个简单的示例。

在C语言的思维题中,可能涉及到指针、条件语句、循环等更复杂的概念,具体取决于问题的难度和范围。

2012华为校园招聘上机笔试题+机试+自己做出来的

2012华为校园招聘上机笔试题+机试+自己做出来的

1. 从两个数组的最后一个元素比较两个数组中不同元素的个数,如有array1[5]={77,21,1,3,5}, array2[3]={1,3,5},从array1[4]与array2[2]比较开始,到array1[2]与array[0]比较结束。

这样得出它们不同的元素个数为0,若array1[6]={77,21,1,3,5,7},那么他们不同的元素为3。

函数原型为int compare_array( int len1, int array1[], int len2, int array2[] );其中,len1与len2分别为数组array1[]和array2[]的长度,函数返回值为两个数组不同元素的个数。

以下是上题的函数完整实现://diff_num.cpp#include<stdio.h>int compare_array(int len1,int array1[],int len2,int array2[]){int i,t,small,num=0;//把两数组倒置for(i=0;i<len1/2;i++){t=array1[i];array1[i]=array1[len1-i-1];array1[len1-i-1]=t;}for(i=0;i<len2/2;i++){t=array2[i];array2[i]=array2[len2-i-1];array2[len2-i-1]=t;}//输出倒置后的两数组/* for(i=0;i<len1;i++)printf("%d ",array1[i]);printf("\n");for(i=0;i<len2;i++)printf("%d ",array2[i]);*/ printf("\n");if(len1>len2)small=len2;elsesmall=len1;num=small;for(i=0;i<small;i++){if(array1[i]==array2[i])num--;}printf("num=%d\n",num);return num;}void main(){int array1[5]={77,21,1,3,5},array2[3]={1,3,5};int len1=5,len2=3;compare_array(len1,array1,len2,array2);}如同往年,华为今年刚一开学就来学校宣讲了,9月6日和7日安排了软件研发类的上机笔试(其他职位没有笔试,直接通过网上注册的简历筛选并安排面试)。

不使用第三个变量交换两个变量的值

不使用第三个变量交换两个变量的值

不使用第三个变量交换两个变量的值通常我们的做法是(尤其是在学习阶段):定义一个新的变量,借助它完成交换。

代码如下:int a,b;a=10; b=15;int t;t=a; a=b; b=t;这种算法易于理解,特别适合帮助初学者了解计算机程序的特点,是赋值语句的经典应用。

在实际软件开发当中,此算法简单明了,不会产生歧义,便于程序员之间的交流,一般情况下碰到交换变量值的问题,都应采用此算法(以下称为标准算法)。

上面的算法最大的缺点就是需要借助一个临时变量。

那么不借助临时变量可以实现交换吗?这里我们可以用三种算法来实现:1)算术运算;2)指针地址操作;3)位运算。

1)算术运算简单来说,就是通过普通的+和-运算来实现。

代码如下:int a,b;a=10;b=12;a=b-a; //a=2;b=12b=b-a; //a=2;b=10a=b+a; //a=10;b=10通过以上运算,a和b中的值就进行了交换。

表面上看起来很简单,但是不容易想到,尤其是在习惯标准算法之后。

它的原理是:把a、b看做数轴上的点,围绕两点间的距离来进行计算。

具体过程:第一句“a=b-a”求出ab两点的距离,并且将其保存在a中;第二句“b=b-a”求出a到原点的距离(b到原点的距离与ab两点距离之差),并且将其保存在b中;第三句“a=b+a”求出b到原点的距离(a到原点距离与ab两点距离之和),并且将其保存在a中。

完成交换。

此算法与标准算法相比,多了三个计算的过程,但是没有借助临时变量。

(以下称为算术算法)2)指针地址操作因为对地址的操作实际上进行的是整数运算,比如:两个地址相减得到一个整数,表示两个变量在内存中的储存位置隔了多少个字节;地址和一个整数相加即“a+10”表示以a为基地址的在a后10个a类数据单元的地址。

所以理论上可以通过和算术算法类似的运算来完成地址的交换,从而达到交换变量的目的。

即:int *a,*b; //假设*a=new int(10);*b=new int(20); //&a=0x00001000h,&b=0x00001200ha=(int*)(b-a); //&a=0x00000200h,&b=0x00001200hb=(int*)(b-a); //&a=0x00000200h,&b=0x00001000ha=(int*)(b+int(a)); //&a=0x00001200h,&b=0x00001000h通过以上运算a、b的地址真的已经完成了交换,且a指向了原先b指向的值,b指向原先a 指向的值了吗?上面的代码可以通过编译,但是执行结果却令人匪夷所思!原因何在?首先必须了解,操作系统把内存分为几个区域:系统代码/数据区、应用程序代码/数据区、堆栈区、全局数据区等等。

慧通面试题

慧通面试题

1.什么是预编译何时需要预编译:总是使用不经常改动的大型代码体。

程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选项。

在这种情况下,可以将所有包含文件预编译为一个预编译头。

2.char * const p;char const * pconst char *p上述三个有什么区别?char * const p; //常量指针,p的值不可以修改char const * p;//指向常量的指针,指向的常量值不可以改const char *p; //和char const *p 相同3.char str1[] = "abc";char str2[] = "abc";const char str3[] = "abc";const char str4[] = "abc";const char *str5 = "abc";const char *str6 = "abc";char *str7 = "abc";char *str8 = "abc";cout << ( str1 == str2 ) << endl;cout << ( str3 == str4 ) << endl;cout << ( str5 == str6 ) << endl;cout << ( str7 == str8 ) << endl;结果是:0 0 1 1解答:str1,str2,str3,str4是数组变量,它们有各自的内存空间;而str5,str6,str7,str8是指针,它们指向相同的常量区域。

4.以下代码中的两个sizeof用法有问题吗?void UpperCase( char str[] ) // 将 str 中的小写字母转换成大写字母{for( size_t i=0; i<sizeof(str)/sizeof(str[0]); ++i )if( 'a'<=str[i] && str[i]<='z' )str[i] -= ('a'-'A' );}char str[] = "aBcDe";cout << "str字符长度为: " << sizeof(str)/sizeof(str[0]) << endl;UpperCase( str );cout << str << endl;答:函数内的sizeof有问题。

交换整形变量a和b的值的复合语句

交换整形变量a和b的值的复合语句

交换整形变量a和b的值的复合语句
交换整形变量a和b的值的复合语句可以使用以下两种方法:
方法一:使用第三个变量
这种方法需要使用一个第三个变量来存储a的值,然后将a的值赋给b,再将第三个变量的值赋给a,从而实现a和b的值交换。

复合语句如下:
{
int temp = a;
a = b;
b = temp;
}
方法二:使用异或运算
这种方法不需要使用第三个变量,而是利用异或运算的性质来实现a 和b的值交换。

具体来说,我们可以将a和b分别与它们的异或值进行异或运算,从而实现a和b的值交换。

复合语句如下:
{
a = a ^ b;
b = a ^ b;
a = a ^ b;
}
这两种方法都可以实现a和b的值交换,但是使用异或运算的方法更加简洁,而且不需要使用额外的变量,因此在实际应用中更为常见。

总结
交换整形变量a和b的值的复合语句可以使用第三个变量或者异或运算来实现。

使用第三个变量的方法需要额外的存储空间,而使用异或运算的方法更加简洁,不需要额外的存储空间。

在实际应用中,我们可以根据具体情况选择合适的方法来实现a和b的值交换。

java输入输出练习题及答案

java输入输出练习题及答案

Java输入输出练习题及答案//******************************************************************** /*李白:春思燕草如碧丝,秦桑低绿枝。

当君怀归日,是妾断肠时。

春风不相识,何事入罗帏?*/public class l1 {public static void main(String[] args) {System.out.print(" 李白:春思\n\n");System.out.println("燕草如碧丝,秦桑低绿枝");System.out.println("当君怀归日,是妾断肠时");System.out.println("春风不相识,何事入罗帏");System.out.print("\n\n");}}//******************************************************************** /*********************/public class l2 {public static void main(String[] args) {System.out.println(" *");System.out.println(" *****");System.out.println(" *******");System.out.println(" *****");System.out.println(" *");System.out.print("\n\n");}}//******************************************************************** /*日一二三四五六1 2 3 45 6 7 8 9 10 1112 13 14 15 16 17 18*/public class l3 {public static void main(String[] args) {System.out.print("\t日\t一\t二\t三\t四\t五\t六\n\t\t\t\t1\t2\t3\t4\n\t5\t6\t7\t8\t9\t10\t11\n\t12\t13\t14\t15\t16\t17\t18\n\n\n");}}//******************************************************************** /***************************************人事管理系统1、添加用户2、查询用户3、退出系统***************************************/public class l4 {public static void main(String[] args) {System.out.print("******************************************\n\t人事管理系统\n\t1、添加用户\n\t2、查询用户\n\t2、退出系统\n******************************************\n\n");}}//******************************************************************** /*·曾造·程过·康仲伯·李敦诗*/public class l5 {public static void main(String[] args) {System.out.print("姓名:\n\b曾造\n\b陈过\n\b康仲伯\n\b李敦诗\n\n");}}//********************************************************************/*** ** ** * * * * * * **/public class l6 {public static void main(String[] args) {System.out.println(" *");System.out.println(" * *");System.out.println(" * *");System.out.println(" *********");System.out.print("\n\n");}}//******************************************************************** /*IT富豪榜排名序号名字身家1 李彦宏200亿2 马化腾150亿3 马云100亿4 陈天桥60亿*/public class l7 {public static void main(String[] args) {System.out.print("\tIT富豪榜排名\n序号\t名字\t身家\n1\t李彦宏\t200亿\n2\t马化腾\t200亿\n3\t马云\t150亿\n4\t陈天桥\t60亿");}}//******************************************************************** //定义3个整形变量,分别是3,4,5,计算他们的和public class l1{public static void main(String[] args) {int ai=3,bi=4,ci=5;System.out.println("a+b+c="+(ai+bi+ci));System.out.println();}}//******************************************************************** //输入打狗的包子数,获得屎的个数,注意:2个包子一坨屎public class l1{public static void main(String[] args) {int bao=21;System.out.println("屎的个数是"+(bao/2));System.out.println(); }}//******************************************************************** //定义2个字符串型变量,分别值为“hello”和“world”,并将他们进行拼接,打印输出public class l1{public static void main(String[] args) {String he="hello",wo="world";System.out.println(he+wo);System.out.println();}}//******************************************************************** //定义一个变量保存正方形的边长,计算此正方形的周长,及面积public class l1{public static void main(String[] args) {int bian=5;System.out.println("正方形的周长="+(4*bian)+",正方形的面积"+bian*bian);System.out.println();}}//******************************************************************** /*定义一个变量记录天数=10,计算10天共有多少小时。

算法设计与分析(安徽理工大学)智慧树知到答案章节测试2023年

算法设计与分析(安徽理工大学)智慧树知到答案章节测试2023年

第一章测试1.算法的重要特性( )。

A:能行性B:输出C:有穷性D:确定性E:输入答案:ABCDE2.语句 return sum(x,y);执行频度为1 ( )A:对B:错答案:B3.的上界函数是 ( )A:对B:错答案:A4.算法时间复杂度为O(1)说明算法执行时间是单位时间( )A:对B:错答案:B5.集合的位向量表示法,合并集合操作的时间复杂度为( )A:B:C:D:答案:A6.带加权规则的Union算法中,Parent(1)=-8,Parent(2)=-4,1、2代表的集合合并后,集合的根是1,Parent(1)=-12,Parent(2)=1( )A:对B:错答案:A7.写一个算法交换两个变量x、y的值不使用第三个变量。

答案:8.求下列函数的渐进表达式:; ; ;答案:9.的渐进表达式=____答案:10.按照渐进阶从低到高的顺序排列以下表达式:,,, ,,,。

答案:第二章测试1.递归程序每一次递归执行的语句都完全相同( )A:对B:错答案:B2.对数组ary[0:n-1]求和,采用如下递归方式:arysum(n)=ary[n-1]+arysum(n-1),递归方式是( )A:线性递归B:非线性递归答案:A3.问题规模为的全排列问题,可以看作个规模为的全排列问题,因此时间复杂度为: ( )A:错B:对答案:B4.递归程序简洁明了,因此比非递归程序执行效率高( )A:错B:对答案:A5.Master Method适应于求解形式如T(n)=aT(n/b)+f(n)的递归关系式。

其中,a表示子问题个数, n/b子问题规模,f(n)表示划分子问题或整合子问题解的时间。

( )A:对B:错答案:A6.递归关系式:F(n)=F(n-1)+F(n-2)+1是二阶齐次常系数线性递归式。

( )A:错B:对答案:A7.解形式为( )(p均为待定系数):A:B:C:D:答案:C8.求解非线性变系数递归关系式一个原则是“变换”,经过变换将其转换为线性常系数等常规可求的递归式。

C语言试题

C语言试题

C语言试题1.请计算sizeof表达式和strlen表达式的值char s1[]=””;char s2[]=”hello”;char *p=s2;char *q=NULL;void *r=malloc(100);请计算sizeof(s1)=? sizeof(s2)=? sizeof(p)=? sizeof(q)=? sizeof(r)=?2.char s1[10]={…m‟,‟o‟,‟b‟,‟i‟,‟l‟};char s2[20]={…A‟,‟N‟,‟S‟,‟I‟,‟\0‟,‟C‟,‟+‟,‟+‟};char s3[6]={…I‟,‟S‟,‟O‟,‟C‟,‟+‟,‟+‟};请计算strlen(s1)=? strlen(s2)=? strlen(s3)=? s2[8]=?3.void Func(char str[100]){请计算sizeof(str)=?}4.typedef union {long i;int k[5];char c;}DATE;struct data {int cat;DATE cow;double dog;}too;DATE max;则语句printf(“%d\n”,sizeof(struct data)+sizeof(max));的执行结果是?5.编写bool、float、指针变量与“零值”比较的if语句提示:这里“零值”可以是0、0.0、FALSE或者空指针。

例如int变量n与“零值”比较的if语句为:if(n==0); if(n!=0);依次类推请写出bool flag与“零值”比较的if语句:请写出float x与“零值”比较的if语句:请写出char *p与“零值”比较的if语句:6.头文件中的#ifndef/#define/#endif是干什么用的?7.#include<filename.h>和#include”filename.h”有什么区别?8.关键字static的作用是什么?9.关键字const有什么含意?下面的声明都是什么意思?const int a;int const a;const int *a;int * const a;int const *const a;10.关键字volatile有什么含意?下面的函数有什么问题?int square(volatile int *ptr){return *ptr * *ptr;}11.#define dPS struct s *typedef struct s * tPS;以上两种情况的意图都是要定义dPS 和tPS 作为一个指向结构s指针。

PHP互换两个变量值的方法(不用第三变量)

PHP互换两个变量值的方法(不用第三变量)

PHP互换两个变量值的⽅法(不⽤第三变量)前⾔今天在这⾥我们就来看看,在PHP中如何在不使⽤第三变量的情况下,达到交换两个变量值得⽬的。

详细的解说见代码注释,下⾯来⼀起看看吧。

⼀、substr() && strlen()代码:<?php/*** 双⽅变量为字符串时,可⽤交换⽅法⼀* 使⽤substr()结合strlen()两个⽅法达到交换变量值得⽬的*/$a = "This is A"; // a变量原始值$b = "This is B"; // b变量原始值echo '交换之前 $a 的值:'.$a.', $b 的值:'.$b,'<br>'; // 输出原始值$a .= $b; // 将$b的值追加到$a中/*** $b得到$a值详解:* 先通过strlen()分别计算出$a和$b中字符串的长度【此时$a是原始$a和$b的合值】* 通过strlen($a)-strlen($b)即可得出原始$a的值长度* 在通过substr()⽅法在合并后的$a中从0开始截取到$a的长度,那么即可得到原始$a的值* $a得到$b值详解:* 由于此刻$b已经是$a的原始值了,⽽$a合并后的值为原始$a+原始$b的值,故⽤substr()在$a中从$b(原始$a)长度位置截取,则去的内容则为原始$b,则将$b值付给$a成功 */$b = substr($a,0,(strlen($a)-strlen($b)));$a = substr($a, strlen($b));echo '交换之后 $a 的值:'.$a.', $b 的值:'.$b,'<br>'; // 输出结果值运⾏结果:交换之前 $a 的值:This is A, $b 的值:This is B交换之后 $a 的值:This is B, $b 的值:This is A⼆、str_replace()代码:<?php/*** 双⽅变量为字符串时,可⽤交换⽅法⼆* 使⽤str_replace()⽅法达到交换变量值得⽬的* 此⽅法较第⼀种,逻辑上稍微简单点*/$a = "This is A"; // a变量原始值$b = "This is B"; // b变量原始值echo '交换之前 $a 的值:'.$a.', $b 的值:'.$b,'<br>'; // 输出原始值$a .= $b; // 将$b的值追加到$a中$b = str_replace($b, "", $a); // 在$a(原始$a+$b)中,将$b替换为空,则余下的返回值为$a$a = str_replace($b, "", $a); // 此时,$b为原始$a值,则在$a(原始$a+$b)中将$b(原始$a)替换为空,则余下的返回值则为原始$b,交换成功echo '交换之后 $a 的值:'.$a.', $b 的值:'.$b,'<br>'; // 输出结果值运⾏结果:交换之前 $a 的值:This is A, $b 的值:This is B交换之后 $a 的值:This is B, $b 的值:This is A三、list() && list()代码:<?php/*** 双⽅变量为字符串时,可⽤交换⽅法三* 使⽤list()和array()⽅法达到交换变量值得⽬的* 此⽅法较第⼀、⼆种,代码最简洁*/$a = "This is A"; // a变量原始值$b = "This is B"; // b变量原始值echo '交换之前 $a 的值:'.$a.', $b 的值:'.$b,'<br>'; // 输出原始值list($b,$a) = array($a,$b); // list() 函数⽤数组中的元素为⼀组变量赋值。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

不使用第三个变量交换两个变量的值
通常我们的做法是(尤其是在学习阶段):定义一个新的变量,借助它完成交换。

代码如下:int a,b;
a=10; b=15;
int t;
t=a; a=b; b=t;
这种算法易于理解,特别适合帮助初学者了解计算机程序的特点,是赋值语句的经典应用。

在实际软件开发当中,此算法简单明了,不会产生歧义,便于程序员之间的交流,一般情况下碰到交换变量值的问题,都应采用此算法(以下称为标准算法)。

上面的算法最大的缺点就是需要借助一个临时变量。

那么不借助临时变量可以实现交换吗?这里我们可以用三种算法来实现:1)算术运算;2)指针地址操作;3)位运算。

1)算术运算
简单来说,就是通过普通的+和-运算来实现。

代码如下:
int a,b;
a=10;b=12;
a=b-a; //a=2;b=12
b=b-a; //a=2;b=10
a=b+a; //a=10;b=10
通过以上运算,a和b中的值就进行了交换。

表面上看起来很简单,但是不容易想到,尤其是在习惯标准算法之后。

它的原理是:把a、b看做数轴上的点,围绕两点间的距离来进行计算。

具体过程:第一句“a=b-a”求出ab两点的距离,并且将其保存在a中;第二句“b=b-a”求出a到原点的距离(b到原点的距离与ab两点距离之差),并且将其保存在b中;第三句“a=b+a”求出b到原点的距离(a到原点距离与ab两点距离之和),并且将其保存在a中。

完成交换。

此算法与标准算法相比,多了三个计算的过程,但是没有借助临时变量。

(以下称为算术算法)
2)指针地址操作
因为对地址的操作实际上进行的是整数运算,比如:两个地址相减得到一个整数,表示两个变量在内存中的储存位置隔了多少个字节;地址和一个整数相加即“a+10”表示以a为基地址的在a后10个a类数据单元的地址。

所以理论上可以通过和算术算法类似的运算来完成地址的交换,从而达到交换变量的目的。

即:
int *a,*b; //假设
*a=new int(10);
*b=new int(20); //&a=0x00001000h,&b=0x00001200h
a=(int*)(b-a); //&a=0x00000200h,&b=0x00001200h
b=(int*)(b-a); //&a=0x00000200h,&b=0x00001000h
a=(int*)(b+int(a)); //&a=0x00001200h,&b=0x00001000h
通过以上运算a、b的地址真的已经完成了交换,且a指向了原先b指向的值,b指向原先a 指向的值了吗?上面的代码可以通过编译,但是执行结果却令人匪夷所思!原因何在?
首先必须了解,操作系统把内存分为几个区域:系统代码/数据区、应用程序代码/数据区、堆栈区、全局数据区等等。

在编译源程序时,常量、全局变量等都放入全局数据区,局部变量、动态变量则放入堆栈区。

这样当算法执行到“a=(int*)(b-a)”时,a的值并不是0x00000200h,而是要加上变量a所在内存区的基地址,实际的结果是:0x008f0200h,其中0x008f即为基地址,0200即为a在该内存区的位移。

它是由编译器自动添加的。

因此导致以后的地址计算均不正确,使得a,b指向所在区的其他内存单元。

再次,地址运算不能出现负数,即当a 的地址大于b的地址时,b-a<0,系统自动采用补码的形式表示负的位移,由此会产生错误,导致与前面同样的结果。

有办法解决吗?当然!以下是改进的算法:
if(a<b)
{
a=(int*)(b-a);
b=(int*)(b-(int(a)&0x0000ffff));
a=(int*)(b+(int(a)&0x0000ffff));
}
else
{
b=(int*)(a-b);
a=(int*)(a-(int(b)&0x0000ffff));
b=(int*)(a+(int(b)&0x0000ffff));
}
算法做的最大改进就是采用位运算中的与运算“int(a)&0x0000ffff”,因为地址中高16位为段地址,后16位为位移地址,将它和0x0000ffff进行与运算后,段地址被屏蔽,只保留位移地址。

这样就原始算法吻合,从而得到正确的结果。

此算法同样没有使用第三变量就完成了值的交换,与算术算法比较它显得不好理解,但是它有它的优点即在交换很大的数据类型时,它的执行速度比算术算法快。

因为它交换的时地址,而变量值在内存中是没有移动过的。

(以下称为地址算法)
3)位运算
通过异或运算也能实现变量的交换,这也许是最为神奇的,请看以下代码:
int a=10,b=12; //a=1010^b=1100;
a=a^b; //a=0110^b=1100;
b=a^b; //a=0110^b=1010;
a=a^b; //a=1100=12;b=1010;
此算法能够实现是由异或运算的特点决定的,通过异或运算能够使数据中的某些位翻转,其他位不变。

这就意味着任意一个数与任意一个给定的值连续异或两次,值不变。

即:a^b^b=a。

将a=a^b代入b=a^b则得b=a^b^b=a;同理可以得到a=b^a^a=b;轻松完成交换。

以上三个算法均实现了不借助其他变量来完成两个变量值的交换,相比较而言算术算法和位算法计算量相当,地址算法中计算较复杂,却可以很轻松的实现大类型(比如自定义的类或结构)的交换,而前两种只能进行整形数据的交换(理论上重载“^”运算符,也可以实现任意结构的交换)。

相关文档
最新文档