c语言算法竞赛入门经典百度云,《算法竞赛入门经典》CH-2(C语言)

中国剩余定理,题目要求:

每组数据包含3个非负整数a,b,c,表示队尾人数(a<3, b<5, c<7),输出总人数的最小值(或报告无解)。已知总人数不小于10,不超过100。输入到文件结束为止。

我的这个解法是考虑到测试输入的a,b,c都满足条件,未对其进行合法判定。其实还应该加入对a, b , c对于3,5,7的大小判定才更加严密。

//韩信点兵问题,又称中国剩余定理

//5和7的公倍数除以3余1的最小数是70

//3和7的公倍数除以5余1的最小数是21

//3和5的公倍数除以7余1的最小数是15

//总数除以3、5、7的余数分别设为a,b,c

//则sum = a*70 + b*21 + c*15

//再按范围减去105(3, 5, 7的最小公倍数)

#include

int main()

{

int a, b, c;

int kase = 0;

while(scanf("%d%d%d", &a, &b, &c)==3)

{

int sum = 0;

sum = a*70 + b*21 + c*15;

while(sum > 100)

{

sum -= 105;

}

if(sum < 10)

{

printf("Case%d: No answer\n", kase);

}

else

{

printf("Case%d: %d\n", kase,sum);

}

kase++;

}

return 0;

}

子序列的和,题目要求:

输入两个正整数 n

样例输入:

2 4

65536 655360

0 0

样例输出:

Case1: 0.42361

Case2: 0.00001

//主要在于m<10^6,算法竞赛中的int类型范围大约是+-2*10^10,

//所以i^2可能会超过int类型表示的范围,要用更大的类型来存储

#include

int main()

{

long n,m;

int kase = 1;

while(scanf("%ld%ld", &n, &m)==2 && n && m)

{

double sum = 0;

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

{

sum += (double)1/(i*i);

}

printf("Case%d: %.5f\n", kase, sum);

kase++;

}

return 0;

}

分数化小数

输入正整数a,b,c,输出a/b的小数形式,精确到小数点后c位。a,b<=10^6,c<=100。输入包含多组数据,结束标记为 a = b = c = 0。

样例输入:

1 6 4

0 0 0

样例输出:

Case1: 0.1667

//关键在于小数部分的除法究竟是怎样除的

//已经太习惯去除但是忘记了究竟是怎样的原理

//就是把小数当做整数一样除,不过得到的商放在小数点之后

void decimal(int a, int b, int c)

{

printf("%d.", a/b);

int rem = a%b;

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

{

rem *= 10;

printf("%d", rem/b);

rem = rem%b;

}

}

题目:

用1,2,3,...,9组成3个三位数abc,def和ghi,每个数字恰好使用一次,要求abc:def:ghi = 1:2:3。按照“abc def ghi”的格式输出所有解,每行一个解。提示:不必太动脑筋(既然题目说了不必太懂脑筋我就用了非常暴力的方法,见method2)

暴力法求解的完整代码

//由1~9的和为45,9!= 362880判定是否互异

//其实在不知道结果的前提下不够严谨

//要学会熟练运用指针

//method 1

#include

void result(int num, int *result_add, int *result_multi)

{

int a = num/100;

int b = num/10%10;

int c = num%10;

*result_add += (a+b+c);

*result_multi *= (a*b*c);

}

int main()

{

int result_add , result_multi;

for(int abc = 100; abc < 333; abc++)

{

int def = 2*abc;

int ghi = 3*abc;

result_add = 0;

result_multi = 1;

result(abc, &result_add, &result_multi);

result(def, &result_add, &result_multi);

result(ghi, &result_add, &result_multi);

//判断是否互异

if(result_add == 45 && result_multi == 362880)

{

printf("%d %d %d\n", abc, def, ghi);

}

}

return 0;

}

//method 2 片段

for(i = 1; i < 10; i++)

{

if(i == a){continue;}

if(i == b){continue;}

if(i == c){continue;}

if(i == d){continue;}

if(i == e){continue;}

if(i == f){continue;}

if(i == g){continue;}

if(i == h){continue;}

int abc = 100*a + 10*b + c;

int def = 100*d + 10*e + f;

int ghi = 100*g + 10*h + i;

if(def == 2*abc && ghi == 3*abc)

{

printf("%d %d %d\n", abc, def, ghi);

}

int main()

{

permutation();

return 0;

}

实验

30cddc181adc?nomobile=yes

实验代码

30cddc181adc?nomobile=yes

Xcode给出的警告

30cddc181adc?nomobile=yes

输出结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值