求前n项之和
程序设计
- f(n)=1++++…+
起点终点数字已知,用for循环最合适
#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;
}
pritnf("f(%d)=%f\n", n, sum);
return 0;
}
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);
- f(n)=1-+-+…+
法一
#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;
}
法二
#include <stdio.h>
int main()
{
int n;
int i;
double sum=0.0;
double sign=1.0;
scanf("%d", &n);
for( i=1; i<=n; i++ ) {
sum += sign/i;
sign = -sign;
}
printf("f(%d)=%f\n", n, sum);
return 0;
}
整数分解
正序分解整数
输入一个非负整数,正序输出他的每一位数字
eg.输入:13425;输出:1 3 4 2 5
step1.逆序输出
#include <stdio.h>
int main()
{
int x;
scanf("%d", &x);
do {
int d = x%10;
printf("%d", d);
x /= 10;
} while ( x>0 );
return 0;
}
此时,输出结果最末尾的1(以13425为例)后面也会有空格
改进:
#include <stdio.h>
int main()
{
int x;
scanf("%d", &x);
do {
int d = x%10;
printf("%d", d);
if( x > 9 ) {
printf(" ");
}
x /= 10;
} while ( x>0 );
printf("\n");
return 0;
}
现在1后就没有空格了
step2.将逆序正过来
先逆序再逆序
#include <stdio.h>
int main()
{
int x;
scanf("%d", &x);
do {
int d = x%10;
printf("%d", d);
if ( x>9 ) {
printf(" ");
}
x /= 10;
} while ( x>0 );
printf("\n");
return 0;
}
但是,当输入值为70000时,输出结果是7而不是想要的00007,上述程序只适用于末尾不是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;
#include <stdio.h>
int main()
{
int x;
scanf("%d", &x);
x=13425;
int mask=10000;
do {
int d = x/mask;
printf("%d", d);
if( x>9 ) {
printf(" ");
}
x %= mask;
mask /= 10;
} while ( x>0 );
printf("\n");
return 0;
}
输入70000,结果依旧是7
原因:
70000 / 10000 >> 7
70000 % 10000 >> 0
改进:
#include <stdio.h>
int main()
{
int x;
scanf("%d", &x);
x=13425;
int mask=10000;
do {
int d = x/mask;
printf("%d", d);
if( mask>9 ) {
printf(" ");
}
x %= mask;
mask /= 10;
} while ( mask>0 );
printf("\n");
return 0;
}
step3.将mask改成可以自己变的值
法一:pow
#include <stdio.h>
int main()
{
int x;
scanf("%d", &x);
int cnt=0;
do {
x /= 10;
cnt++;
} while (x>0);
printf("cnt=%d/n", cnt);
int mask = pow(10, cnt-1);
do {
int d=x/mask;
printf("%d", d);
if( mask>9 ){
printf(" ");
}
x %= mask;
mask /= 10;
}while (mask>0);
printf("\n");
return 0;
}
法二:
#include <stdio.h>
int main()
{
int x;
scanf("%d", &x);
int cnt=0;
int mask=1;
int t=x;
while( t>9) {
t /= 10;
mask *= 10;
}
printf("mask=%d/n", mask);
int mask = pow(10, cnt-1);
do {
int d=x/mask;
printf("%d", d);
if( mask>9 ){
printf(" ");
}
x %= mask;
mask /= 10;
}while (mask>0);
printf("\n");
return 0;
}
求最大公约数
枚举
- 设t为2
- 如果u和v都能被t整除,则记下这个t
- t加1后重复第2步,直到t等于u或v
- 曾经记下的最大的可以同时整除u和v的t就是gcd
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);
辗转相除
- 如果b等于0,计算结束,a就是最大公约数
- 否则,计算a除以b的余数,让a等于b,而b等于那个余数
- 回到第一步
a b t
12 18 12
18 12 6
12 6 0
6 0
最大公约数=a=6
#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("gcd=%d\n", a);
return 0;
}