目录
1. 个位数是6,且能被3整除的五位数共有多少个? ☆
2. 不同方式求n的阶乘 ★
3. 报数游戏 ★☆
1. 个位数是6,且能被3整除的五位数共有多少个?
答案: 3000 ,代码略
2. 不同方式求n的阶乘
求n的阶乘(用三种不同的循环实现,提示:先从键盘输入n的值)while、do while和for
代码:
#include <stdio.h>
int main(void) {
int n;
printf("请输入n的值:");
scanf("%d",&n);
int temp=n,sum=1;
while(temp>1){
sum*=temp;
temp--;
}
printf("%d的阶乘是%d\n",n,sum);
temp=n;
sum=1;
do{
sum*=temp;
temp--;
}while(temp>1);
printf("%d的阶乘是%d\n",n,sum);
temp=n;
sum=1;
for(;temp>1;temp--){
sum*=temp;;
}
printf("%d的阶乘是%d\n",n,sum);
return 0;
}
输入输出:
请输入n的值:6
6的阶乘是720
6的阶乘是720
6的阶乘是720
3. 报数游戏
题目描述
首先,会给他们一人一个编号,并且每个人的编号都不相同。接下来的每一回合,会给一个数,编号超过它的最小编号的人要报出自己的编号。如果没有人的编号比给出的数要大,那么编号最大的人要报出自己的编号。每个人可以重复报号。 会按照一个列表顺次报出每个回合的数,朋友们想知道每回合报出的编号应该是多少。
输入
输入数据共 3 行。
第一行有两个整数 n,m(1≤n≤100,000,1≤m≤100,000),分别表示参与游戏的朋友的个数,和游戏的回合数。
第二行 n个整数 ai(1≤ai≤100,000,000),表示朋友们每个人的编号。对于 0≤i<j<n,都有 ai<aj,即他们的编号递增排列。
第三行 m 个整数 qi(1≤qi≤100,000,000),表示每回合给的数字。
输出
输出共一行 m 个整数,表示每回合报出的编号,每两个整数之间一个空格,最后一个数后面没有空格。
代码:
#include <iostream>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
int ai[100010], qi[100010];
int main()
{
int a, q;
while (cin >> a >> q)
{
for (int i = 0; i < a; i++)
cin >> ai[i];
for (int i = 0; i < q; i++)
cin >> qi[i];
for (int i = 0; i < q; i++)
{
int left = 0, right = a - 1, mid;
while (left < right)
{
mid = (left + right) >> 1;
if (ai[mid] <= qi[i])
left = mid + 1;
else
right = mid;
}
if (left - 1 < 0 || ai[left] < qi[i])
left++;
i ? cout << " " << ai[left - 1] : cout << ai[left - 1];
}
cout << endl;
}
return 0;
}
扩展阅读
阶乘
一个正整数的阶乘(factorial)是所有小于及等于该数的正整数的积,并且0的阶乘为1。自然数n的阶乘写作n!。1808年,基斯顿·卡曼(Christian Kramp,1760~1826)于 1808 年首用!这个表示法。
递归法求阶乘
int factorial(int num)
{
if (num == 0)
return 1;
else
return num * factorial(num - 1);
}
阶乘数
是一种有着特殊规律、每位以阶乘为权的数字。abcd=a*a!+b*b!+c*c!+d*d!
阶乘数的值等于各个位上数字乘以其阶乘数之和。因为0-9的数字的阶乘值不会特别大,所以阶乘数也有上限。可以用穷举法求,很方便的。
求n!的位数
方法一
可以将n!表示成10的次幂,即n!=10^M(10的M次方)则不小于M的最小整数就是 n!的位数,对该式两边取对数,有 M =log10^n!
即:
M = log10^1+log10^2+log10^3...+log10^n
循环求和,就能算得M值,该M是n!的精确位数
方法二
利用斯特林(Stirling)公式的进行求解。下面是推导得到的公式:
res=(long)( (log10(sqrt(4.0*acos(0.0)*n)) + n*(log10(n)-log10(exp(1.0)))) + 1 );
当n=1的时候,上面的公式不适用,所以要单独处理n=1的情况!
有关斯特林(Stirling)公式及其相关推导,这里就不进行详细描述,
这种方法速度很快就可以得到结果。
求n!末尾0的个数
思路:
一个数 n 的阶乘末尾有多少个 0 取决于从 1 到 n 的各个数的因子中 2 和 5 的个数
而 2 的个数是远远多余 5 的个数的, 因此求出 5 的个数即可
题解中给出的求解因子 5 的个数的方法是用 n 不断除以 5, 直到结果为 0
然后把中间得到的结果累加. 例如, 100/5 = 20, 20/5 = 4, 4/5 = 0
则 1 到 100 中因子 5 的个数为 (20 + 4 + 0) = 24 个
即 100 的阶乘末尾有 24 个 0. 其实不断除以 5
是因为每间隔 5 个数有一个数可以被 5 整除, 然后在这些可被 5 整除的数中
每间隔 5 个数又有一个可以被 25 整除, 故要再除一次, ... 直到结果为 0, 表示没有能继续被 5 整除的数了。
广义阶乘
阶乘的定义范围已从正整数拓展到复数,真正严谨的阶乘定义应该为:对于数n,所有绝对值小于或等于n的同余数之积。称之为n的阶乘,即n! ,对于复数应该是指所有模n小于或等于│n│的同余数之积。
说明:复数阶乘存在路径问题,路径不同阶乘的结果就不相同,幅角a相等是指按直线从0点附近到z,不等时是按曲线取阶乘。复数阶乘存在方向问题,就是说它是有方向的量。广义阶乘涵括正负实数阶乘。
双阶乘
用m!!表示,两个感叹号
注:扩展阅读内容摘自百度百科