C语言程序设计CAP——C语言学习笔记(五) 下

5.3循环应用

 

#include <stdio.h>

int main()
{
	int n;
	int i;
	double ret=0.0;

	scanf("%d", &n);
	for ( i=1; i<=n; i++ ) {
		ret += 1.0/i;
	}
	printf("%f\n", ret);

	return 0;
}

#include <stdio.h>

int main()
{
	int n;
	int i;
	double ret=0.0;
	int sign = 1;

	scanf("%d", &n);
	for ( i=1; i<=n; i++ ) {
		ret += 1.0*sign/i;
		sign = -sign;
	}
	printf("%f\n", ret);

	return 0;
}

 正序分解整数
• 输入一个非负整数,正序输出它的每⼀一位数字
• 输入:13425
• 输出:1 3 4 2 5

分解整数输出

 还没解决结尾的空格问题!



 • 但是是逆序的! 

 • 如果能有这么一个mask

 • 计算x的位数

 • pow?
• #include <math.h>
• pow是浮点运算,慢

 • 直接算mask
• mask=100000?
• 因为第一轮mask就是10了
• 怎么办?

 • 改变循环的条件,让它少做一轮

• 改变循环的条件,让它少做一轮
• 但是最后的结果为什么不对?

 

 • 因为x在第一个循环中被改变了
• 需要⽤用另外的变量代替x做计算

#include <stdio.h>

int main()
{
	int x;
	scanf("%d", &x);

	int mask = 1;
	int t = x;
	while ( t>9 ) {
		t /= 10;
		mask *=10;
	} 
	printf("x=%d, mask=%d\n", x, 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;
2. 如果u和v都能被t整除,则记下这个t
3. t加1后重复第2步,直到t等于u或v;
4. 那么,曾经记下的最大的可以同时整除u和v的t就是gcd

辗转相除法

1. 如果b等于0,计算结束,a就是最大公约数;
2. 否则,计算a除以b的余数,让a等于b,而b等于那个余数;
3. 回到第一步。

#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;
}
//辗转相除法
#include <stdio.h>

int main()
{
	int a,b;
	int t;
	
	scanf("%d %d", &a, &b);
	int origa = a;
	int origb = b;
	while ( b != 0 ) {
		t = a%b;
		a = b;
		b = t;
	}
	printf("%d和%d的最大公约数是%d.\n", origa, origb, a);
	
	return 0;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值