《算法竞赛入门经典》笔记1

《算法竞赛入门经典》笔记1

--笔记为书中的例题源码和本人做的一些课后题的解答

//2-2daffodil水仙花数

#include <stdio.h>

int main(void)

{

int num,t;

int temp = 0;

int j = 3;

for(int i = 100;i <= 999; i++)

{

t= i;

while(j--)

{

num = t%10;//依次求出各个位数上的值

temp += num *num *num;

t = t/10;

}

j = 3;

if(temp == i)

printf("%d\n",temp);

temp = 0;//记得temp清零

}

return 0;

}

#include<stdio.h>

/**

对于任意大于1的自然数n,若n为奇数,则将n变为3n+1

否则变为n的一半,总会变为1,输入n,求出这样的变换次数

*/

int main(void)

{

long n,count = 0;

scanf("%d",&n);

while(n > 1)

{

if(n%2 == 1)

{

n = n * 3 + 1;

}

else

{

n /= 2;

}

count++;

}

printf("%d\n",count);

return 0;

}

/*

计算阶乘之和

1+ 2+ .... +n! 的末六位(不含前导零)

*/

#include<stdio.h>

int main(void)

{

int n,sum = 0;

scanf("%d",&n);

for(int i = 1; i <= n; i++)

{

int factorial = 1;

for(int j = 1; j <= i; j++)

{

// factorial *= j;

factorial = factorial * j % 1000000;//防止溢出

}

sum += factorial;

}

printf("%d\n",sum%1000000);//求末六位数

return 0;

}

/*

2-4输出n层的倒三角形

*/

#include<cstdio>

int main(void)

{

int n;

scanf("%d",&n);

for(int i = 2*n - 1; i >= 1; i -= 2)

{

for(int j = 2*n-1-i; j > 0; j-=2)

{

printf(" ");

}

for(int k = i; k > 0; k--)

{

printf("#");

}

printf("\n");

}

return 0;

}

/*2-7近似计算PI/4=1-1/3+1/5-1/7+..直至最后一项小于10^-6*/

int main(void)

{

const int MAX = 1000000;

double result = 0;

double temp = 0;

int a;

for(int i = 0; i < MAX; i++)

{

temp = (i%2 == 0?1.0:-1.0)/(2*i+1);

result +=temp;

}

printf("%lf",result);

return 0;

}

//2-81/n^2+1/n+1)^2+...1/m^2 ,n<m<0^6

int main(void)

{

int n,m;

double sum=0;

scanf("%d %d",&n,&m);

//这里不能用int,因为(10^6)^2=10^12,已经超出int的取值范围

for(__int64 i = n; i <= m;i++)

{

sum += 1.0/(i * i);

}

printf("%.5f",sum);

return 0;

}

#include<stdio.h>

//输入a,b,c 输出a/b的小数形式,精确到小数点后c位。a,b<=10^6,c<=100

#define MAX 110

int main(void)

{

int arr[MAX];

int a,b,c;

int remainderTemp;

int integer;

scanf("%d %d %d",&a,&b,&c);

integer = a/b;

//arr[0]='.';

remainderTemp=a%b;

for(int i = 0; i< c; i++)

{

int resultTemp = remainderTemp * 10;

arr[i]=resultTemp/b;

remainderTemp=resultTemp%b;

}

printf("%d.",integer);

for(int i = 0; i < c;i++)

{

printf("%d",arr[i]);

}

return 0;

}

//...9组成位数abc,def,ghi,每个数字只用一次,使abc:def:ghi = 1:2:3,输出所有解

void SplitNumber(int num,int *array);

bool IsRepeat(int *,int *);

bool IsRepeatSelf(int * arr);

int main(void)

{

int b,c;

for(int i = 123; i <= 329; i++)

{

b = i*2;

c = i*3;

        int *arrA = new int[3];

        int *arrB = new int[3];

        int *arrC = new int[3];

SplitNumber(i,arrA);

SplitNumber(b,arrB);

SplitNumber(c,arrC);

        if(IsRepeatSelf(arrA))

continue;

if(IsRepeatSelf(arrB))

continue;

if(IsRepeatSelf(arrC))

continue;

if(IsRepeat(arrA,arrB))

continue;

if(IsRepeat(arrB,arrC))

continue;

if(IsRepeat(arrA,arrC))

continue;

printf("%d %d %d\n",i,b,c);

}

return 0;

}

void SplitNumber(int num,int *array)

{

int arr[3];

arr[0] = num/100;

    

    arr[1] = num/10%10;

    arr[2] = num%100%10;

for(int i = 0; i<3;i++)

    {

        array[i] = arr[i];

    }

}

bool IsRepeat(int *a,int *b)

{

for(int j = 0; j < 3; j++)

{

for(int k = 0; k < 3; k++)

{

                if(a[j] == b[k])

{

return true;

}

}

}

return false;

}

bool IsRepeatSelf(int * arr)

{

    if(arr[0] == arr[1])

        return true;

    if(arr[1] == arr[2])

        return true;

    if(arr[0] == arr[2])

        return true;

    return false;

}

posted @ 2011-04-09 11:43  xfate  阅读(366)  评论(0)    收藏  举报