C++基础知识

一.OJ上数据输入输出的处理

  • scanf函数有返回值,返回值是成功读入的数据个数

第三个,先读入a后读入失败,结束读入。

  • 处理不确定个数的输入
    EOF可以直接当一个数-1来用,scanf读入失败返回-1.
    在这里插入图片描述
    cin也有类似的返回值。
    二 .循环
  • 例 求阶乘的和
    输入正整数n,输出1!+2!+…+n!的值
    思路:用循环,对于某一层循环i,假设前面的事情已经做好,需要计算i的阶乘,可以设一个变量保存每次计算完的阶乘,然后乘i即可。对于计算阶乘和,则使用sum保存每次计算完的阶乘和,然后加上此次计算完的阶乘。有点类似递归的思想。
#include <iostream>
using namespace std;
int main() 
{
	int n=0,factorial=1,sum=0;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		factorial*=i;//factorial保存每次计算的阶乘
		sum+=factorial;//sum保存每次求的阶乘和
	}
	cout<<sum<<endl;
	return 0;
}
  • 例 对于正整数n,n>=2,求不大于n的全部质数
    思路:从2到n,一个个试是不是质数。如何判断一个数是不是质数?只需从2到这个数的平方根来试是不是这个数的因子,如果有一个是,这个数就不是质数。为什么到平方根就可以了呢?我一开始以为到i/2就够了,因为大雨i/2的数不可能是它的因子,但实际上,如果这个数i的因子大于此数的平方根,那么它的另一个因子必定小于平方根,那么在以前就已经被计算过了,所以没必要。
#include <iostream>
#include<cmath>
using namespace std;
void isprime(int num)
{
	bool f=false;
	for(int i=2;i<=sqrt(num);i++)
	{
		if(num%i==0)
		{
		f=true;
		break;
		}
	}
	if(!f)cout<<num<<endl;
}
int main() 
{
	int n,num=0; 
	cin>>n;
	for(int i=2;i<=n;i++)
		isprime(i);
	return 0;
}

思路二:筛选法。对于n之前的数,列一个数组,每次从第一个质数开始划掉此质数的所有倍数。剩下的就是质数。
例如对于2345678910
第一个质数是2,从4开始,划掉4 6 8 10
然后该质数3,从6开始划掉6 9
然后4,4已经被划掉,跳过
然后5,划掉10
其实到3就已经结束了,10是5的倍数,也是比5小的数2的倍数,早已经被划掉。

#include<cmath>
#define N 1000
using namespace std;
int main()
{
	int num[N+10]={0};//数组多弄几个,防止溢出 
	int i,j;
	for(i=2;i<=sqrt(N);i++)
	//这里有个失误,我一开始写的是for(i=2;i<=sqrt(N)&&num[i]==0;i++),目的是要满足这两个条件才执行循环,否则跳过。而实际上
	//如果条件不满足,for循环就直接结束了。因此在for里设了一个continue,不满足条件就跳过执行下一个。 
	{
		if(num[i]==1)continue;
		for(j=2*i;j<=N;j=j+i)//注意j从2i开始,因为i不用划 
		num[j]=1;//代表划掉j 
	}
	for(i=2;i<=N;i++)
	if(num[i]==0)cout<<i<<endl;
}

其实这里是数组可以设置成char类型,占内存更小,因为此数组只起到一个标志的作用。
三 .数组

  • 定义一个数组a[10],访问a[-2],a[20]编译也不会错误,因为编译器会直接根据下标查找地址。
  • 多维数组之矩阵乘法,定义mn和ns两个矩阵,输出乘积结果m*s矩阵。
    测试数据:
    2 3 3 //m n s
    2 4 5
    2 1 3
    1 1 1
    2 3 2
    0 1 4
    输出:
    10 19 30
    4 8 16
#include<cstring>
#define ROWS 10//对于不确定输入大小的数组申请,一般申请最大值,即题目给的范围
#define COLS 10
using namespace std;
int main()
{
	int matrix1[ROWS][COLS],matrix2[ROWS][COLS],matrix3[ROWS][COLS]={0};
	int i,j,k,m,n,s,sum=0;
	cin>>m>>n>>s;//输入mns
	for(i=1;i<=m;i++)
	for(j=1;j<=n;j++)
	cin>>matrix1[i][j];//输入矩阵1
	for(i=1;i<=n;i++)
	for(j=1;j<=s;j++)
	cin>>matrix2[i][j];//输入矩阵2
	memset(matrix3,0,sizeof(matrix3));
	for(i=1;i<=m;i++)
	{
		for(j=1;j<=s;j++)
		{//计算矩阵3的i行j列
		for(k=1;k<=n;k++)
		matrix3[i][j]+=matrix1[i][k]*matrix2[k][j];
		cout<<matrix3[i][j]<<" ";//画个图就能懂
        }
        cout<<endl;
	}
 } 

scanf和cin都是不能读入空格
在这里插入图片描述

#include <iostream>
#include <cmath> 
#define mti 1000000
using namespace std;
double f(double x)
{
	return x*x*x-5*x*x+10*x-80; 
}
double bs(double l,double r)
{
	double m=(l+r)/2;
	if(f(m)*mti<=1&&f(m)*mti>=-1)return m;
	else if(f(m)>0)return bs(l,m);
	else if(f(m)<0)return bs(m,r);
}
int main() 
{
	cout<<bs(0,100)<<endl;
	cout<<f(bs(0,100))*mti;
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值