水仙花数
什么是水仙花数?
水仙花数(Narcissistic number)也被称为超完全数字不变数(pluperfect digital invariant, PPDI)、自恋数、自幂数、阿姆斯壮数或阿姆斯特朗数(Armstrong number),水仙花数是指一个 3 位数,它的每个数位上的数字的 3次幂之和等于它本身。例如:1^3 + 5^3+ 3^3 = 153。
简单来说,水仙花数它的每个数位上的数字的 3次方之和等于它本身。
难点
这道题目中,最难的就是分解各个数位。
上代码
//一:C++中水仙花数实现代码
//Zff121017-CSDN
#include<iostream>
using std::cout;
using std::endl;
#define f(a) (a)*(a)*(a)
int main() {
for (int i = 100;i < 1000;i++)
if (f(i % 10) + f(i / 10 % 10) + f(i / 100 % 10) == i)
cout << i << endl;
system("pause");
return 0;
}
//二:C++中任意位数水仙花数实现代码
//Zff121017-CSDN
#include<iostream>
#include<cmath>
using namespace std;
int main(])
{
long n1, n2, a;
int i;
cout << "请输入Narcissistic number的位数:" << endl;
cin >> i;
cout << i << "位数的Narcissistic number包括:" << endl;
for (n1 = pow(10, i - 1); n1 < pow(10, i); n1++)
{
n2 = 0;
for (int j=0; j < i; j++)
{
a = pow(10, j);
a = n1 / a;
a = a % 10;
a = pow(a, i);
n2 = n2 + a;
}
if (n1 == n2)
cout << n1 << endl;
}
return 0;
}
判断质数
理解
质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。
应用
质数被利用在密码学上,所谓的公钥就是将想要传递的信息在编码时加入质数,编码之后传送给收信人,任何人收到此信息后,若没有此收信人所拥有的密钥,则解密的过程中(实为寻找素数的过程),将会因为找质数的过程(分解质因数)过久,使即使取得信息也会无意义。
在汽车变速箱齿轮的设计上,相邻的两个大小齿轮齿数设计成质数,以增加两齿轮内两个相同的齿相遇啮合次数的最小公倍数,可增强耐用度减少故障。
在害虫的生物生长周期与杀虫剂使用之间的关系上,杀虫剂的质数次数的使用也得到了证明。实验表明,质数次数地使用杀虫剂是最合理的:都是使用在害虫繁殖的高潮期,而且害虫很难产生抗药性。
以质数形式无规律变化的导弹和鱼雷可以使敌人不易拦截。
多数生物的生命周期也是质数(单位为年),这样可以最大程度地减少碰见天敌的机会。
代码
基本判断思路
在一般领域,对正整数n,如果用2到n之间的所有整数去除,均无法整除,则n为质数。
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
const long long size=100000;//修改size的数值以改变最终输出的大小
long long zhishu[size/2];
void work (){//主要程序
zhishu[1]=2;
long long k=2;
for(long long i=3;i<=size;i++){//枚举每个数
bool ok=1;
for(long long j=1;j<k;j++){//枚举已经得到的质数
if(i%zhishu[j]==0){
ok=!ok;
break;
}
}
if(ok){
zhishu[k]=i;
cout<<"count"<<k<<' '<<i<<endl;
k++;
}
}
}
int main(){
freopen("zhishu.out","w",stdout);
cout<<"count1 2"<<endl;
work();
return 0;
}
最大公约数
定义
最大公因数,也称最大公约数、最大公因子,指两个或多个整数共有约数中最大的一个。a,b的最大公约数记为(a,b),同样的,a,b,c的最大公约数记为(a,b,c),多个整数的最大公约数也有同样的记号。求最大公约数有多种方法,常见的有质因数分解法、短除法、辗转相除法、更相减损法。与最大公约数相对应的概念是最小公倍数,a,b的最小公倍数记为[a,b]。
相关星图
最大公因式有两个含义:第一,首先是公因式;第二,又是所有公因式的倍式,即体现“最大性”。两多项式的最大公因式一定存在且不唯一,但是首项系数为1的最大公因式是唯一的。求最大公因式可以用辗转相除法来得到。
最大公因子,又称最大公约数(英语:greatest common divisor,gcd),指两个或多个整数共同具有的最大约数。
数学学科常见的“最”
共6个词条2.6万阅读
在偶数分解为两个素数之和的关系式中,我们把由一个最小素数与最大素数组成的素数和形式称作“极限素数和”的形式,把两个相等的素数和形式称作“等素数和”的形式。
最简分数,是分子、分母只有公因数1的分数,或者说分子和分母互质的分数,又称既约分数。如:二分之一,三分之二,九分之八,八分之三等等。
基本概念
如果数a能被数b整除,a就叫做b的倍数,b就叫做a的约数。约数和倍数都表示一个整数与另一个整数的关系,不能单独存在。如只能说16是某数的倍数,2是某数的约数,而不能孤立地说16是倍数,2是约数。
"倍"与"倍数"是不同的两个概念,"倍"是指两个数相除的商,它可以是整数、小数或者分数。"倍数"只是在数的整除的范围内,相对于"约数"而言的一个数字的概念,表示的是能被某一个自然数整除的数。
几个整数中公有的约数,叫做这几个数的公约数;其中最大的一个,叫做这几个数的最大公约数。例如:12、16的公约数有1、2、4,其中最大的一个是4,4是12与16的最大公约数,一般记为(12,16)=4。12、15、18的最大公约数是3,记为(12,15,18)=3。
几个自然数公有的倍数,叫做这几个数的公倍数,其中最小的一个自然数,叫做这几个数的最小公倍数。例如:4的倍数有4、8、12、16,……,6的倍数有6、12、18、24,……,4和6的公倍数有12、24,……,其中最小的是12,一般记为[4,6]=12。12、15、18的最小公倍数是180。记为[12,15,18]=180。若干个互质数的最小公倍数为它们的乘积的绝对值。
常用结论
在解有关最大公约数、最小公倍数的问题时,常用到以下结论:
(1)如果两个自然数是互质数,那么它们的最大公约数是1,最小公倍数是这两个数的乘积。
例如8和9,它们是互质数,所以(8,9)=1,[8,9]=72。
(2)如果两个自然数中,较大数是较小数的倍数,那么较小数就是这两个数的最大公约数,较大数就是这两个数的最小公倍数。
例如18与3,18÷3=6,所以(18,3)=3,[18,3]=18。
(3)两个整数分别除以它们的最大公约数,所得的商是互质数。
例如8和14分别除以它们的最大公约数2,所得的商分别为4和7,那么4和7是互质数。
(4)两个自然数的最大公约数与它们的最小公倍数的乘积等于这两个数的乘积。
例如12和16,(12,16)=4,[12,16]=48,有4×48=12×16,即(12,16)× [12,16]=12×16。
(5)(裴蜀定理)GCD(a,b) is the smallest positive linear combination of a and b. a与b的最大公约数是最小的a与b的正线性组合,即对于方程xa+yb=c来说,若x,a,y,b都为整数,那么c的最小正根为gcd(a,b).
代码
//C++程序如下:
#include<cstdio>
int GCD(int a,int b)
{
return a%b?GCD(b,a%b):b;
}
int main()
{
int x,y;
scanf("%d%d",&x,&y);
printf("%d",GCD(x,y));
return 0;
}
最小公倍数
什么是最小公倍数?
两个或多个整数公有的倍数叫做它们的公倍数,其中除0以外最小的一个公倍数就叫做这几个整数的最小公倍数。整数a,b的最小公倍数记为[a,b],同样的,a,b,c的最小公倍数记为[a,b,c],多个整数的最小公倍数也有同样的记号。
与最小公倍数相对应的概念是最大公约数,a,b的最大公约数记为(a,b)。关于最小公倍数与最大公约数,我们有这样的定理:(a,b)x[a,b]=ab(a,b均为整数)。
定义
几个数共有的倍数叫做这几个数的公倍数,其中除0以外最小的一个公倍数,叫做这几个数的最小公倍数。
自然数a、b的最小公倍数可以记作[a,b],自然数a、b的最大公因数可以记作(a、b),当(a、b)=1时,[a、b]= a×b。如果两个数是倍数关系,则它们的最小公倍数就是较大的数,相邻的两个自然数的最小公倍数是它们的乘积。最小公倍数=两数的乘积/最大公约(因)数, 解题时要避免和最大公约(因)数问题混淆。
最小公倍数的适用范围:分数的加减法,中国剩余定理(正确的题在最小公倍数内有解,有唯一的解)。因为,素数是不能被1和自身数以外的其它数整除的数;素数X的N次方,是只能被X的N及以下次方,1和自身数整除。所以,给最小公倍数下一个定义:S个数的最小公倍数,为这S个数中所含素因子的最高次方之间的乘积。
例如:1,求756,4400,19845,9000的最小公倍数?
因756=2*2*3*3*3*7,4400=2*2*2*2*5*5*11,19845=3*3*3*3*5*7*7,9000=2*2*2*3*3*5*5*5,这里有素数2,3,5,7,11.2最高为4次方16,3最高为4次方81,5最高为3次方125,7最高为2次方49,还有素数11。得最小公倍数为16*81*125*49*11=87318000.2,自然数1至50的最小公倍数,因为,√50≈7,所以,在50之内的数只有≤7的素数涉及N次方。在50之内,2的最高次方的数为32,3的最高次方的数为27,5的最高次方的数为25,7的最高次方的数为49,其余为50之内的素数。所以,1,2,3,4,5,6,…,50的最小公倍数为:32*27*25*49*11*13*17*19*23*29*31*37*41*43*47=3099044504245996706400
代码
#include<iostream>
using namespace std;
int GCD(int a,int b);
int LCM(int a,int b);
int main()
{
int num1,num2,gcd,lcm;
cout<<"求两个数的最大公约数及最小公倍数"<<endl<<endl;
cout<<"请输入两个数:";
cin>>num1>>num2;
gcd=GCD(num1,num2);
lcm=LCM(num1,num2);//输出最大公约数和最小公倍数
cout<<"最大公约数为:"<<gcd<<endl;
cout<<"最小公倍数为:"<<lcm<<endl;
system("pause");
return 0;
}
int GCD(int num1,int num2)
{
if(num1%num2==0)
return num2;
else return GCD(num2,num1%num2);
}
int LCM(int a,int b)
{
int temp_lcm;
temp_lcm=a*b/GCD(a,b);//最小公倍数等于两数之积除以最大公约数
return temp_lcm;
}
杨辉三角
📝我们来看看这道题:
🚩🚩🚩🚩🚩🚩🚩🚩🚩🚩🚩🚩🚩🚩🚩🚩🚩🚩🚩🚩🚩🚩🚩🚩
题目:
题目描述
杨辉三角,又称贾宪三角形、帕斯卡三角形,由北宋人贾宪约于 1050 年在《释锁 算术》中首先提出,下图显示的是杨辉三角的前 6 行。仔细研究杨辉三角,我们可以发 现它的许多性质。
亲爱的同学,现在请你也来研究一下杨辉三角,并求出杨辉三角中第 m 行的第 n 个数(按从左往右的顺序)。
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
... ... ... ... ... ... ... ... ... ...
输入
只有一行,有二个整数 m 和 n(m<=35),数间用一个空格隔开。
输出
只有一行,有一个整数,表示杨辉三角中第 m 行的第 n 个 数。
样例输入
6 3
样例输出
10
🚩🚩🚩🚩🚩🚩🚩🚩🚩🚩🚩🚩🚩🚩🚩🚩🚩🚩🚩🚩🚩🚩🚩🚩🚩🚩🚩🚩🚩🚩🚩🚩
#include<iostream>
using namespace std;
int main(){
//Zff121017
//制作
int a[35+1][35+1];
int m,n;
cin>>m>>n;
for(int i=1;i<=m;i++){
for(int j=1;j<=i;j++){
if(i==j or j==1){
a[i][j]=1;
}else{
a[i][j]=a[i-1][j]+a[i-1][j-1];
}
}
}
cout<<a[m][n];
return 0;
}
谁考了第k名C++
题目描述
在一次考试中,每个学生的成绩都不相同,现知道了每个学生的学号和成绩,求考第k名学生的学号和成绩。(按成绩从大到小排列)
输入
第一行有两个整数,分别是学生的人数n(1≤n≤100),和求第k名学生的k(1≤k≤n)。
其后有n行数据,每行包括一个学号(整数)和一个成绩(浮点数),中间用一个空格分隔。
输出
输出第k名学生的学号和成绩,中间用空格分隔。
样例输入 复制
5 3
90788001 67.8
90788002 90.3
90788003 61
90788004 68.4
90788005 73.9
样例输出 复制
90788004 68.4
#include <iostream>
using namespace std;
int a[110];
double s[110];
int main(){
int n,k,b;
double t;
cin>>n>>k;
for(int i=0;i<n;i++) cin>>a[i]>>s[i];
for(int i=0;i<n;i++){
int k=i;
for(int j=i;j<n;j++) if(s[j]<s[k]) k=j;
if(k!=i){
t=s[i];
s[i]=s[k];
s[k]=t;
b=a[i];
a[i]=a[k];
a[k]=b;
}
}
cout<<a[n-k]<<" "<<s[n-k];
return 0;
}