前面已经说过了C语言的一些基础知识,具体见C语言基础,,现在来思考一些问题:
首先,第一个问题,如果我要交换两个变量,有哪些方式呢?
当然,你可能会说,这很简单嘛,直接给个中间变量不就行了吗?
例如:a = 7 , b = 3
声明一个中间变量 t,让 t = a ; a = b ; b = t ; 完美解决问题!
的确,这是一个好方法。但是,如果我现在告诉你,不能使用中间变量,你会怎么解决呢?
说到这里,有些小伙伴就开始苦恼了,其实也不是很复杂,我们只需要:
令 a = a + b ; b = a - b ; a = a - b ;看完之后,是不是很简单?
但这都不是重点,我想说的是下面这种方法:
a = 7 , b = 3
a = a^b; // 0111 ^ 0011 = 0100 4
b = b^a; // 0011 ^ 0100 = 0111 7
a = a^b; // 0100 ^ 0111 = 0011 3
上面用到了异或运算,在c语言中,‘ ^ ’表示的异或,而不是平方,异或是两个相同就为0,不同就为1
这三种方法都可以解决两个变量交换问题,主要是前提条件不同。
接下来,说第二个问题,冒泡排序,想必这是学计算机语言的必备题目啊。
冒泡排序的主要思想就是交换位置,例如下面这个例子:
a[10] = { 9 , 3 , 1 , 4 , 6 , 7 , 5 , 2 , 0 , 8 }
第一次的时候是9和3比较,若前面一个数比后面一个数大,则交换位置,所以9和3需要互换位置;
然后,9再与后面一个数比较,若前面一个数比后面一个数大,则交换位置;
以此类推,第一轮的最后结果是9换到了最后面,即{ 3 , 1 , 4 , 6 , 7 , 5 , 2 , 0 , 8 ,9}。
下面的循环体,很显然就是我们之前交换变量所说的第三种方法,它完全等同于:
t = a[i+1]; a[i+1] = a[i]; a[i] = t;
#include
int main()
{
int a[10] = {9,3,1,4,6,7,5,2,0,8};
int i,n = 9;
while(n--){
for(i = 0;i < 9;i++){
if(a[i] > a[i+1]){
a[i]^=a[i+1];
a[i+1]^=a[i];
a[i]^=a[i+1];
}
}
}
for(i = 0;i < 10;i++){
printf("%3d",a[i]);
}
return 0;
}
最后一个问题是,如何去掉重复的字符,例如 “aaaabbbbcccccc” 只输出 “abc”
这个问题的关键是新建一个数组,将原数组的第一位赋值给新数组的第一位,如下面这个例子,将a[0]赋值给b[0],接着,再一次比较,如果数组a里面的值b数组没有,就将其添加到b数组的里,与此同时,下标加1,这就不难理解为什么 j 要++了。
值得一提的是,字符串的最后一位都会有一个默认的 ‘\0’。
#include
int main(){
char a[] = "aaaabbbbccccc",i=0,j=0,b[10]={0};
b[0]=a[0];
while(a[i] != '\0'){
if(a[i] != b[j]){
b[j+1] = a[i];
j++;
}
i++;
}
printf("%s\n",b);
return 0;
}
好了,今天的问题就分享到这了,希望大家能够共同进步!