《算法競賽入門經(jīng)典》CH-2(C語言)

第二章完整代碼

中國剩余定理,題目要求:

每組數(shù)據(jù)包含3個非負整數(shù)a,b,c,表示隊尾人數(shù)(a<3, b<5, c<7),輸出總?cè)藬?shù)的最小值(或報告無解)。已知總?cè)藬?shù)不小于10,不超過100。輸入到文件結(jié)束為止。
我的這個解法是考慮到測試輸入的a,b,c都滿足條件,未對其進行合法判定。其實還應(yīng)該加入對a, b , c對于3,5,7的大小判定才更加嚴(yán)密。

//韓信點兵問題,又稱中國剩余定理
//5和7的公倍數(shù)除以3余1的最小數(shù)是70
//3和7的公倍數(shù)除以5余1的最小數(shù)是21
//3和5的公倍數(shù)除以7余1的最小數(shù)是15
//總數(shù)除以3、5、7的余數(shù)分別設(shè)為a,b,c
//則sum = a*70 + b*21 + c*15
//再按范圍減去105(3, 5, 7的最小公倍數(shù))
#include <stdio.h>
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;
}

子序列的和,題目要求:

輸入兩個正整數(shù) n<m<10^6, 輸入1/n^2+1/(n+1)^2+...+1/m^2,保留5位小數(shù)。輸入包含多組數(shù)據(jù),結(jié)束標(biāo)記為n=m=0。
樣例輸入:
2 4
65536 655360
0 0
樣例輸出:
Case1: 0.42361
Case2: 0.00001

//主要在于m<10^6,算法競賽中的int類型范圍大約是+-2*10^10,
//所以i^2可能會超過int類型表示的范圍,要用更大的類型來存儲
#include <stdio.h>
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;
}

分?jǐn)?shù)化小數(shù)

輸入正整數(shù)a,b,c,輸出a/b的小數(shù)形式,精確到小數(shù)點后c位。a,b<=10^6,c<=100。輸入包含多組數(shù)據(jù),結(jié)束標(biāo)記為 a = b = c = 0。
樣例輸入:
1 6 4
0 0 0
樣例輸出:
Case1: 0.1667

//關(guān)鍵在于小數(shù)部分的除法究竟是怎樣除的
//已經(jīng)太習(xí)慣去除但是忘記了究竟是怎樣的原理
//就是把小數(shù)當(dāng)做整數(shù)一樣除,不過得到的商放在小數(shù)點之后
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個三位數(shù)abc,def和ghi,每個數(shù)字恰好使用一次,要求abc:def:ghi = 1:2:3。按照“abc def ghi”的格式輸出所有解,每行一個解。提示:不必太動腦筋(既然題目說了不必太懂腦筋我就用了非常暴力的方法,見method2)
暴力法求解的完整代碼

//由1~9的和為45,9!= 362880判定是否互異
//其實在不知道結(jié)果的前提下不夠嚴(yán)謹(jǐn)
//要學(xué)會熟練運用指針
//method 1
#include <stdio.h>
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給出的警告
輸出結(jié)果
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容