循环练习题

循环的题

来自未知的

1.编写一个计算整数位数的程序

结果如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main() 
{
    int x, i = 0;
    scanf("%d", &x);
    while (x)
    {
        x /= 10;
        i++;
    }
    printf("这个数是 %d 位数\n", i);
    
    return 0;
}

2.编写一个输出乘法口诀表的程序

结果如下:

#include <stdio.h>
int main()
{
	int i, j;

	for (i = 1; i <= 9; i++)
	{
		for (j = 1; j <= i; j++)
		{
			
				printf("%d*%d=%2d  ", j, i, i * j);
		}
		printf("\n");
	}
	return 0;
}


九九乘法表分析:
左下右下三角形
将重复的数字删掉
如果是左下,则就是11
1
1
21 22 (23) (24)
31 32 33 (34)
。。。
括号中的都省略
i*j都是就j<=i

来自新希望的题

#include <stdio.h>
#include <string.h>
int main(){
	int i,k,a[10],p[3];
	k=5;
	for(i=0;i<10;i++)a[i]=1;
	for(i=0;i<3;i++)p[i]=a[i*(i+1)];
	for(i=0;i<3;i++)k=k+p[i]+2;
	printf("%d\n",k);
	return 0;
}

考点:数组,循环

分析:

第一步,初始化

第二步,三个循环

第一个循环:分别执行十次,把a数组中的所有元素均赋值为:1;

第二个循环: 分别执行三次,把p数组中的所有元素均替换为a数组的值,则就是全部替换为1;

第三个循环: 分别执行三次, 把给k赋值,k+p[i]+2=>5+1+2 …… 分别每次+3;

注意:

第二个循环中,p[i]数组赋值的是a数组中的元素,这是个数组的写法,并不是一个计算的式子,因为a的所有元素都是1,所以i*(i+1)本质上不需要进行运算。

1.求序列 2/1,3/2,5/3,8/5,13/8,21/13,… 的前 20 项之和.
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main() 
{
    float fz = 2.0, fm = 1.0, sum = 0, t;
    int i;
    for (i = 0; i < 20; i++)
    {
        sum += fz / fm;
        t = fz;
        fz = fz + fm;
        fm = t;
    }
    printf("%.2f\n", sum);
    
    return 0;
}

**分析:**这个序列从2/1开始,后一项的分子按前一项的分子分母的和,后一项分母是前一项的分子,以此类推。

  • 利用循环来遍历20项分数,注意,此时是分数的计算,数值为float,循环的控制变量用int

  • 循环体中,利用临时变量来存放a的数值,因为下列计算,要覆盖掉a原本的值,所以用t来存放,计算完后,把t的值再赋值给b,从而提供下一次循环所需要的变量。

打印一个指向右边的箭头

#define _CRT_SECURE_NO_WARNINGS 1  
#include <stdio.h>  

int main() {
    int i, k, j;
    for (k=1;k<=4;k++)
    {
        for (i = 0; i <= k - 1; i++)
        {
            printf(" ");
        }
        for (j = 0; j < 5; j++)
        {
            printf("*");
        }
        
        printf("\n");
    }
    for (k = 3; k >= 1; k--)
    {
        for (i = 0; i <= k - 1; i++)
        {
            printf(" ");
        }
        for (j = 0; j < 5; j++)
        {
            printf("*");
        }
        printf("\n");
    }
    return 0;
}

2.求sum=1+12+123+1234+12345

#include <stdio.h>
int main() {
	int i, t = 0, sum = 0;
	for (i = 1; i < 6; i++)
	{
		t = i + t * 10;
		sum += t;
		printf("%d + %d", i, t); //此行代码非必要
	}
	printf(" = %d \n",sum);
	return 0;
}
  1. 点是否在圆上:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include <math.h>
double twoPointDistance(double x1, double y1, double x2, double y2) {
    double deltaX = x2 - x1;
    double deltaY = y2 - y1;
    
    return sqrt(deltaX * deltaX + deltaY * deltaY);
}//点到点的距离,欧几里得公式
int main()
{   //n代表几个点,x,y代表变量坐标,x1,y1代表圆的坐标
    int n, x, y, r, i, count = 0, x1, y1,arr[30],arrIndex=0;
    double tempR;
    printf("请输入一共有几个点\n");
    scanf("%d", &n);
    printf("请输入圆的坐标以及半径\n");
    scanf("%d %d %d", &x1, &y1, &r);
    for (i = 0; i < n; i++)
    {
        printf("请输入第%d个点的坐标\n", i + 1);
        scanf("%d %d", &x, &y);
        tempR= twoPointDistance(x1, y1, x, y);
        if (tempR <= r)
        {
            count++;
            arr[arrIndex] = x;
            arr[arrIndex + 1] = y;
            arrIndex += 2;
        }
    }
    arrIndex = 0;
    printf("一共有%d个点在圆上\n", count);
    printf("它们的坐标是\n");
    for (i = 0; i < count; i++)
    {
        printf("%d %d\n", arr[arrIndex], arr[arrIndex + 1]);
        arrIndex += 2;
    }
    return 0;
}
  1. 5x5二维数组赋值1-25,把主副对角线上下三角的数值,都打印出来,要求格式化输出
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main() 
{
    int a[5][5], number = 1, i, j, k, space = 4;
    for (i = 0; i < 5; i++)
    {
        for (j = 0; j < 5; j++)
        {
            a[i][j] = number++;
        }
    }
    for (i = 0; i < 5; i++)
    {
        for (j = 0; j < 5; j++)
        {
            printf("%-3d", a[i][j]);
        }
        printf("\n");
    }
    printf("\n主对角线下三角形\n");
    for (i = 0; i < 5; i++)
    {
        for (j = 0; j <= i; j++)
        {
            printf("%-3d", a[i][j]);
        }
        printf("\n");
    }
    printf("\n副对角线上三角形\n");
    for (i = 0; i < 5; i++)
    {
        for (j = 0; j < 5 - i; j++)
        {
            printf("%-3d", a[i][j]);
        }
        printf("\n");
    }
    printf("\n副对角线下三角形\n");
    for (i = 0; i < 5; i++)
    {
        for (k = 0; k < space; k++)
        {
            printf("   ");
        }
        space--;
        for (j = 4-i; j <5; j++)
        {
            printf("%-3d", a[i][j]);
        }
        printf("\n");
    }
    space = 0;
    printf("\n主对角线上三角形\n");
    for (i = 0; i < 5; i++)
    {
        for (k = 0; k < space; k++)
        {
            printf("   ");
        }
        space++;
        for (j = i; j < 5; j++)
        {
            printf("%-3d", a[i][j]);
        }
        printf("\n");
    }
    return 0;
}

真题链接

21.程序填空题(2020)

21.已知函数Fun21的部分代码如下所示,其功能是:从低位开始取出长整型变量x中奇数位上的数字,并构成一个数返回。例如,若x的值为1234567,则返回值为1357,请在空格处补充程序。

long Fun21(long x)

{

long res, base=10;

​                   

while(x>0)

{

   x=x/100;

   res=x%10*base+res;

​                     

}

return res;

}

完整代码:

#include <stdio.h>
long Fun21(long x)
{
  long res, base=10;
  res=x%10; 
  while(x>0)
  {
    x=x/100;
    res=x%10*base+res;
    base=base*10;    
  }
  return res;
}
int main()
{
   long n;
   printf("请输入一个整数:");scanf("%d",&n);
   printf("%d奇数位上的数字组成的整数为:%d\n",n,Fun21(n));
   return 0;
}

100以内的素数

方法一:(自己的布尔类型)

#define _CRT_SECURE_NO_WARNINGS 1  
#include <stdio.h>
int main() {
	int i, n, sum = 0,myBool;

	for (n = 2; n <= 100; n++)
	{
		myBool = 1;
		for (i = 2; i < n; i++)
		{
			if (n % i == 0)
			{
				myBool = 0; //如果找到可以被n整除的i,则n不是素数
				break;
			}
		}
		if (myBool) {
			sum += n;
		}
	}
	printf("%d\n", sum);
	
	return 0;
}

方法二:(最优解)

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

int main() {
    int i, n, sum = 0;

    for (n = 2; n <= 100; n++) { // 遍历2到100之间的所有数
        for (i = 2; i < n; i++) { // 检查n是否能被2到n-1之间的任何数整除
            if (n % i == 0) {
                break; // 如果n能被i整除,则跳出内部循环,n不是素数
            }
        }
        if (i == n) { // 如果内部循环正常结束(即没有找到能整除n的i),则n是素数
            sum += n; // 将n加到总和中
        }
    }

    printf("100以内的素数和是: %d\n", sum); // 打印总和

    return 0;
} 

打印素数和总和

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main() {
	int num, i,j=0,sum=0;
	for (num = 2; num <= 100; num++)
	{
		for (i = 2; i < num; i++)
		{
			if (num % i == 0)
				break;
		}
		if (num == i)
		{
			printf("%3d", num);
			sum += num;
			j++;
			if (j % 5 == 0)
			{
				printf("\n");
			}
		}
	}
	printf("100以内素数总和为 %d\n", sum);
	
    return 0;
}

方法三(函数):

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int isSu(int n)
{
	int i;
	for (i = 2; i < n; i++)
		if (n % i == 0)
			return 0;
	return 1;
}
int main() {
	int i, sum = 0;
	for (i = 2; i <= 100; i++)
		if (isSu(i))
			sum += i;
	printf("%d", sum);
	return 0;
}

最大公约数和最小公倍数

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main() 
{
    int m, n, temp, r, c;
    scanf("%d %d", &m, &n);
    if (m < n)
    {
        temp = n;
        n = m;
        m = temp;
    }
    c = m * n;
    while (n) {
        r = m % n;
        m = n;
        n = r;
    }
    printf("最大公约数:%d\n", m);
    printf("最小公倍数:%d\n",c / m );
    return 0;
}

库课

p45 四-2 编写程序,输入数字(0<N<10),输出金字塔,如输入4,则输出以下例子

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

#include <stdio.h>
int main() {
	int i, j, k, num = 1, N = 0;//ijk三个循环下标,num是每行的数字
	scanf("%d", &N);
	int space = N, cols = 1;  //space控制空格打印的数量,cols控制数字的列数
	if (N > 0 && N < 10)
	{
		for (i = 1; i <= N; i++)
		{
			for(k=1;k<space;k++)
			{
				printf(" ");
			}//内层有两个同级别循环,第一个控制空格的打印,第二个控制数字的打印
			for (j = 1; j <= cols; j++)
			{
				printf("%d ", num);
			}
			printf("\n");
			cols++;
			space--;
			num++;
		}
	}
	return 0;
}

N<10),输出金字塔,如输入4,则输出以下例子**

[外链图片转存中…(img-GrniSAkH-1741884203477)]

#include <stdio.h>
int main() {
	int i, j, k, num = 1, N = 0;//ijk三个循环下标,num是每行的数字
	scanf("%d", &N);
	int space = N, cols = 1;  //space控制空格打印的数量,cols控制数字的列数
	if (N > 0 && N < 10)
	{
		for (i = 1; i <= N; i++)
		{
			for(k=1;k<space;k++)
			{
				printf(" ");
			}//内层有两个同级别循环,第一个控制空格的打印,第二个控制数字的打印
			for (j = 1; j <= cols; j++)
			{
				printf("%d ", num);
			}
			printf("\n");
			cols++;
			space--;
			num++;
		}
	}
	return 0;
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值