1、金字塔
#include<iostream>
using namespace std;
int main(){
int s='A';
printf("%d",s);//结果65
}
输入描述:
输入一个字母,保证是大写
输出描述:
输出一个字母金字塔。
例:
输入
C
输出
A
ABA
ABCBA
#include<iostream>
int main(){
char n;
scanf("%c",&n);
for(int i=65;i<=n;i++){
for(int j=n;j>i;j--){//2,1,0
printf(" ");
}
for(int k=65;k<=i;k++){//1,2,3 小到大
printf("%c",k);
}
for(int t=i-1;t>=65;t--){//0,1,2 大到小
printf("%c",t);
}
printf("\n");
}
}
2、数列两个题对比:
可见递归数据大则复杂度特别高,会运行超时。
22160
求fib数列的第n项,前几项是1,1,2,3,5,每一项都等于前面两项的和
输入描述:
输入一个整数
输出描述:
输出一个整数
递归:
#include<iostream>
int Fibonacci(int n){
if(n<1)
{
return 0;
}
else if(n==1||n==2)
{
return 1;
}
else
{
return Fibonacci(n-1)+Fibonacci(n-2);
}
}
int main(){
int m;
scanf("%d",&m);
printf("%d",Fibonacci(m));
}
非递归:
#include<iostream>
int main(){
int n;
scanf("%d",&n);
int a=1,b=1;
for(int i=1;i<=n-2;i++)
{
b=a+b;
a=b-a;
}
printf("%d",b);
}
22211
现在已知Fibonacci(菲波那切)数列的前几项0、1、1、2、3、5、8……,编程求出第 N 项。
输入描述:
输入一行,包含一个正整数N,1 <= N <= 50
输出描述:
输出一个整数
现在已知Fibonacci(菲波那切)数列的前几项0、1、1、2、3、5、8……,编程求出第 N 项。
#include<iostream>
int Fibonacci(int n){
if(n==1){
return 0;
}
if(n==2){
return 1;
}
if(n>2){
return Fibonacci(n-1)+Fibonacci(n-2);
}
}
int main(){
int N;
scanf("%d",&N);
printf("%d",Fibonacci(N));
return 0;
}//运行超时:您的程序未能在规定时间内运行结束,请检查是否循环有错或算法复杂度过大。case通过率为80.00%。超时即说明递归复杂度过大。
非递归:
#include<iostream>
int main(){
int n;
scanf("%d",&n);
long long int a=0,b=1;
for(int i=1;i<=n-2;i++)
{
b=a+b;
a=b-a;
}
printf("%lld",b);
}//之前错在爆int(超出了int的取值范围,int:2的32次方,ll:2的64次方),改为long long int和%lld即可
3、换钱问题
链接:https://ac.nowcoder.com/acm/problem/22197
来源:牛客网
n元人民币换成1元、2元、5元的零钱,请计算共有多少种兑换方法?
输入描述:
输入一行,包含一个整数n1 <= n <= 200
输出描述:
输出一行,包含一个整数
#include<iostream>
int main(){
int n;
scanf("%d",&n);
int count=0;
for(int i=0;i<=n/5;i++)
{
for(int j=0;j<=n/2;j++)
{
for(int k=0;k<=n;k++)
{
if((i*5+j*2+k)==n)
{
count++;
}
}
}
}
printf("%d",count);
}
链接:https://ac.nowcoder.com/acm/problem/22214
来源:牛客网
牛可乐在牛牛商场买了一个帽子,要支付c元金币,牛牛商场一律不找零钱,牛可乐手里有不限数量的面值a元的金币和面值b元的金币,请问牛可乐可以用金币刚好凑出总价c元吗?
输入描述:
输入一行,包含三个整数a,b,c a,b <= 100, c <= 10000
输出描述:
输出一行,如果可以输出”Yes”,否则输出”No”.
#include<iostream>
#include<cmath>
using namespace std;
int main(){
int a,b,c;
int i,j;
scanf("%d%d%d",&a,&b,&c);
for( i=0;i<=c/a;i++){
for( j=0;j<=c/b;j++){
if(i*a+j*b==c){
{
printf("Yes");
return 0;
}
}
}
}
if((i==c/a+1)&&(j==c/b+1))
{
printf("No");
}
}
//仅60%错在No部分忘了都+1!
4、约数
最大公约数:
如果遇到一个数很大,另一个数比较小的情况,可能要进行很多次减法才能达到一次除法的效果,从而使得算法的时间复杂度退化为O(N),其中N是原先的两个数中较大的一个。相比之下,辗转相除法的时间复杂度稳定于O(logN)。
更相减损术
1)任意两个正整数,同为偶数则用2约简,否则2);
2)先大数减小数,差与较小数比较,辗转相减至差与减数相等;
3)1)中约掉的若干2与2)中最终等数乘积即为所求最大公约数。
链接:https://ac.nowcoder.com/acm/problem/22164
来源:牛客网
利用更相减损术求两个整数的最大公约数,即每次将较大的数变成大数减去小数的值
输入描述:
输入两个正整数,范围在1000000以内
输出描述:
输出一个整数
#include<iostream>
int main(){
int m,n;
int count=0;
scanf("%d%d",&m,&n);
while(m!=n)
{
if(m>n)
{
m=m-n;
}
else
{
n=n-m;
}
}
printf("%d",m);
}
辗转相除法
大数除以小数,小数除以余数至大数%小数=0,最后除数为两数最大公约数。
链接:https://ac.nowcoder.com/acm/problem/22215
来源:牛客网
最大公因数,也称最大公约数、最大公因子,指两个或多个整数共有约数中最大的一个。给你两个数,请输出他们的最大公约数。
输入描述:
输入一行,包含两个正整数A,B 1 <= A,B <= 1e9
输出描述:
输出一行,包含一个正整数
#include<iostream>
using namespace std;
int main(){
int a,b;
scanf("%d%d",&a,&b);
int i,j,r;
for(i=(a>=b)?a:b,j=(a>=b)?b:a; j!=0; r=i%j,i=j,j=r);//int不能在for内,注意同时变化要新赋给i、j
printf("%d",i);
}