今日学习内容:从嵌套的循环中跳出 前n项和 整数分离 求最大公约数
链接:
笔记:
goto 是从循环最里面跳到最外面时使用,break只能跳出其所在循环。。。
“f(%d)=%f\n” 是格式化字符串,其中包含两个占位符:
%d 是一个整数占位符,用于插入一个整数值。
%f 是一个浮点数占位符,用于插入一个浮点数值。
n 是一个整数变量,它的值将被插入到 %d 的位置。
sum 是一个浮点数变量,它的值将被插入到 %f 的位置。
水仙花数:N位正整数(N>=3),每个个位上的数的N次幂之和=它本身
辗转相除法:![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/057641ec31d6424282f3747b1e2cc9dd.png)
代码:
//凑硬币
#include <stdio.h>
int main()
{
int x;
int one, two, five;
int exit = 0;
scanf("%d", &x);
for (one = 1; one < x * 10; one++)
{
for (two = 1; two < x * 10 / 2; two++)
{
for (five = 1; five < x * 10 / 5; five++)
{
if (one + two * 2 + five * 5 == x * 10)
{
printf("可以用%d个一角加%d个2角加%d个五角得到%d元\n", one, two, five, x);
exit = 1; //也可在此用goto(需要从最内层跳到最外层时使用):goto out;
break;
}
}
if (exit == 1) break;
}
if (exit == 1) break; //接力break
}
//再在最外层这里用out跳出: out:
return 0;
}
int main()
{
int i;
int n;
double sum = 0.0;
//int sign = 1; //累乘 不能=0
double sign = 1.0;
scanf("%d", &n);
for (i = 1; i <= n; i++)
{
sum += sign / i;
sign = -sign; //中间的正负号相互变换
}
printf("f(%d)=%f\n", n, sum);
return 0;
}
正序分解整数 (先逆序再逆序法只适合末尾没有0的数)
int main()
{
int x;
scanf("%d", &x);
x = 700;
int t = 0;
do
{
int d = x % 10;
t = t * 10 + d;
x /= 10;
} while (x > 0);
printf("x=%d,t=%d\n", x, t);
x = t;
do
{
int d = x % 10;
printf("%d", d);
if (x > 9)
{
printf(" ");
}
x /= 10;
} while (x > 0);
printf("\n");
return 0;
}
//最大公约数(枚举法)
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int a, b;
int min;
scanf("%d %d", &a, &b);
if (a > b)
{
min = b;
}
else
{
min = a;
}
int ret = 0;
int i;
for (i = 1; i < min; i++)
{
if (a % i == 0)
{
if (b % i == 0)
{
ret = i;
}
}
}
printf("%d 和%d 的最大公约数为 %d.\n", a, b, ret);
return 0;
}
//最大公约数(辗转相除法)
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int a, b;
int t;
scanf("%d %d", &a, &b);
while (b != 0)
{
t = a % b;
a = b;
b = t;
printf("a=%d,b=%d,t=%d.\n", a, b, t);
}
printf("gcd=%d.\n", a);
return 0;
}
编练解4-0:(嵌套循环,看得难受,理解得还行)
//给定条件的整数集(生成所有可能的三个数字的组合,并确保这三个数字互不相同)
int main()
{
int a;
int i, j, k;
int cnt;
i = a;
while (i <= a + 3)
{
j = a;
while (j <= a + 3)
{
k = a;
while (k <= a + 3)
{
if (i != j)
{
if (i != k)
{
if (j != k)
{
cnt++;
printf("%d%d%d", i, j, k);
if (cnt == 6)
{
printf("\n");
cnt = 0;
}
else
{
printf(" ");
}
}
}
}
k++;
}
j++;
}
i++;
}
return 0;
}
编练解4-1:(水仙花数)
while中i<n 的条件会使程序走n遍
这里是最难懂的,不知道要在哪加循环,不知道为什么要用那么多变量👆
//水仙花数
//通过输入的n的数值来确定i循环的起点和终点。
// 起点first就是10的n-1次方 ,终点就是10的n次方
// 然后让i在这个区间内遍历
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int n;
scanf("%d", &n);
int first = 1;
int i = 1;
while (i < n)
{
first *= 10;
i++;
}
printf("first=%d.\n", first);
//是三位数,要去遍历100~999
i = first;
while (i < first * 10)
{
int t = i;
int sum = 0;
do
{
int d = t % 10;
t /= 10;
int p = 1;
int j = 0;
while (j < n)
{
p *= d;
j++;
}
sum += p;
} while (t > 0);
if (sum == i)
{
printf("%d\n", i);
}
i++;
}
return 0;
}