//求周期串--算法竞赛入门经典
//如输入HOHOHO,输出2
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int main()
{
char word[100];
scanf("%s",word);
int len=strlen(word);
for(int i=1;i<=len;i++)
if(len%i==0)
{
int ok=1;
for(int j=i;j<len;j++)
if(word[j]!=word[j%i]){ok=0;break;}
if(ok==1){printf("%d",i);break;}
}
return 0;
}
//求阶乘的精确值--高精度--输入0到1000内的数,输出其阶乘的值,最多将近3000位
#include<iostream>
#include<cstring>
#include<cstdio>
#include<memory.h>
using namespace std;
const int maxn=3000;
int f[maxn];
int main()
{
int i,j,n;
while(scanf("%d",&n),n)
{
memset(f,0,sizeof(f));
f[0]=1;
for(i=2;i<=n;i++)
{
int c=0;
for(j=0;j<maxn;j++)
{
int s=f[j]*i+c;
f[j]=s%10;
c=s/10;
}
}
for(j=maxn-1;j>=0;j--)if(f[j])break;
for(i=j;i>=0;i--)printf("%d",f[i]);
printf("\n");
}
return 0;
}
//栈和队列之 队列--具体操作是,如果队列不空就把头部输出,然后把下一个放在底部,继续直到队列为空
#include<iostream>
#include<queue>
#include<cstdio>
using namespace std;
queue <int> q;
int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
q.push(i+1);
while(!q.empty())
{
printf("%d ",q.front());
q.pop();
q.push(q.front());
q.pop();
}
return 0;
}
toj1036 rails 这道题也是典型的栈的题,火车都是12345```n这样进入的,根据给出的出栈情况判断是否能够这样做
代码中的A代表的是入栈的序列,B代表的是输入,也就是出栈序列的位置
说明一下代码中关键的四句:
if(a==target[b]){a++;b++;}//输入了之后又输出,也就是进栈之后马上出去了。因此这个不算,所以a和b都后移
else if(!s.empty()&& s.top()==target[b]){s.pop();b++;}//另一情况,如果栈不空并且栈顶等于当前出栈序列的那个位置的车,则pop出来,b++
else if(a<=n) {s.push(a);a++;}//如果都不行的话,证明需要进栈,因此如果a还没超范围的话,就push进去
else {ok=0; break;} //否则证明不对
也就是说,12345到n的火车每个车都可能有三种操作,一个是进去了又出去了,一个是进栈等待。还有就是发现已经匹配不到了,所以错误
//栈和队列之 栈
#include<iostream>
#include<cstdio>
#include<stack>
using namespace std;
int main()
{
int n,target[1010];
while(cin>>n)
{
if(n==0)break;
while(cin>>target[1])
{
stack<int> s;
if(target[1]==0)break;
for(int i=2;i<=n;i++)
cin>>target[i];
int a=1,b=1,ok=1;
while(b<=n)
{
if(a==target[b]){a++;b++;}//输入了之后又输出
else if(!s.empty()&& s.top()==target[b]){s.pop();b++;}
else if(a<=n) {s.push(a);a++;}
else {ok=0; break;}
}
if(ok==0)cout<<"No"<<endl;
else cout<<"Yes"<<endl;
}
cout<<endl;
}
return 0;
}