目录
1 整数求逆
2 利用while for两种不同循环求n的阶乘(n!)
3 循环的区别与选择
4 如何用 break continue来控制循环
4 嵌套的循环以及运用接力break或goto跳出循环
5 前n项求和 f(n)=1+1/2+1/3+......+1/n
1 整数求逆
#include<stdio.h>
int main()
{ int x;
scanf("%d",&x);
int digit;
int ret = 0;
while(x>0){
digit=x%10;
ret=ret*10+digit;
digit = x%10;
x/=10;
}printf("%d",ret);
return 0;
通过%10取余将最后一位提取出来定为digit,再通过ret=ret*10将取出来的的数字组合成为逆序
利用while循环条件为x>0当最后一位取余结束后再/10便为零使循环结束
但以此方式为输出不会出现首数字为零的情况
即700转换求逆为7而不能输出007
下边是可以输出首位为0的代码
#include<stdio.h>
int main()
{ int x;
scanf("%d",&x);
int digit;
while(x>0){
digit=x%10;
printf("%d",digit);
digit = x%10;
x/=10;}
return 0;}
每次取余之后直接打印 那么零也可以打印在首位
2 利用while for两种不同循环求n的阶乘(n!)
1 while循环
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
int fact=1;
int i=1;
while(i<=n){
fact*=i;
i++;
}
printf("%d!=%d\n",n,fact);
return 0;
}
2 for循环
for(初始动作 循环继续的条件 循环每轮要做的事情)
for循环像一个计数循环:设定一个计数器,初始化它,然后在计数器到达某值之前,重复执行循环体,而每执行一轮循环,计数器以一定步进进行调整。
#include<stdio.h>
int main(){
int n;
scanf("%d",&n);
int fact=1;
int i=1;
for(i=1;i<=n;i++){
fact*=i;
}
printf("%d!=%d\n",n,fact);
return 0;
}
其中i的初始值也可以为2结果相同且少一轮循环。
3 求阶乘也可以让其从n*n-1*一直到2 ,1可以省略 求1阶乘可以让fact初始值为1
#include<stdio.h>
int main(){
int n;
int i;
scanf("%d",&n);
int fact=1;
for(i=n;n>1;n--){
fact*=n;
}
printf("%d!=%d\n",i,fact);
return 0;
}
3 循环的区别与选择
for和while循环是可以互换的
while循环是先判断再循环
do while循环是先循环再判断
如果有固定次数,用for
如果必须执行一次用do while
其他情况用while
4 如何用 break continue来控制循环
break:跳出循环
continue:跳过循环这一轮剩下的语句进入下一轮
例 判断是否为素数
#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;}
}
if (isprime==1){
printf("是素数\n");}
else{printf("不是素数\n");
}
return 0;
}
4 嵌套的循环以及运用接力break或goto跳出循环
找出100以内的所有素数
#include<stdio.h>
int main(){
int 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;}
}
if (isprime==1){
printf("%d ",x);}
}
printf("\n");
return 0;
}
嵌套的循环变量需要不同避免混乱
找前50个素数
#include<stdio.h>
int main(){
int x;
x=2;
int cnt=0;
while(cnt<50){
int i;
int isprime=1;
for(i=2;i<x;i++){
if(x%i==0){isprime=0;
break;}
}
if (isprime==1){
printf("%d ",x);
cnt++;}
x++;
}
printf("\n");
return 0;
}
凑硬币(这是1角2角5角都要用上的所有情况)
#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;
}
如果想要得到一种方法便输出结果则需要利用接力break
因为break只能跳出其所在循环
#include<stdio.h>
int main()
{int x;
int one,two,five;
int exit;
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跳出循环
#include<stdio.h>
int main()
{int x;
int one,two,five;
int exit;
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;}
}
}
}out:
return 0;
}
5 前n项求和 f(n)=1+1/2+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;
}
由于是除法所以用浮点型
如果想变成奇数项加偶数项【f(n)=1-1/2+1/3-1/4+......+1/n】则只需要加一个变量然后这个变量每轮乘-1或变为自己的相反数即可
#include<stdio.h>
int main()
{int n;
int i;
int sign=1;
double sum=0.0;
scanf("%d",&n);
for(i=1;i<=n;i++){sum+=sign*1.0/i;
sign=-sign;}
printf("f(%d)=%f\n",n,sum);
return 0;
}