例题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;
else
return (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--;
}