1. 求 10000 以内的素数个数#include <stdio.h>
int main()
{
int count = 2; // 已知2和3是素数
int i, j;
_Bool flag = 1;
for (i = 5; i < 10000; i++)
{
for (j = 2; j < i / 2; j++)
{
if (i % j == 0)
{
flag = 0;
break;
}
}
if (flag)
{
count++;
}
else
{
flag = 1;
}
}
printf("10000以内共有%d个素数!\n", count);
return 0;
}
i为啥要从5开始,2和3也是素数啊,从5开始最后的结果不就不准了吗?还有为啥if后面还有个else {flag = 1}; 只要是素数,从头到尾flag不都是1吗?有什么作用呢?
3. 写一个凯撒加密程序。#include <stdio.h>
int main()
{
int ch;
printf("请输入明文:");
while ((ch = getchar()) != '\n')
{
if (ch >= 'a' && ch <= 'z')
{
putchar('a' + (ch - 'a' + 3) % 26);
continue;
}
if (ch >= 'A' && ch <= 'Z')
{
putchar('A' + (ch - 'A' + 3) % 26);
continue;
}
putchar(ch);
}
putchar('\n');
return 0;
}
putchar('a' + (ch - 'a'+3)%26); 是什么意思啊,换算成整型来计算的话,(ch-'a'+3)怎么都不可能打过26把,求余以后不是0就是1再加上'a'怎么可能做到向后偏移两位的,这是为什么啊?求大佬指点!!!
第一个问题:
就像你说的2和3也是素数,因为这两个很简单嘛,人用脑一算就知道了,所以就不需要用程序去算,
直接从5开始,这样就省去2.3.4(3次循环),省去了一点点点点点的程序运行时间。
另外,结果并不会不准,因为在程序的第5行:int count = 2; /就已经将(2和3)算进去了。
再另外,else {flag = 1}这个语句,相当于使每一次进入第一个for循环(第9行的)确保flag = 1;
然后进入第二个for循环(第11行的),若该数不是素数,那么它就能满足第13行的if语句,使flag = 0;并退出这个for循环,
此时flag = 0 不满足 第20行的if语句;所以执行else;
把flag 重新赋值为 1;使其进入下次循环,flag的值还是为1;
第二个问题:
1.首先,(ch - 'a'+3)%26)这个表达式的结果不只是0和1;
对26取余,结果为0-25之间的任何一个数;
2.至于('a' + (ch - 'a'+3)%26)这个怎么计算,那么咱们简单的举个例子:
就已简单的字符ch = ‘ a ’为例;
带入('a' + (ch - 'a'+3)%26) = ‘a’ +(‘a’ - ‘a’ + 3)%26 = ‘a’ +3%26 = ‘a’ + 3
结果是 "a"+ 3 ,在编译器中这个计算就是用‘a’的ASCII码值+3;得到的数值在对照ASCII表转换为字符型的值;
当然咱们不用这么费事:这次从a向后数3个字符就行:
b、c、b,所以结果就是‘d’
综上:经过程序,把输入的‘a’变成了‘d’;
同理:输入其他的也一样:就是往后面数偏移多少位就行;
|