题目一: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


1万+

被折叠的 条评论
为什么被折叠?



