一些小程序的个人总结(2)

void Swap(int *x, int *y)
{
 int a;
 a= *x;
 *x = *y;
 *y = a;
}

一般都大家写指交换都会引用另一个变量通过值传递来交换。但其实还有其他的发现,当不可以引用其他的量的时候,a=a+b;b=a-b;a=a-b;类似的*乘法就同样完成了值的交换。但是这种方式是有弊端的,比如,当a,b很大时,这样写,有可能会导致a=a+b的时候a的值越界。所以我们还有一个方式。a=a^b;b=a^b;a=a^b;" ^ "异或标识符,对二进制序列操作。

同样的当我们求几个值的最大大值,一般的操作是定一个max=0;但是这种情况在全是负数的时候,显然出错误了,我们便假定第一个元素最小,然后用之后的和它进行比较即可。

printf("***********************10 个整数中最大值。\n");
 {
  int n[10];
  printf("请依次输入十个值(空格隔开):");
  for (int i = 0; i < 10; i++)
   scanf_s("%d", &n[i]);
  int max = n[0];
  for (int i = 0; i < 10; i++)
   //if (max < n[i])max = n[i];
   max = max > n[i] ? max : n[i];
  printf("max=%d\n", max);
 }

当比较很多数,让他们按顺序(从大到小)输出时,可以使用两层for循环嵌套完成。但当数目较小时,swap(x1,x2);swap(x1,x3);swap(x2,x3);即可;

 printf("******************三个数从大到小输出\n");
 {
  int n[6];
  printf("请输入六个数:");
  for (int i = 0; i < 6; i++)
   scanf_s("%d", &n[i]);
  for (int i = 0; i < 6; i++)
   for (int j = 0; j < 6 - i; j++)
    if (n[j] < n[j + 1])Swap(n + j, n + j + 1);
 }

类似的,当我们求两个数的最大公约数时,按着数学思想,有辗转相除法;

 printf("********************两个数的最大公约数\n");
 {
  int a; int b;
  printf("请一次输入两个指空格隔开:");
  scanf_s("%d %d", &a, &b);
   a < b ? 1 : Swap(&a,&b);
  int c= 0;
  while (a%b != 0)
  {
   c = a%b;
   a = b;
   b = c;
  }
  printf("最大公约数为:%d", b);
 }

"c "的引用有必要吗?我觉得有,不然a%b的结果值存在哪里,怎么给b;有人用向减的算法做,个人觉得时间复杂度比较高。

#include<stdio.h>
void Swap(int *x, int *y)
{
 int a;
 a = *x;
 *x = *y;
 *y = a;
}
int main()
{
 printf("数组A,B交换:\n");
 int a[5] = {0,1,2,3,4};
 int b[5] = {1,2,5,4,3};
 int j = 0;
 for (j = 0; j < 5; j++)
  printf("%d  ", a[j]);
 printf("\n");
 for (j = 0; j < 5; j++)
  printf("%d  ", b[j]);
 printf("\n");
 int i = 0;
 for (i = 0; i < 5; i++)
  Swap(a + i, b + i); 
 for (j = 0; j < 5; j++)
  printf("%d  ", a[j]);
 printf("\n");
 for (j = 0; j < 5; j++)
  printf("%d  ", b[j]);
 printf("\n");
 printf("计算1/1-1/2+1/3、、、、-1/100的值:\n");
 double sum=0.0;
 double m=0.0;
 for (m = 1; m<=100; m += 2)
 {
  sum = sum + 1 / m - 1 / (m + 1);
 }
 printf("%lf\n",sum);
 printf("1-100中出现了多少次整数9:\n");
 int count = 0;
 for (i = 1; i <= 100; i++)
 {
  
  if (i % 10 == 9)
  {
   count++; printf("%d\t",i);
  }
  if ((i - i % 10) % 9 == 0 && (i > 9)) { count++; printf("%d\t", i); }
 }
 printf("\n%d\n", count);
}

这几个程序中,主要数组的交换,就是数组每个元素逐一交换。

计算“ / ”的时候,由于int/int的值还是int所以,为了出现浮点数,两个int至少一个改成浮点型。

猜你喜欢

转载自blog.csdn.net/weixin_40921797/article/details/78552525