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;
}