For循环经典题目(钻石,辗转相除法,(优化版)冒泡排序)

1.求一个sn=a+aa+aaa+aaaa+aaaaa之值,其中a和n的值由键盘输入

#include <stdio.h>
int main()
{
	int i = 0, j = 0;
	int n;
	int a;
	int sum = 0;
	printf("请输入a和n的值:\n");
	scanf_s("%d%d", &a,&n);
	for (i = 1; i <= n; i++)
	{
		{//如果sum放在后面的话,假设a=2,那么sum里面的第一个值就是20,显然不符合题意,所以还是交换一下顺序比较好
			sum = sum + a;//这里假设输入的a值为2的话,那么sum里面的第一个值就是2,这样就是对的
			a += a * 10;//这里是a=a+a*10的简写形式,为什么要把这个东西放在sum后面呢?
		}//原因很简单就是因为如果放在前面的话,那么第一个sum里面放的就是
	}
	printf("sum=%d", sum);

	return 0;
}

 2.展现出一个钻石

 

#include <stdio.h>
int main()
{
	int i, j, k;
	for (i = 0; i <= 3; i++)//这里注意了,如果把i=0改成了i=2,那么就会输出一个钻石形状的东西哦
	{//注意了这里i<=3是因为要输出前四行,所以用了i<=3这个东西
		for (j = 0; j <= 2 - i; j++)//当i=2时,只会循环一次,也就是打印一个空格
		{//当i=3时,j小于等于一个负数怎么可能成立,所以判定为假,到此,这个循环结束,也就是说不再打印空格
			printf(" ");
		}
		for (k = 0; k <= 2 * i; k++)//至于这里为什么是k<=2*1呢,这个要自己分析才能看出来
		{//比如i=0时,只有一个*号;i=1时,有3个*号;i=2时,有5个*号;又因为k时从零开始算的
			printf("*");//但其实写成k=1;k <=2*i+1;也行,就是不够简洁
		}
		printf("\n");
	}
	for (i = 0; i <= 2; i++)//这里为什么又是2呢,因为要输出后面的3行了
	{//前面的四行空格是倒三角的结构,而后面的空格是正三角结构,所以是j<=i了;
		for (j = 0; j <= i; j++)
		{
			printf(" ");
		}
		for (k = 0; k <= 4 - 2 * i; k++)//关于这里为什么是k<=4-2*i呢?
		{
			printf("*");//自己可以找规律啊,反正是可以自己总结出这个公式的
		}
		printf("\n");//注意这个换行符是在最外层的for循环里面的啊;
	}
	return 0;
}

 3.求两个数的最大公约数(辗转相除法(欧几里得算法))

#include <stdio.h>
int main()
{
	int m, n;
	scanf_s("%d%d", &m, &n);
	int r = m % n;//把m模n的值放进r里面
	for (;r;)//这里就是一个简单的循环,其中就给了一个判断条件最中间的r如果等于0的话
	{//那么循环就会停止,按照试除法的原理,那么最后的除数也就是源代码中的n就是我们要找的最大公约数了;
		m = n;//欧几里得算法原理:用除数去除以两个数相除所得的余数,一直进行下去,直到余数为0就行;
		n = r;
	}
	printf("%d", n);//所以这里打印的是n的值
	return 0;
}

4.使用冒泡排序对10个数进行排序(升序)

#include <stdio.h>
int main()
{
	int arr[10] = {0};//这个里面的0不要也没关系;
	int i,j ;//这里在声明一点,for循环小括号里面的只是一个外部结构,你用任何字母都可以
	int t=0;//只有for循环大括号里面的才是所要做的事情;小括号里面的东西只是决定循环多少次而已
	for (i = 0; i < 10; i++)
	{
		scanf_s("%d", &arr[i]);//关于这里取不取地址符,我不取他不让我运行,我取了就可以,那应该是这里的arr表示的不是一个地址吧?
	}
	for (j= 0; j < 9; j++)//为什么是j<9呢,因为n个数要排序,只要进行(n-1)次外层循环就行了
	{
		int pause = 0;
		for (i = 0; i < 9-j; i++)//这里为什么是(i<9-j)呢?
		{//实在不理解假设j=0,如果此时(i<10-j)的话,那么i的最大值就是9,那么后面的i+1不就是10了么!
			if (arr[i] <= arr[i + 1])//若是降序直接将大于等于改为小于等于就行
			{//这里是交换顺序的一个操作
				t = arr[i];//注意:当if后面的语句超过一行时,要加大括号,我之前没加大括号一直出错
				arr[i] = arr[i + 1];//后面才看到,为了方便,建议还是加一个大括号(就算只有一条语句)
				arr[i + 1] = t;//这样可以有效避免出错;
				pause = 1;
			}
		}//第82行代码的续:则此时对应arr[10],但是arr里面总共才10个元素,最大应该是arr[9]啊,所以是(9-i)
		if (pause == 0)//为什么放在这个位置?
		{//请看下行!
			break;
		}
	}
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);//前面的代码已经排序完成了,这里只要打印出来就行;
	}
	return 0;
}//我对第77行代码有一点小疑问
//如果将上面所有有关pause的全部代码删掉,那么就也会成功,但是这样会很麻烦,因为要比较的次数变多了!
//如果将上面的pause保留下来,就是一个很好的提前终止程序运行的代码!
//注意哦!上面的代码最后面的pause语句是放在第一个for循环语句里面的,不能放在第二个里面哦,因为
//就算你放在了第二个里面也没有多大作用!因为第二个for循环里面有一个if语句,它自己内部排序好了之后
//自己会跳出本次循环,根本不要再里面加我的这个pause变量!
//至于为什么放在第二个for循环里面呢?因为当你已经全部排好了之后,再进去这个循环已经没什么用了
//最后,if语句的执行条件是pause==0;那么就不会执行这个break语句,刚好达到我所想要的目的!

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值