交换两变量的值
题目:给定两个整形变量的值,将两个值的内容进行交换。
这可以使用指针变量进行交换。切不可直接接交换
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 有两种思想,看看哪组正确? void swap (int * x, int * y) { int temp = 0 ; temp = *x; *x = *y; *y = temp; } void swap (int x, int y) { int temp = 0 ; temp = x; x = y; y = temp; }
图解:
用指针的话,显然在内存二者已经交换了!
但是,当不用指针的话,两组变量都有自己独立的内存空间,没有产生关联,当然num1和num2没有在内存中发生交换。
那么,这时候只要给swap函数传两个参数即可进行交换。
代码为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 #include <stdio.h> #include <stdlib.h> //给定两个整形变量的值,将两个值的内容进行交换。 void swap(int* x, int* y){ int temp = 0; temp = *x; *x = *y; *y = temp; } int main(){ int num1 = 2; int num2 = 8; printf("num1=%d num2=%d\n",num1,num2); swap(&num1, &num2); printf("num1=%d num2=%d\n",num1,num2); system("pause"); return 0; }
题目:不允许创建临时变量,交换两个数的内容
首先,可以使用两变量之和或者差、积等促成一个临时变量。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> int main () { int a = 0 ; int b = 0 ; printf ("请输入两个数:" ); scanf ("%d,%d" , &a,&b); printf ("交换前:\n" ); printf ("a = %d\nb = %d\n" ,a,b); a = a + b; b = a - b; a = a - b; printf ("交换后: \n" ); printf ("a = %d\nb = %d\n" , a, b); system("pause" ); return 0 ; }
上述方法有一个明显的缺陷,就是当a和b足够大时a+b可能int类型存不下发生溢出现象
解决办法:按位异或(^)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> int main () { int a = 0 ; int b = 0 ; printf ("请输入两个数:" ); scanf ("%d,%d" , &a,&b); printf ("交换前:\n" ); printf ("a = %d\nb = %d\n" ,a,b); a = a^b; b = a^b; a = a^b; printf ("交换后: \n" ); printf ("a = %d\nb = %d\n" , a, b); system("pause" ); return 0 ; }
这个方法就不会发生溢出现象。但是实际并不提倡,因为效率较低!ok
题目: 将数组A中的内容和数组B中的内容进行交换。(数组一样大)
一样的思路,用一个交换函数swap进行操作!
注意点:这里传的是数组每一项的地址,如&a[5];
还有,尽可能的把功能单独出来作为函数。用来调用!
C语言中数组的长度计算为:sizeof(x)/sizeof(x[0]) 其中sizeof计算的是多少个字节,然后除以第一项所占的字节就是数组的长度。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #define arr_length(x) sizeof(x)/sizeof(x[0]) void swap (int * x,int * y) { int temp = 0 ; temp = *x; *x = *y; *y = temp; } void PrintArrays (int arr[],int length) { for (int i = 0 ; i < length; i++) { if (i == 0 ){ printf ("[%d," ,arr[0 ]); } if (i < length - 1 ){ printf ("%d," , arr[i]); }else { printf ("%d]" , arr[i]); } } printf ("\n" ); } void ScanfArrays (int arr[], int length) { for (int i = 0 ; i < length; i++) { scanf ("%d" , &arr[i]); } } int main () { int A[5 ]; int B[5 ]; printf ("请输入5个数存于A数组中:" ); ScanfArrays(A, arr_length(A)); printf ("请输入5个数存于B数组中:" ); ScanfArrays(B, arr_length(B)); printf ("交换前的A数组:" ); PrintArrays(A, arr_length(A)); printf ("交换前的B数组:" ); PrintArrays(B, arr_length(B)); for (int index = 0 ; index < 5 ; index++) { swap(&A[index],&B[index]); } printf ("交换后的A数组:" ); PrintArrays(A, arr_length(A)); printf ("交换后的B数组:" ); PrintArrays(B, arr_length(B)); system("pause" ); return 0 ; }
求10个整数中最大值
题目:求10个整数中最大值
思路:将这10个数存到一个数组里面,从这数组中找到最大的值就ok了。假设数组中第一个元素为最大值max,遍历整个数组跟这个最大值max进行比较,若有更大的值那么就把大的值赋给max。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> int main () { int arr[10 ]; int i = 0 ; printf ("请输入10个数,用\",\"隔开:" ); for ( i = 0 ; i < 10 ; i++) { scanf ("%d," ,&arr[i]); } int max = arr[0 ]; for (i = 1 ; i < 10 ; i++) { if (arr[i]>max) max = arr[i]; } printf ("max=%d\n" , max); system("pause" ); return 0 ; }
求两个数的最大公约数
题目:求两个数的最大公约数
最大公约数有很多种求法:例如辗转相除法、辗转相减法等等。这次我用的是辗转相除法。方法就是用较大数模较小数得到的余数,然后用较小数模这个余数,以此类推直到余数等于零,那么这时候的较小数就是两数的最大公约数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int main () { int num1, num2; int temp; printf ("请输入两个数:" ); loop:scanf ("%d,%d" , &num1, &num2); if (num2 == 0 ){ printf ("你的输入有误,请重新输入\n" ); goto loop; } while (num1%num2 != 0 ){ temp = num1%num2; num1 = num2; num2 = temp; } printf ("最大公约数为:%d\n" , num2); system("pause" ); return 0 ; }
相同的,最小公倍数乘以最大公约数等于两数之积。
1到 100 的所有整数中出现多少次数字9
题目:编写程序数一下 1到 100 的所有整数中出现多少次数字9。
分析:这类题目一定要分步骤来看。个位和十位分别来看,再具体确定判断条件。个位上的9就是9、19 、29、39…..99。模10都等于9;十位上的是90、91、92….99.。注意这把99数了两遍,但是个位数了10位就不会再数了。ok~
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 #include <stdio.h> #include <stdlib.h> int main () { int count = 0 ; for (int i = 1 ; i < 100 ; i++){ if (i%10 == 9 ){ count += 1 ; } if (i/10 == 9 ){ count += 1 ; } } printf ("出现9的次数为%d次\n" , count); system("pause" ); return 0 ; }
<
条件和循环语句
素数计算
>