c语言学习笔记
for循环
for循环像一个计数循环:设定一个计数器,初始化 它,然后在计数器到达某值之前,重复执行循环体, 而每执行一轮循环,计数器值以一定步进进行调整, 比如加1或者减1
for (i=0;i<5;i=i+1)
{ printf("%d",i);
}
for =对于
- for (count=10; count>0; count--)
- 就读成:“对于一开始的count=10,当 count>0时,重复做循环体,每一轮循环 在做完循环体内语句后,使得count--。”
算阶乘
- n!= 1×2×3×4×...xn
- 写一个程序,让用户输入n,然后计算输 出n!
变量:
- 显然读用户的输入需要一个int的n,然后 计算的结果需要用一个变量保存,可以 是int的factor,在计算中需要有一个变量 不断地从1递增到n,那可以是int的i。
# include <stdio.h>
int main (){
int n;
int i=1;
int fact=1;
scanf("%d",&n);
for (i=1;i<=n;i++){
fact*=i;
}
printf("%d!=%d\n",n,fact);
return 0;
}
循环控制变量i只在循环里被使用了,在循 环外面它没有任何用处。因此,我们可以 把变量i的定义写到for语句里面去。
int n;
scanf("sd", &n);
int fact = 1;
for (int i=1; i<=n; i++){ fact *= i;
printf("sd!=*d\n", n, fact);
循环的计算和选择
循环次数
- for (i=0;i<n;i++)
- 则循环的次数是n,而循环结束以后,i的 值是n。循环的控制变量i,是选择从0开始 还是从1开始,是判断i<n还是判断i<=n, 对循环的次数,循环结束后变量的值都有 影响。
for循环
- for(初始动作;条件;每轮的动作){ }
- for中的每一个表达式都是可以省略的 for (;条件;)== while(条件)
选择
- 如果有固定次数,用for
- 如果必须执行一次,用do_while
- 其他情况用while
循环控制
判断素数
素数
- 只能被1和自己整除的数
- 1, 2, 3, 5, 7, 11,13,17, 19....
# include <stdio.h>
int main (){
int x;
int i;
scanf("%d",&x);
int isprime = 1;//x是素数
for (i=2;i<x;i++){
if (x%i==0){
isprime=0;
break;
}
}
if(isprime==1){
printf("是素数\n");
}else{
printf("不是素数");
}
return 0;
}
continue和break
- break:跳出循环
- continue:跳过循环这一轮剩下的语句进入 下一轮
- 只能对它所在的那层循环做
同学们依次站起来唱歌
continue:一位同学唱歌唱到一半,指令,然后不唱了,直接下一个人唱继续循环。
break:一位同学唱歌唱到一半,指令,然后不唱了,直接下一个人不唱了跳出循环。
输出100以内的素数
# include <stdio.h>
int main (){
int x;
for(x=1;x<=100;x++){
int i;
int isprime = 1;//x是素数
for (i=2;i<x;i++){
if (x%i==0){
isprime=0;
break;
}
}
if(isprime==1){
printf("%d\n",x);
}
}
return 0;
}
嵌套的循环
- 循环里面还是循环
找50个素数
# include <stdio.h>
int main (){
int x;
int cnt=0;//用来计数
for(x=1;cnt<50;x++){//计数器到50时停止循环
int i;
int isprime = 1;//x是素数
for (i=2;i<x;i++){
if (x%i==0){
isprime=0;
break;
}
}
if(isprime==1){
cnt++;//每找到一个素数计数器加一
printf("%d\t",x);
if(cnt %5 == 0) {
printf("\n");//每输出5个数换一行
}
}
}
return 0;
}
从嵌套的循环中跳出
凑硬币
- 如何用1角、2角和5角的硬币凑出10元以 下的金额呢?
# 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改:一般从最内侧跳到最外侧时才用goto
# 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;
goto out;
}
}
}
}
out:
return 0;
}
前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;
}
改
V# 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 +=sign*1.0/i;
sign = -sign;
}
printf("f(%d)=%f\n",n,sum);
return 0;
}
整数分解
正序分解整数
- 输入一个非负整数,正序输出它的每一位数字
- 输入:13425
- 输出:13 4 2 5
#include <stdio.h>
int main()
{
int x;
scanf("%d",&x);
int t =0;
do{
int d =x%10;
t = t*10+d;
x/=10;
} while(x>0);
x=t;//先逆序一遍再逆序输出,解决输出结果逆序问题。
do{
int d = x%10;
printf("%d ",d);
if(x>9){
printf(" ");//解决输出的数末尾多余的0的问题
}
x /=10;
}while(x>0);
printf("\n");
return 0;
}
存在问题:此程序只适用于末尾无0的数据。
x=13425;
13425 % 10000 ->1
13425 / 10000 ->3425
10000 / 10 ->1000
3425 % 1000 ->3
3425 / 1000 ->425
1000 / 10 ->100
425 % 100 ->4
425 / 100 ->25
100 / 10 ->10
25 % 10 ->2
25 / 10 ->5
10 / 10 ->1
5 % 1 ->5
5 / 1 ->5
1 /10 ->0
int mask = 10000;
do{
int d = x / mask;
x %= mask;
mask /=10;
}while(mask>0);
printf("%d,d");
完整程序:
#include <stdio.h>
int main()
{
int x;
scanf("%d",&x);
int mask = 1;
int t = x;
while (t>9){
t /=10;
mask *=10;
}//读取数的位数并使mask可以随输入的数的变化而变化
do{
int d = x / mask;
printf("%d",d);
if (mask >9){
printf(" ");
}
x %=mask;
mask /=10;
}while(mask > 0);
printf("\n");
return 0;
}
求最大公约数
- 输入两个数a和b,输出它们的最大公约数
- 输入:12 18
- 输出:6
法1.权举
- 设t为2;
- 如果u和v都能被t 整除,则记下这个t
- t加1后重复第2 步,直到t等于u或 四
- 那么,曾经记下的 最大的可以同时整 除u和v的t就是gcd
#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);
return 0;
}
法2.辗转相除法
- 如果b等于0,计算结束,a就是最大公约数;
- 否则,计算a除以b的余数,让a等于b,而b等于那个 余数;
- 回到第一步。
#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("最大公约数是%d.\n",a);
return 0;
}