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; }