第三部分内容(第五周)
这是第二部分的后续内容
根据第二部分,继续补充后续内容。
–
文章目录
- 第三部分内容(第五周)
- 一.循环控制
- 1.1循环控制
- 1.2 多重循环
- 1.3循环应用
- 1.3.1前n项求和
- 1.3.2求最大公约数
- 1.3.3整数分解
一.循环控制
1.1循环控制
示例:可以根据问题,编写相关代码。
#include<stdio.h>
int main(){
int x;
scanf("%d", &x);
int i;
int isPrime = 1;
for( i = 2; i < x; i++){
if( x % i == 0 ) {
isPrime = 0;
break;
//跳过循环,当发现整除数字时候,isPrime=0,直接跳过后续判断
}
}
if(isPrime == 1){
printf("是素数\n");
}else{
printf("不是素数\n");
}
return 0;
}
上述的代码主要是输入一个数字(x),将这个数字循环%2-这个数字减一(i<x)这些数字来判断,是否只有1和这个数字本身。在添加一个变量isPrime=1。在循环中除了1和本身外还有其他数字改变isPrime=0。通过isPrime的值来判断打印的内容。在判断素数的时候,用break直接跳过循环,不用重复后续的判断循环。
如果判断打印的条件,不用isPrime,改变为i<x,为判断依据,
可回复具体为啥不好,有知道的。
1.2 多重循环
上述问题的代码解决方法如下:使用for嵌套在外层。
#include<stdio.h>
int main(){
int x;
// scanf("%d", &x);
for( x = 2; x <= 100; x++ )
{
int i;
int isPrime = 1;
for( i = 2; i < x; i++)
{
if( x % i == 0 )
{
isPrime = 0;
break;
//跳过循环,当发现整除数字时候,isPrime=0,直接跳过后续判断
}
}
if(isPrime == 1)
{
printf("%d\n",x);
// printf("是素数\n");
}
// else{
// printf("不是素数\n");
// }
}
return 0;
}
1.2.1 嵌套的循环
用两个for循环
#include<stdio.h>
int main(){
int x;
// scanf("%d", &x);
for( x = 2; x <= 100; x++ )
{
int i;
int isPrime = 1;
for( i = 2; i < x; i++){
if( x % i == 0 ) {
isPrime = 0;
break;
//跳过循环,当发现整除数字时候,isPrime=0,直接跳过后续判断
}
}
if(isPrime == 1)
{
printf("%d ",x);
// printf("是素数\n");
}
// else{
// printf("不是素数\n");
// }
}
printf("\n");
return 0;
}
//结果
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
输入前50个素数,用while循环
#include<stdio.h>
int main(){
int x;
x = 2;
int cnt = 0;
// scanf("%d", &x);
// for( x = 2; x <= 100; x++ )
while(cnt < 50)
{
int i;
int isPrime = 1;
for( i = 2; i < x; i++){
if( x % i == 0 ) {
isPrime = 0;
break;//跳过循环,当发现整除数字时候,isPrime=0,直接跳过后续判断
}
}
if( isPrime == 1 )
{
printf("%d ",x);
cnt ++;
// printf("是素数\n");
}
x++;
// else{
// printf("不是素数\n");
// }
}
printf("\n");
return 0;
}
//改变下对应的结果循环
#include<stdio.h>
int main(){
int x;
x = 2;
int cnt = 0;
// scanf("%d", &x);
// for( x = 2; x <= 100; x++ )
while(cnt < 50)
for( x = 2; cnt < 50; x++ )
{
int i;
int isPrime = 1;
for( i = 2; i < x; i++){
if( x % i == 0 ) {
isPrime = 0;
break;//跳过循环,当发现整除数字时候,isPrime=0,直接跳过后续判断
}
}
if( isPrime == 1 )
{
printf("%d ",x);
cnt ++;
// printf("是素数\n");
}
// x++;
// else{
// printf("不是素数\n");
// }
}
printf("\n");
return 0;
}
//相同的结果
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199 211 223 227 229
1.2.2从嵌套的循环中跳出
//基础的满足条件代码
#include<stdio.h>
int main()
{
int x;
int one,two,five;
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个1角+%d个2角+%d个5角得到%d元\n",one,two,five,x);
}
}
}
}
return 0;
}
//结果
2
可以用1个1角+2个2角+3个5角得到2元
可以用1个1角+7个2角+1个5角得到2元
可以用2个1角+4个2角+2个5角得到2元
可以用3个1角+1个2角+3个5角得到2元
可以用3个1角+6个2角+1个5角得到2元
可以用4个1角+3个2角+2个5角得到2元
可以用5个1角+5个2角+1个5角得到2元
可以用6个1角+2个2角+2个5角得到2元
可以用7个1角+4个2角+1个5角得到2元
可以用8个1角+1个2角+2个5角得到2元
可以用9个1角+3个2角+1个5角得到2元
可以用11个1角+2个2角+1个5角得到2元
可以用13个1角+1个2角+1个5角得到2元
//只展示第一个答案
//方法一,接力break
#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个1角+%d个2角+%d个5角得到%d元\n",one,two,five,x);
exit = 1;
break;
}
}
if(exit == 1) break;
}
if(exit == 1) break;
}
return 0;
}
//方法二,用goto out; out:
#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个1角+%d个2角+%d个5角得到%d元\n",one,two,five,x);
goto out;
// exit = 1;
// break;
}
}
// if(exit == 1) break;
}
// if(exit == 1) break;
}
out:
return 0;
}
//结果
2
可以用1个1角+2个2角+3个5角得到2元
1.3循环应用
1.3.1前n项求和
代码如下(示例):
#include<stdio.h>
int main()
{
int n;
int i;
double sum = 0.0;
scanf("%d",&n);
for(i = 1; i <= n ; i++){
sum += 1.0/i;
}
printf("f(%d)=%f\n",n,sum);
return 0;
}
// 结果
2
f(2)=1.500000
如果要实现下面的功能:
代码如下(示例):
#include<stdio.h>
int main()
{
int n;
int i;
double sum = 0.0;
int sign = 1;
scanf("%d",&n);
for(i = 1; i <= n ; i++){
// sum += 1.0/i;
sum += sign*1.0/i;
sign = -sign;
}
printf("f(%d)=%f\n",n,sum);
return 0;
}
// 结果
2
f(2)=0.500000
//可对程序做改变
#include<stdio.h>
int main()
{
int n;
int i;
double sum = 0.0;
// int sign = 1;
double sign = 1.0;
scanf("%d",&n);
for(i = 1; i <= n ; i++){
// sum += 1.0/i;
// sum += sign*1.0/i;
sum += sign/i;
sign = -sign;
}
printf("f(%d)=%f\n",n,sum);
return 0;
}
//结果保持不变
1.3.2求最大公约数
1.用枚举法
代码如下(示例):
#include<stdio.h>
int main()
{
int a, b;
int min;
scanf("%d %d", &a, &b);
if(a < b)
{
min = a;
}
else
{
min = b;
}
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);
}
}
}
printf("%d和%d的最大公约数是%d.\n", a, b, ret);
return 0;
}
2.辗转相除法
代码如下(示例):
#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);
//gcd是a和b的最大公约数。
//结果
12 16
a = 16, b = 12, t = 12
a = 12, b = 4, t = 4
a = 4, b = 0, t = 0
gcd = 4
}
1.3.3整数分解
代码如下(示例):
#include<stdio.h>
int main()
{
int x;
scanf("%d",&x);//123 没循环下面 3 2 1
int t = 0;
do {
int d = x % 10;//对x取余--3,2,1
t = t * 10 + d;//3,32,321
x /= 10;//12,1,0
}
while( x > 0);
{
printf("x = %d, t = %d\n", x, t);
}
x = t;//321赋值给x,再倒叙得到 1 2 3
do
{
int d = x % 10;
printf("%d ",d);
if(x > 9)
{
printf(" ");
}
x /= 10;
}while( x > 0);
printf("\n");
return 0;
}
//上述代码在700,不满足你想要的结果
//末尾有0.逆序再逆序不适合
//改进上述代码
上述代码是利用数字倒叙再求余(两次倒叙)
上述代码存在许多问题,下面是改进后的代码。
#include<stdio.h>
int main()
{
int x;
// scanf("%d",&x);
x = 10700;
int t = x;
/*
//12345 / 10000 -> 1
//12345 % 10000 -> 2345
//10000 / 10 -> 1000
//2345 / 1000 -> 2
//2345 % 1000 -> 345
//1000 / 10 -> 100
//345 / 100 -> 4
//345 % 100 -> 45
// 100 / 10 -> 10
//45 / 10 -> 4
//45 % 10 -> 5
//10 / 10 -> 1
//5 / 1 -> 5
//5 % 1 -> 5
//1 / 10 -> 0
*/
int mask = 1;
while(t > 9)
{
t /= 10;
mask *= 10;
};//x > 0的话 0 0 0 0 0
// mask /= 10;
printf("x = %d , mask = %d\n", x, mask);
// int mask = 10000;
do
{
int d = x / mask;
printf("%d", d);
if(mask > 9)
{
printf(" ");
}
x %= mask;
mask /= 10;
// printf("x = %d, mask = %d, d = %d\n", x, mask, d);
}while( mask > 0 );
/*
// int t = 0;
// do {
// int d = x % 10;//对x取余--3,2,1
// t = t * 10 + d;//3,32,321
// x /= 10;//12,1,0
// }
// while( x > 0);
// {
// printf("x = %d, t = %d\n", x, t);
// }
// x = t;//321赋值给x,再倒叙得到 1 2 3
// do
// {
// int d = x % 10;
// printf("%d ",d);
// if(x > 9)
// {
// printf(" ");
// }
// x /= 10;
// }while( x > 0);
*/
printf("\n");
return 0;
}
/*
#include<stdio.h>
int main()
{
int x;
// scanf("%d", &x);
x = 100;
int t = 0;
do
{
int d = x % 10;
t = t * 10 + d;
x = x / 10;
}while(x > 0);
printf("t = %d\n", t);
x = t;
do
{
int d = x % 10;//求余,并打印
printf("%d", d);
if(x >= 10)
{
printf(" ");
}
x /= 10;//取整,去掉小数位
}
while( x > 0 );
printf("\n");
return 0;
}
*/
以上为第五周的内容和笔记,欢迎各位收藏、点赞、关注!