C++经典题目,初学者快速入门!【附有解析】

题目一:1-100各类数之和

(1)求1+2+3+…+100的和

简单的一个for循环的练习,从1遍历到100,每次递增1.

#include<iostream>
using namespace std;

int main(){
   
   
	int sum=0;	//定义一个变量存储总和
	for(int i=1;i<=100;i++){
   
   	//for循环遍历
		sum+=i;			//每次累加,更新sum值
	}
	cout<<"1+2+3+...+100和为"<<sum;
}

(2)求1+3+5+…+99的奇数和

循环的练习,从1遍历到100,每次递增2,保证都是奇数。

#include<iostream>
using namespace std;

//for循环
void fun_for(){
   
   
	int sum=0;
	for(int i=1;i<=100;i+=2){
   
   
		sum+=i;
	}
	cout<<"1+3+5+7..+99和为"<<sum<<endl;
} 

//while循环
void fun_while(){
   
   
	int sum=0,n=1;
    while(n<=99){
   
   
		sum+=n;
		n+=2;
	}
	cout<<"1+3+5+7..+99和为"<<sum<<endl;	
} 

int main(){
   
   
	fun_for();
	fun_while();
	
return 0;
}

(3)求1+1/2+1/3+…+1/100的和

可以观察到,分子都是1,分母是从1逐一递增到100.
我们可以把分母这个变量,拿去遍历再求和。

#include<iostream>
using namespace std;

int main(){
   
   
	float sum=0;
	for(int i=1;i<=100;i+=1){
   
   
		sum+=1.0/i;		//1.0是为了转换数据类型,因为i还是整型
	}
	cout<<"1+1/2+1/3+...+1/100和为"<<sum;
	//printf("%.2f\n",sum);	 保留两位小数
} 

若结尾保留两位小数,则要.2f,如代码中注释的部分。

我们也可写成递归的形式,递归的出口是n==1,返回一个double类型的总和。

#include<iostream>
using namespace std;

double sum(int n){
   
   		//递归的求和函数,返回值是double类型,函数名是sum,传入参数是整型的n
	if(n==1){
   
   
		return 1.0;		//返回double值
	}
	return 1.0/n+sum(n-1);		//若n不等于1,则一直return这段语句
}

int main(){
   
   
	int n=100;
	double result = sum(n);		//调用函数sum,传入参数n,把函数sum返回的值 赋值给变量result
	printf("1+1/2+1/3+...+1/100和为%.2f",result);
	
	return 0;
} 

若需要自定义n,可以使用cin>>n,自己输入n的值,结尾改成printf("1+1/2+1/3+...+1/%d和为%.2f",n,result);n是分母,只能输入正数。

(4)求-1+1/2-1/3+1/4…-1/99+1/100的和

仔细观察可以看出,与上一题不同之处在于符号的正负,奇数位为负,偶数位为正.
我们此时需要写一个if语句来判断奇数偶数。

#include<iostream>
using namespace std;

int main(){
   
   
	float sum=0;
	for(int i=1;i<=100;i++){
   
   
		if(i%2==0)		//若i是偶数
			sum+=1.0/i;		//则sum加上1.0/i
		else
			sum-=1.0/i;
	}
	cout<<"-1+1/2-1/3+...+1/100和为"<<sum;
	//printf("%.2f\n",sum);	
} 

题目二:斐波那契数列(Fibonacci Sequence)又称黄金分割数列

Q:设一对大兔子每月生一对小兔子,每对新生兔在出生一个月后又下崽,假若兔子都不死亡。问:一对兔子一年能繁殖成多少对兔子?

经典的递归问题
当n=1或者2时,第n项的值为1;
当n>2时候,这个数列的第n项的值就是它前面两项之和。

///第n个fibonacci数可递归如下:
int fibonacci(int n){
   
   
	if(n==1||n==2)
		return 1;
	else
		return fibonacci(n-1)+fibonacci(n-2);
}

回到这道题。

#include<iostream>
using namespace std;

int fib(int n){
   
   		
	if(n==1||n==2)
		return 1;
	else
		return fib(n-1)+fib(n-2);
}
int main(){
   
   
	int n;		//天数
	cout<<"请输入天数:";
	cin>>n;
	cout<<"第"<<n<<"天共有兔子"<<fib(n)<<"对";
	return 0;
}

如果不使用递归呢?
我们可以设置三个变量作为前天、昨天、今天的兔子数量,每过一天就及时更新这些数据。

#include<iostream>
using namespace std;

//f当天兔子对数
//f1昨天兔子对数
//f2前天兔子对数
 
int main(){
   
   
	int f1=1,f2=1,f;             //第1.2天都只有一只兔子 
	for(int i=3;i<=10;i++){
   
         //从第三天开始,到第十天
		f=f1+f2;				//每过一天,今天的兔子=昨天+前天
		printf("%d天共有兔子%d对\n",i,f);
		f2=f1;					//更新前天的数据
		f1=f;					//更新昨天的数据
	}
	return 0; 
} 

在这里插入图片描述

题目三:判断素数

素数一般指质数。质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。

暴力法

根据素数的定义,不能被2~n-1之内的数整除的整数n就被称为素数。所以我们从2跑到n-1,每次取模判断即可,这是最直观的一种方法。

bool isPrime_1(int num)
{
   
   
    for(int i=2;i<=num-1;i++)
      if(num%i==0)	//若被整除,则说明不是素数,返回0
         return 0;
    return 1;
}

开根号法

对于每个数n,其实并不需要从2判断到n-1,我们知道,一个数若可以进行因数分解,那么分解时得到的两个数一定是一个小于等于sqrt(n),一个大于等于sqrt(n),据此,上述代码中并不需要遍历到n-1,==遍历到sqrt(n)==即可,因为若sqrt(n)左侧找不到约数,那么右侧也一定找不到约数!所以从2跑到sqrt(n)就可以了。

bool isPrime_2(int num)
{
   
   
	double tmp=num-1;
    for(int i=2;i<=sqrt(tmp
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值