四.找素数
素数:除了1和它本身不再有其他因数的自然数。换句话说:一个大于1的自然数 ,如果只能被1和它本身整除,那就是素数(质数)。
在打印中遇到的问题就是,知道怎么写却总是运行不起来。主要有这两个问题:
1.每判断一个数是否是素数后都需要对flag进行初始化,否则flag一直都是1。
2.打印素数需要在外层循环里面,每判断一次就打印一次(是素数则打印,不是则不打印)。
int main()
{
int i = 0;
int j = 0;
int flag = 0;//声明一个flag
for (i = 100; i <= 200; i++)
{
flag = 0;//每次判断素数后需要初始化
for (j = 2; j < i; j++)
{
if (i % j == 0)
{
flag = 1;//用1代表不是素数的自然数
break;
}
}
if (flag == 0)
{
printf("%d是素数\n", i);//0则代表的是素数
}
}
return 0;
}
五.最小公倍数以及最大公约数
最大公约数:两个或多个整数共有的最大的那个正整数约数。例:(12,18)->36
基本办法(穷举法):找两个数小的那个,然后依次减一,其中判断i是否既能被m整除又能被n整除,满足则最大公约数就i,接着跳出循环。
int main()
{
int m = 0;
int n = 0;
int i = 0;
scanf("%d %d", &m, &n);
int min = m > n ? n : m;
for (i = min; i >=1 ; i--)
{
if (m % i == 0 && n % i == 0)
{
printf("%d是最大公约数\n", i);
break;
}
}
return 0;
}
辗转相除法 :输入两个数m和n,m对n求余。m%n如果等于0,则最大公约数为n;若不等于0,将原先的n赋值给m,求得的余数赋值给n,再进行求余,循环终止条件则是求余为0。
int main()
{
int m = 0;
int n = 0;
int temp = 0;
int t = 0;
scanf("%d %d", &m, &n);
while (m % n)//循环终止条件
{
temp = m % n;
m = n;
n = temp;
}
printf("%d是最大公约数\n", n);
return 0;
}
最小公倍数:两个或多个整数的公倍数里最小的那一个。例:(12,18)->6
通过计算两个或多个数之积,再除以它们的最大公约数(辗转相除法计算),求最小公倍数有很多种方法(也可以通过找两个数或多个数最大的,判断是否可以除尽其它数,不能则++直至找到能除尽的那个数)。
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
int max = a * b;
int k = 0;
while (a % b)//辗转相除法
{
k = a % b;
a = b;
b = k;
}
printf("%d\n", max / b);
return 0;
}
六.字符串逆序
题目意思是最后打印的数组呈现出来的就是倒序的样子,而非倒序打印。要倒序打印数组,需要将第一个字符与最后一个字符交换(交换时需要第三方),第二个字符与倒数第二个字符交换,两端一直向中间汇聚,直到字符剩一个或两个。
从第一次函数来说吧!先是'w'与'!'交换需要中间变量temp,改变数组得用上指针,指针找'!'需要知道字符串的长度*(string+len-1),将'!'赋值给*string,再将'\0'赋值给最后一个字符(这里赋值的原因是为了调用下一次函数时,计算剩下字符串的长度(除'w''和!'),因为字符串结束标志是'\0'。假使不赋值'\0',计算长度时会多加'!',等到下次赋值时就是将'!'给'e',这样就得不到想要的倒叙。)。递归重点来啦:不断重复以上操作,直至所剩的字符长度小于2,假设为1的话最后这个字符不需要交换且没有字符与之交换,这就成为这个题目递归的限制条件。最后再将temp的字符给*(string+len-1)。这样就好啦!
int Strlen(char *str)
{
int count = 0;
while (*str!='\0')
{
count++;
str++;
}
return count;
}
void reverse_string(char* string)
{
int len = Strlen(string);
char temp = *string;//交换头和尾字符
*string = *(string + len - 1);
*(string + len - 1) = '\0';//为了下一次递归头和尾相呼应
if (Strlen(string + 1) >= 2) //结束递归的条件向两端汇聚,当只剩一个字符则不需要交换
{
reverse_string(string + 1);//调用不需要指针*
}
*(string + len - 1) = temp;
}
int main()
{
char arr[] = "welcome to my world!!!";
//int sz = sizeof(arr) / sizeof(arr[0]);
//int len = strlen(arr);
//printf("%d\n", sz);//23 写这个是为了测试sizeof和strlen计算字符串个数的区别
//printf("%d\n", len);//22
reverse_string(arr);
printf("%s\n", arr);
return 0;
}
这里再讲一个小知识:sizeof计算字符时会计算'\0',而strlen函数不计算它。