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;
}
實驗
實驗代碼
Xcode給出的警告
輸出結果
總結
以上是生活随笔為你收集整理的c语言算法竞赛入门经典百度云,《算法竞赛入门经典》CH-2(C语言)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 融资杠杆是什么
- 下一篇: c语言铁道,C语言程序设计(方少卿) 铁