接着上次内容继续总结 部分简单 C入门 简单的写一下自己先阶段的看法与总结经验
1. 给定两个整形变量的值,将两个值的内容进行交换。
这道题是我在学习过程中发现的一个很有意思的题目拿出来简单的总结一下
推理过程:目前摆在我们面前有两个值需要交换位置,在现实中我们直接交换可是在计算机中没有人这样的交换中介,所以我们创造一个中介。我把它称之为“空瓶子交换”,我们创造一个空瓶子 把A瓶子倒进空瓶子再把B导入A然后将空瓶子导入B
scanf("%d %d", &x, &y);
printf("交换前 %d %d\n", x, y);
temp = x;
x = y;
y = temp;
printf("交换后 %d %d\n", x, y);
提问!我们能不能不通过创建总结来交换
经过我现阶段的思考以我现在的能力只想到这一种方法利用运算
简单的来说就是两个数字 a,b 我们利用计算机组成的特性
a=a+b; //在这里我们利用a+b并赋值给原有的a 举了例子 a=1,b=2 此时 a(新)=1+2=3
b=a=b //又把a作为新的运算 a-b赋值给新的 b b(新)=a(新)-b 1=3-2
a=a-b; // a(新)-b(新)=a(更新) 3-1=2
这样一系列运算就完成了交换
```
scanf("%d %d", &a, &b);
printf("交换前 %d %d\n", a, b);
a = a + b;
printf("交换中ab %d %d\n", a, b);
b = a - b;
printf("交换中ab %d %d\n", a, b);
a = a - b;
printf("交换后 %d %d\n", a, b);
我是这样想的: 在计算机中 a=a+b; 其实计算机已经另外创建了一个新的空间还是a,然后将a+b的值存进新的空间,简单的来说就是我们了合理的利用了计算机的计算原理,为我们创建了一个“空瓶子”
补充一个我么有想得到的方法:
x=x^y;
y=x^y;
x=x^y;
注意!后面种方法避免超过字符串的长度!!!
2.求10 个整数中最大值。 3.求10 个整数中最大值。
这道题目前我可以使用冒泡排序的办法,随机生成一个10个元素的数组,然后利用每个元素与之后的元素一一比较按照从到小的顺序交换。
printf("10个数中选择最大的一个 并且排序输出\n");
int i;
int temp;
int j;
int arr[10] = { 0 };
printf("排序前\n");
for (i = 0; i <= 9; i++){
arr[i] = random(100);
printf("%d,", arr[i]);
}
int len = sizeof(arr) / sizeof(arr[0]); //从第1个数字开始
for (i = 0; i <= len - 1; i++){ //每个数字与后面的数字比较i-1次 整体循环i-2次
for (j = 0; j <= len - 2; j++){
if (arr[j] < arr[j + 1]){
temp=arr[j];
arr[j]=arr[j + 1];
arr[j + 1] = temp;
}
}
}
for (i = 0; i <= 9; i++){
printf("%d,", arr[i]);
}
printf("排序后\n 最大值%d\n", arr[0]);
5.求两个数的最大公约数。
这道题可以利用一种算法“辗转相除法”
(用较小数除较大数,再用出现的余数(第一余数)去除除数,再用出现的余数(第二余数)去除第一余数,如此反复,直到最后余数是0为止。如果是求两个数的最大公约数,那么最后的除数就是这两个数的最大公约数。用较小数除较大数,再用出现的余数(第一余数)去除除数,再用出现的余数(第二余数)去除第一余数,如此反复,直到最后余数是0为止。如果是求两个数的最大公约数,那么最后的除数就是这两个数的最大公约数。)
int f1 ;
int f2 ;
printf("输入;");
scanf("%d %d", &f1, &f2);
int f3 = f1%f2;
while (f3 != 0){
f1 = f2;
f2 = f3;
f3 = f1%f2;
}
printf("%d", f2);
总结
今天所写的三个入门题目比较有代表性,第一个交换值 我曾以指针的方向去思考后来发现积累不够百思不得其解 个人认为其考校的是对于计算机运算过程的掌握,第二道排序题可以作为扩充待学习深入此题可研究如何提高效率,这种排序的方法太过于笨拙,第三道是扩充题目 让我学习到辗转相除法 这三道题不仅仅局限于C语句的使用,其实质是对计算方法的考量。