文章目录
- 1.Fibonacci
- 2.一球从M米高度自由下落,每次落地后返回原高度的一半,再落下。 它在第N次落地时反弹多高?共经过多少米? 保留两位小数
- 3. 有一分数序列: 2/1 3/2 5/3 8/5 13/8 21/13...... 求出这个数列的前N项之和,保留两位小数。
- 4. c++ 解三元二次方程
- 5. 古希腊数学家毕达哥拉斯在自然数研究中发现,220的所有真约数(即不是自身的约数)之和为:
- 6. 序列求和
- 7. 给定一个长度为n的数列,将这个数列按从小到大的顺序排列。1<=n<=200
- 8. 123321是一个非常特殊的数,它从左边读和从右边读是一样的。
- 9. 题目 1004: [递归]母牛的故事
- 10.题目 1084: 用筛法求之N内的素数。
- 11.题目 1094: 字符串的输入输出处理
- 196 删除重复的电子邮箱
- 197. 上升的温度
1.Fibonacci
输入格式
输入包含一个整数n。
输出格式
输出一行,包含一个整数,表示Fn除以10007的余数。
说明:在本题中,答案是要求Fn除以10007的余数,因此我们只要能算出这个余数即可,而不需要先计算出Fn的准确值.
再将计算的结果除以10007取余数,直接计算余数往往比先算出原数再取余简单。
#include <stdio.h>
using namespace std;
int f(int n)
{
if(n\==1&&n==2)
{
return 1;
}
else
{
return f(n-1)+f(n-2);
}
}
int main()
{
int n;
scanf("%d",&n);
int a=f(n);
printf("%d",a%10007);
}
这种方法会溢出,占用内存太多。
#include <iostream>
#include <stdio.h>
using namespace std;
int main()
{
int n;
scanf("%d",&n);
int *a=new int[n];
a[0]=1;
a[1]=1;
if(n==1){
cout<<a[0];
}else if(n==2){
cout<<a[1];
}else if(n > 2){
int i;
for(i=2;i<n;i++)
{
a[i]=(a[i-1]+a[i-2])%10007;
}
cout<<a[i-1];
}
delete []a;
}
后来使用c++动态数组
2.一球从M米高度自由下落,每次落地后返回原高度的一半,再落下。 它在第N次落地时反弹多高?共经过多少米? 保留两位小数
// 题目描述
// 一球从M米高度自由下落,每次落地后返回原高度的一半,再落下。 它在第N次落地时反弹多高?共经过多少米? 保留两位小数
// 输入
// M N
// 输出
// 它在第N次落地时反弹多高?共经过多少米? 保留两位小数,空格隔开,放在一行
#include <stdio.h>
#include <iostream>
#include <iomanip>
using namespace std;
int main(){
double m;
int n;
cin>>m>>n;
double sum=0;
while (n)
{
sum += m;//下来的距离要加上
m = m / 2;
if (n == 1)//最后一次不需要反弹的距离
break;
sum += m;//反弹的距离也要加上
n--;
}
cout<<fixed<<setprecision(2)<<m<<" "<<sum;
return 0;
}
注意的知识点:
c++保留两位小数
头文件#include
cout<<setiosflags(ios::fixed)<<setprecision(2)<<n;
setiosflags(ios::fixed),fixed是指以固定的浮点表示
当没有setiosflags时,是保留2位有效数字,如果setprecision里的参数小于整数位数,将以指数形式输出,例如
float a = 123.666;
cout<<setprecision(2)<<a;
将输出1.2e+002。
3. 有一分数序列: 2/1 3/2 5/3 8/5 13/8 21/13… 求出这个数列的前N项之和,保留两位小数。
// 有一分数序列: 2/1 3/2 5/3 8/5 13/8 21/13...... 求出这个数列的前N项之和,保留两位小数。
// 输入
// N
// 输出
// 数列前N项和
// 样例输入
// 10
// 样例输出
// 16.48
#include <iostream>
#include <iomanip>
using namespace std;
int main(){
int n;
cin>>n;
double sum=2.00;
double a=2,b=1,c;
for(int i=2;i<=n;i++){
c=a;
a=a+b;
sum=sum+(a/c);
b=c;
}
cout<<fixed<<setprecision(2)<<sum;
return 0;
}
分析过程
4. c++ 解三元二次方程
//cmath 函数的 sqrt();
#include <iostream>
#include <cmath>
using namespace std;
void f(double a,double b,double c)
{
double r1,r2;
if(b*b>4*a*c&&a)
{
r1=((-1)*b+sqrt(b*b-4*a*c))/2*a;
r1=((-1)*b-sqrt(b*b-4*a*c))/2*a;
}
cout<<"r1="<<r1<<endl;
cout<<"r2="<<r2;
}
int main()
{
double a,b,c;
cin>>a>>b>>c;
f(a,b,c);
}
5. 古希腊数学家毕达哥拉斯在自然数研究中发现,220的所有真约数(即不是自身的约数)之和为:
// 古希腊数学家毕达哥拉斯在自然数研究中发现,220的所有真约数(即不是自身的约数)之和为:
// 1+2+4+5+10+11+20+22+44+55+110=284。
// 而284的所有真约数为1、2、4、71、 142,加起来恰好为220。人们对这样的数感到很惊奇,并称之为亲和数。一般地讲,如果两个数中任何一个数都是另一个数的真约数之和,则这两个数就是亲和数。
// 你的任务就编写一个程序,判断给定的两个数是否是亲和数
输入
输入数据第一行包含一个数M,接下有M行,每行一个实例,包含两个整数A,B; 其中 0 <=A,B <=600000 ;
输出
对于每个测试实例,如果A和B是亲和数的话输出YES,否则输出NO。
样例输入
2
220 284
100 200
样例输出
YES
NO
#include <iostream>
#include <stdio.h>
#include <set>
using namespace std;
set<int> judge(set<int> arr,int a){ //求所有约数,使用集合可以避免插入重复的约数
for(int i=1;i<a;i++)
{
if(a%i==0) arr.insert(i);
}
return arr;
}
int main(){
int n;cin>>n;
int a,b;
while(n>0){
cin>>a>>b;
set<int> arr,brr;
arr=judge(arr,a);
brr=judge(brr,b);
int sum1=0;
int sum2=0;
for(set<int>::iterator it=arr.begin();it!=arr.end();it++){
sum1+=*it;
}
for(set<int>::iterator it=brr.begin();it!=brr.end();it++){
sum2+=*it;
}
if((sum1==b)&&(sum2==a)){
printf("YES\n");
}else{
printf("NO\n");
}
n--;
}
return 0;
}
关于c++排序
c++拥有直接排序的 sort函数,拥有了sort函数,就节省了好多好多代码,从此告别了选择排序,插入排序,,,从此走向人生巅峰。。。
那当然是不可能的。
但是能让你更专注于逻辑本身。
sort的使用条件
在algorithm头文件下有很多函数(max, min, reverse, fill,sort…),所以使用sort一定要加上
#incude <algorithm>
using namespace std;
使用方法
sort(首元素,尾元素地址的下个地址,比较函数)
其中,比较函数是非必填的
比较函数有什么作用呢?
如果比较函数不填,那么默认按照从小到大的方式排序。
but,现在我想按照从大到小的方式排序,怎么办?
bool cmp(int a,int b)
{
return a>b//可以理解为当a>b时把a放在b的前面
}
只要添加上这么一行就ok了
6. 序列求和
说明:请注意这里的数据规模。
本题直接的想法是直接使用一个循环来累加,然而,当数据规模很大时,这种“暴力”的方法往往会导致超时。此时你需要想想其他方法。你可以试一试,如果使用1000000000作为你的程序的输入,你的程序是不是能在规定的上面规定的时限内运行出来。
本题另一个要值得注意的地方是答案的大小不在你的语言默认的整型(int)范围内,如果使用整型来保存结果,会导致结果错误。
如果你使用C++或C语言而且准备使用printf输出结果,则你的格式字符串应该写成%I64d以输出long long类型的整数。
#include<stdio.h>
#include<math.h>
int main(){
long long int n,sum=0;
scanf("%d",&n);
sum=(1+n)*n/2;
printf("%I64d",sum);
return 0;
}
7. 给定一个长度为n的数列,将这个数列按从小到大的顺序排列。1<=n<=200
// 输入格式
// 第一行为一个整数n。
// 第二行包含n个整数,为待排序的数,每个整数的绝对值小于10000。
// 输出格式
// 输出一行,按从小到大的顺序输出排序后的数列。
// 样例输入
// 5
// 8 3 6 4 9
#include <iostream>
#include <algorithm>
using namespace std;
int main(){
int n;
cin >>n;
int a[n];
for(int i=0;i<n;i++){
cin>>a[i];
}
sort(a,a+n);
for(int i=0;i<n;i++){
cout<<a[i]<<" ";
}
return 0;
}
sort(a,a+n);
a是数组的首地址啊记住了!!!
8. 123321是一个非常特殊的数,它从左边读和从右边读是一样的。
// 输入一个正整数n, 编程求所有这样的五位和六位十进制数,满足各位数字之和等于n 。
// 输入格式
// 输入一行,包含一个正整数n。
// 输出格式
// 按从小到大的顺序输出满足条件的整数,每个整数占一行。
// 样例输入
// 52
// 样例输出
// 899998
// 989989
// 998899
// 数据规模和约定
// 1<=n<=54。
#include <iostream>
using namespace std;
int main(){
int n;
cin>>n;
//六位
for(int i=0;i<10;i++){
for(int j=0;j<10;j++){
for(int k=0;k<10;k++){
if(2*i+k+2*j==n){
cout<<i<<j<<k<<j<<i<<endl;
}
}
}
}
for(int i=0;i<10;i++){
for(int j=0;j<10;j++){
for(int k=0;k<10;k++){
if(2*i+2*k+2*j==n){
cout<<i<<j<<k<<k<<j<<i<<endl;
}
}
}
}
return 0;
}
9. 题目 1004: [递归]母牛的故事
有一头母牛,有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?
(依旧是动态数组的问题)
//请编程实现在第n年的时候,共有多少头母牛?
// 输入
// 输入数据由多个测试实例组成,每个测试实例占一行,包括一个整数n(0<n<55),n的含义如题目中描述。
// n=0表示输入数据的结束,不做处理。
// 输出
// 对于每个测试实例,输出在第n年的时候母牛的数量。
// 每个输出占一行。
// 样例输入
// 2
// 4
// 5
// 0
// 样例输出
// 2
// 4
// 6
#include <iostream>
#include <stdio.h>
using namespace std;
int main(){
int n;
long long a[55]={};
while(cin>>n&&n>0&&n<55){
a[1]=1;
a[2]=2;
a[3]=3;
if(n<=3){
cout<<a[n]<<endl;
}else{
for(int i=4;i<=n;i++){
a[i]=a[i-1]+a[i-3];
}
cout<<a[n]<<endl;
}
}
return 0;
}
10.题目 1084: 用筛法求之N内的素数。
用筛法求之N内的素数。
输入
N
输出
0~N的素数
样例输入
100
样例输出
2
3
5
7
11
13
17
19
23
29
31
37
41
43
47
53
59
61
67
71
73
79
83
89
97
代码示例一:使用穷举法,按照素数的定义,如果一个数除了1和它本身之外没有其他因数。
我们就让一个数依次对除了1和它本身之外的所有数进行取余,如果没有能整除的数(即余数为0),那么这个数就是素数。
#include<stdio.h>
int main()
{
int n,i,j,f;
scanf("%d",&n);
for(i=2;i<=n;i++)
{
f=0;
for(j=2;j<i;j++)
{
if(!(i%j))//与i%j==0的效果一样
{
f++;
}
}
if(!f)//与f==0的效果一样
//“!"作为单目运算符的意思是取非,如!真=假,!假=真。C语言中一般情况下0表示假,非0表示真。
{
printf("%d\n",i);;
}
}
}
11.题目 1094: 字符串的输入输出处理
// 题目描述
// 字符串的输入输出处理。
// 输入
// 第一行是一个正整数N,最大为100。之后是多行字符串(行数大于N), 每一行字符串可能含有空格,字符数不超过1000。
// 输出
// 先将输入中的前N行字符串(可能含有空格)原样输出,再将余下的字符串(不含有空格)以空格或回车分割依次按行输出。每行输出之间输出一个空行。
// 样例输入
// 2
// www.dotcpp.com DOTCPP
// A C M
// D O T CPP
// 样例输出
// www.dotcpp.com DOTCPP
// A C M
// D
// O
// T
// CPP
#include<iostream>
using namespace std;
int main()
{
int n;
cin>>n;
getchar();
string s;
for(int i=0;i<n;i++){
getline(cin,s);
cout<<s<<" ";
}
cout<<endl;
while(cin>>s){
cout<<s<<endl<<endl;
}
return 0;
}
196 删除重复的电子邮箱
编写一个 SQL 查询,来删除 Person 表中所有重复的电子邮箱,重复的邮箱里只保留 Id 最小 的那个。
Id | |
---|---|
1 | john@example.com |
2 | bob@example.com |
3 | john@example.com |
Id 是这个表的主键。
例如,在运行你的查询语句之后,上面的 Person 表应返回以下几行:
Id | |
---|---|
1 | john@example.com |
2 | bob@example.com |
delete a
from person as a inner join person as b
where a.email = b.email and a.id > b.id
197. 上升的温度
SQL架构
表 Weather
Column Name | Type |
---|---|
id | int |
recordDate | date |
temperature | int |
id 是这个表的主键
该表包含特定日期的温度信息
编写一个 SQL 查询,来查找与之前(昨天的)日期相比温度更高的所有日期的 id 。
返回结果 不要求顺序 。
# Write your MySQL query statement below
select w1.id
from Weather w1,Weather w2
where w1.Temperature>w2.Temperature and datediff(w1.recordDate,w2.recordDate)=1