例題1:握手問題
方法1:數學推理(簡單粗暴)
方法2:用代碼實現方法1
#include<iostream>
using namespace std;
int main()
{int result = 0;for (int i = 1; i <= 49; i++){for (int j = i + 1; j <= 50; j++){//第i個人與第j個人之間的握手總次數(不考慮這7個人之間互不握手)result++;}}//這7個人之間握手的次數是21次cout << result - 21;return 0;
}
方法3:直接計算握手的總次數
#include<iostream>
using namespace std;
int main()
{int arr[51] = { 0 };for (int i = 1; i <= 7; i++)arr[i] = 1;//假設前7個人之間互不握手,在數組中用1做標記int result = 0;for (int i = 1; i <= 49; i++){for (int j = i + 1; j <= 50; j++){//第i個人與第j個人握手if (!(arr[i] == 1 && arr[j] == 1))result++;}}cout << result;return 0;
}
例題2:好數(兩種方法)
方法1:從最低位開始,逐位判斷每一位是否滿足好數的條件
#include <iostream>
using namespace std;
bool hN(int x)
{int t = 1;//此時t表示最低位 while (x != 0){if (t % 2 == 1)//若奇數位上的數是偶數,則該數不是好數 {if ((x % 10) % 2 == 0)return false;}else//若偶數位上的數是奇數,則該數不是好數 {if ((x % 10) % 2 == 1)return false;}x /= 10;t++;}return true;
}int main()
{int N = 0;cin >> N;int sum = 0;for (int i = 1; i <= N; i++){if (hN(i) == true)sum++;}cout << sum;return 0;
}
方法2:分別得到奇數位與偶數位,然后判斷是否滿足好數的條件
#include <iostream>
using namespace std;
bool hNum(int x)
{int temp=x/10;while(x)//判斷奇數位上的數是否是偶數{if((x%10)%2==0)return false;x/=100;}while(temp)//判斷偶數位上的數是否是奇數{if((temp%10)%2==1)return false;temp/=100;}return true;
}int main()
{int N=0,count=0;cin>>N;for(int i=1;i<=N;i++){if(hNum(i))count++;}cout<<count;return 0;
}
例題3:牛數問題(一種正確解法和一種看起來正確的解法)
第一年的時候,有一頭母牛,它從第二年開始,每年年初生一頭小母牛,每頭小母牛從第4個年頭開始,也生一頭小母牛,請問第n年的時候,有多少頭牛?(n>0&&n<55)
方法1(看起來正確):數學推理法
n>3時的公式是根據n=4~7的數據推導的,也就是說當n<=7時滿足公式,其余情況下就不滿足了,例如當n=8時,公式得出的結果是18,但正確結果是19(我只能說太坑了)
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<math.h>
unsigned int sum(unsigned int n)
{if (n <= 3)return n;elsereturn (pow(n, 2) - 5 * n) / 2 + 6;
}int main()
{unsigned int n = 0;printf("請輸入年份\n");scanf("%u", &n);unsigned int count = sum(n);printf("第%u年有%u頭牛", n, count);return 0;
}
方法2(正確解法)
#include<iostream>
using namespace std;
/*
經分析可知,一共有四種牛,分別用a、b1、b2、b3表示這四種牛的數量
a:母牛的數量
b1:1歲的小母牛的數量
b2:2歲的小母牛的數量
b3:3歲的小母牛的數量
*/int main()
{int num[55];//num[1]~num[54]存儲第1~54年牛的數量 int a=1,b1=0,b2=0,b3=0;//第一年四種牛的數目 num[1]=1;for(int i=2;i<55;i++) {a = a + b3;//第i年的母牛數 = 第i-1年的(母牛數 + 3歲的小母牛數 )//for循環用于求第i年的牛數num[i] = num[i-1] + a; //第i年的牛數 = 第i-1年的牛數 + 第i年年初母牛生的小母牛的數量b3 = b2;//第i年的3歲小母牛數 = 第i-1年的2歲小母牛數b2 = b1;//第i年的2歲小母牛數 = 第i-1年的1歲小母牛數/ b1 = a; //第i年的1歲小母牛數 = 第i年的母牛數 }int n;cout<<"請輸入年份\n" ;cin>>n;cout<<num[n];return 0;
}
例題3:蛇形上三角
思路
創建一個100行100列的數組,存儲100行的蛇形上三角,再根據輸入n的值,打印對應的蛇形上三角
#include<iostream>
using namespace std;
int main()
{int arr[100][100]={1};/*
5行的蛇形上三角 0 1 2 3 4
0 1 3 6 10 15
1 2 5 9 14
2 4 8 13
3 7 12
4 11*/int temp=1;for(int i=1;i<100;i++){arr[i][0]=arr[i-1][0]+temp;temp++;}temp=2;for(int i=0;i<100;i++){int m=temp;for(int j=1;j<100;j++){arr[i][j]=arr[i][j-1]+temp;temp++;} temp=m+1;}int n;cin>>n;//如何根據根據輸入n的值,打印對應的蛇形上三角 for(int i=0;i<n;i++){for(int j=0;j<n-i;j++){/*第1行(i=0)打印n個元素,j從0到n-1,即j<n第2行(i=1)打印n-1個元素,j從0到n-2,即j<n-1第3行(i=2)打印n-2個元素,j從0到n-3,即j<n-2......第n行(i=n-1)打印1個元素,j=0,即j<1 因此j<n-i */cout<<arr[i][j]<<" ";}cout<<endl;}return 0;
}
再提供一種輸出蛇形上三角的方法
int n;cin>>n;//如何根據根據輸入n的值,打印對應的蛇形上三角 int a=n; for(int i=0;i<n;i++){for(int j=0;j<a;j++){cout<<arr[i][j]<<" ";}cout<<endl;a--;}