1、计算最小公倍数
我的第一想法:两个数的最小公倍数只能是两个数其中的一个、两个数的乘积、或者小于两个数的乘积。通过一个for循环(限制条件为:i = 0;i < 两个数的乘积),然后用if语句判断i是否能整除i且i小于两个数的乘积,是就输出i否则输出两个数的乘积。写出来发现结果是0,看了一下代码发现i不能重0开始因为0除以任何数都得0.我想到的解决办法是,最小公倍数的值肯定大于或等于两个数的最大值,通过int max = a > b ? a : b;语句算出两个数的最大值把循环条件改为(i = max; i < a * b; i++)即可。最后完整的代码如下:
include <stdio.h>
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
int mul = a * b;
int max = a > b ? a : b;
float i = max;
if (a > 0 && a < 100000 && b > 0 && b < 100000)
{
for (i = max; i < mul; i++)
{
if (i / a == 0 && i / b == 0 && i < mul)
{
printf("%d和%d的最小公倍数是%d", a, b, i);
break;
}
else
{
printf("%d和%d的最小公倍数是%d", a, b, mul);
break;
}
}
}
else
{
printf("输入有误");
}
return 0;
}
但是这代码的效率低,在课堂上学会了一种好的解决办法:
原理:
假设这两个数是5和7,若5乘1、2、3...(即i)除以7得0则得到5和7得最小公倍数
include <stdio.h>
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
int i = 1;
while (a * i % b)
{
i++;
}
printf("%d\n", a * i);
return 0;
}
2、字符倒置
这个没什么思路。。。
老师的解决办法如下:
1.先将整个字符串进行倒置;
2.然后将每一个单词倒置;
例如:i like beijing. >> .gniieb ekil i >> i like beijing
include <stdio.h>
void reverse(char* left, char* right)
{
while (left > right)
{
char tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
int main()
{
char arr[100] = { 0 };
gets(arr);
int len = strlen(arr);
reverse(arr, arr + len - 1);
char* star = arr;
while (*star)
{
char* end = star;
while (*end != ' ' && *end != '\0')
{
end++;
}
reverse(star, end - 1);
if (*end != '\0')
{
end++;
}
star = end;
}
printf("%s", arr);
return 0;
}
课堂知识点小记:
long类型的数据在32位系统中占4个字节,在64位系统中占8个字节
sizeof(long) >= sizeof(int)
char是signed char还是unsigned char是未定义的,取决于编译器得实现;
二进制有三种表达方式:原码、反码、补码,正整数的三码合一,负数的反码与原码相比符号位不变其他的取反,补码=反码 + 1;
内存中存的是补码的二进制序列;
在计算机系统中数值一律用补码 来表示和存储,原因:使用补码,可以将符号位和数值统一处理;