《算法竞赛入门经典》笔记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-8求1/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;
}

浙公网安备 33010602011771号