算法入门(一)

1.for循环的使用

其实简单的for(初始化;判断条件;调整)循环,一般都会用。

Tip:break用于跳出for循环,continue用于跳出此次循环,进入下一次;  for(;;)死循环

如:

int i,j=3,n=5;
for(i=0;i<n;i++)
{
     if(i>j)
    {
        break;
     }
}
//循环结束时,i=4

Q1.求1000-9999中的aabb类型的完全平方数(即前两位相等,后两位也相等)

for(i=1;;i++)
{
    if(i*i<1000)    {continue;}
    if(i*i>9999)     {break;}
    int x=i*i;
    int m=x/100;
    int n=x%100;
    if(m%10==m/10&&m%10==n/10)
    {
          cout<<x<<endl;
     }
}


2.溢出问题

计算过程中或计算结果超过了规定的范围,就是溢出。(以前看题目都不太注意给定的条件,如a<=7,n<10^9。以后要多注意!)

Q2.输入n,求1-n的阶乘的和的末尾6位数

一般代码:

        int n,sum=0,i,j,f;
	cin>>n;
	for(i=1;i<=n;i++)
	{
		f=1;
		for(j=1;j<=i;j++)
		{
			f*=j;
		}
		sum+=f;
	}
	cout<<sum%MOD<<endl;
	return 0;
以上代码的计算过程中就会出现乘法溢出的问题,如果单独计算1-20的阶乘之和的结果都得不出正确结果

所以,在计算过程中就直接对每一个加数对MOD取余,可以得到正确结果。代码如下

int n,sum=0,i,j,f;
	cin>>n;
	for(i=1;i<=n;i++)
	{
		f=1;
		for(j=1;j<=i;j++)
		{
			f=f*j%MOD;                                         //每个加数都先进行取余操作
		}
		sum+=f;
	}
	cout<<sum%MOD<<endl;                                               //最后的结果也进行取余操作

3.文件操作

重定向:(个人理解:就是将输入的流的来源改变,从键盘读取改为文件读取)

                 freopen("input.txt","r",stdin);

                 freopen("output.txt","w",stdout);

(补充:)

C语言重定向:

        FILE *fin;                                         //需要关闭文件,fclose();
	FILE *fout;
	fin=fopen("in.txt","r");
	fout=fopen("out.txt","w");
        fclose(fin);
        fclose(fout);
C++重定向:

 streambuf *backup1,*backup2;
ifstream fin;
ofstream fout;
fin.open("in.txt");
fout.open("out.txt");
backup1=cin.rdbuf();
cin.rdbuf(fin.rdbuf());       
cout.rdbuf(fout.rdbuf());
cin.rbuf(fin.rdbuf);     //输入完成后写(最后一个cin后面)
cout.rdbuf(fout.rdbuf); //输出完成后写(最后一个cout后面)





input.txt需要自己定义,output.txt会在程序运行后产生,自己可以不建立。两个TXT文档都会出现在CPP所在的文件夹中。

int _tmain(int argc, _TCHAR* argv[])
{
	freopen("input.txt","r",stdin);
	freopen("output.txt","w",stdout);
	int n,sum=0,i,j,f;
	cin>>n;
	for(i=1;i<=n;i++)
	{
		f=1;
		for(j=1;j<=i;j++)
		{
			f=f*j%MOD;
		}
		sum+=f;
	}
	cout<<sum%MOD<<endl;
	cout<<"Timed used:"<<clock()/CLOCKS_PER_SEC<<endl;
	return 0;
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值