循环控制
素数
只能被
1
和自己整除的数,不包括1
2, 3, 5, 7, 11, 13, 17, 19...
int main()
{
int num;
int flag = 1;
printf("请输入数:");
scanf("%d", &num);
for (int i = 2; i < num; i++)
{
if (num % i == 0)
{
flag = 0;
break; // 跳出循环
}
}
if (flag == 0)
{
printf("不是素数");
}
else
{
printf("是素数");
}
}
break
和continue
break
:跳出循环continue
:跳过循环这一轮剩下的语句进入下一轮
多重循环
100以内的素数
如何写程序输出100以内的素数?
int main()
{
for (int num = 2; num < 100; num++)
{
int flag = 1;
for (int i = 2; i < num; i++)
{
if (num % i == 0)
{
flag = 0;
break;
}
}
if (flag == 1)
{
printf("%d,", num);
}
}
return 0;
}
嵌套的循环
循环里面还是循环
int main()
{
int count = 0;
// int num = 2;
for (int num = 2; count < 50; num++)
// while (count < 50) // 推荐while
{
int flag = 1;
for (int i = 2; i < num; i++)
{
if (num % i == 0)
{
flag = 0;
break;
}
}
if (flag == 1)
{
printf("%d,", num);
count++;
}
num++;
}
return 0;
}
从嵌套的循环跳出:break
只能跳出所在的循环
凑硬币
如何用
1
角、2
角和5
角的硬币凑出10
元以下的金额呢?
break
和continue
只能对它所在的那层循环做
接力break
goto
不推荐使用,使用会造成逻辑混乱,程序的线性结构被破坏,难以理解和阅读
int day = 1;
loop:
if (day <= 31)
{
printf("%d\n", day);
day++;
goto loop;
}
几道例题
int sum = 0;
for ( int i=0; i<10; i++ ) {
if ( i%2 ) continue;
sum += i;
}
printf("%d\n", sum);
// 0+2+4+6+8 = 20
int sum = 0;
for ( int i=0; i<10; i++ ) {
if ( i%2 ) break;
sum += i;
}
printf("%d\n", sum);
// 0
循环应用
求
int main()
{
int num;
double sum = 0.0;
scanf("%d", &num);
for (int i = 1; i <= num; i++)
{
sum += 1.0 / i;
}
printf("%f", sum);
return 0;
}
// 交错相加
int main()
{
int num;
double sum = 0.0;
int flag = 1;
scanf("%d", &num);
for (int i = 1; i <= num; i++)
{
sum += flag * 1.0 / i;
flag = -flag;
}
printf("%f", sum);
return 0;
}
// 趋于收敛
最大公约数
- 输入两个数
a
和b
,输出它们的最大公约数- 输入:
12 18
- 输出:
6
枚举法求最大公约数
int main()
{
int a, b;
int min;
scanf("%d %d", &a, &b);
if (a < b)
{
min = a;
}
else
{
min = b;
}
int convention = 0;
for (int i = 1; i < min; i++)
{
if (a % i == 0)
{
if (b % i == 0)
{
convention = i;
// break; // 最小公约数
}
}
}
printf("最大公约数为:%d", convention);
return 0;
}
辗转相除法求最大公约数
辗转相除法
- 如果
b
等于0,计算结束,a
就是最大公约数;- 否则,计算
a
除以b
的余数,让a
等于b
,而b
等于那个余数;- 回到第一步。
a b temp(a除以b的余数) 12 18 12 18 12 6 12 6 0 (6) 0 0
int main()
{
int temp;
int a, b;
scanf("%d %d", &a, &b);
while (b != 0)
{
temp = a % b;
a = b;
b = temp;
}
printf("MaxConvention = %d\n", a);
return 0;
}
// 12 18
// a=18, b=12, temp=12
// a=12, b=6, temp=6
// a=6, b=0, temp=0
// MaxConvention = 6
正序分解整数
- 输入一个非负整数,正序输出它的每一位数字
- 输入:13425
- 输出:1 3 4 2 5
int main()
{
int num;
int figure;
int length;
printf("Please enter the num:");
scanf("%d", &num);
length = fnGetLength(num);
printf("数字序列长度为:%d\n", fnGetLength(num));
printf("The figures sequence is:");
for (int i = length; i > 0; i--)
{
int protype = 10;
for (int j = 1; j < i - 1; j++)
{
protype *= 10;
}
if (i != 1)
{
figure = num / protype;
}
else
{
figure = num % protype;
}
printf("%d ", figure);
num = num % protype;
}
}
// Please enter the num:987654321
// 数字序列长度为:9
// The figures sequence is:9 8 7 6 5 4 3 2 1