5.1.3周期串
求串的最小周期数,可以从小到大枚举各个周期,一旦符合条件就立即输出。
#include<stdio.h>
#include<string.h>
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){printf("%d\n",i);break;}
}
return 0;
}
5.2.1 小学生算数
计算两个整数在相加过程中需要多少次进位
#include<stdio.h>
int main()
{
int x,y,count,a,b,flag=0;
while(scanf("%d %d",&x,&y)&&(!(x==0&&y==0)))
{
count=0;
if((x%10+y%10)>=10)
{
flag=1;
count++;
}
while(((x=x/10)!=0)&&((y=y/10)!=0))
{
if((x%10+y%10)+flag>=10)
{
flag=1;
count++;
}
else flag=0;
}
printf("%d\n",count);
}
return 0;
}
5.2.2 阶乘的精确度
输入不超过1000的正整数n,输出n!是精确结果。
分析1000!约为4*10^2567,用一个3000个元素的数字f保存。
f[0]存个位,f[1]存十位,……
#include<stdio.h>
#include<string.h>
const int maxn=3000;
int f[maxn];
int main()
{
int i,j,n;
scanf("%d",&n);
memset(f,0,sizeof(f));
f[0]=1;//1!=1
for(i=2;i<=n;i++)//从2开始乘
{
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;//排除前面的0
for(i=j;i>=0;i--) printf("%d",f[i]);
printf("\n");
return 0;
}
5.3.1 6174问题
给一个四位数,每一次重新组合的最大数减最小数,知道出现重复的
#include<stdio.h>
#include<string.h>
int get_next(int x)
{
int a,b,n,flag;
char s[10],temp;
sprintf(s,"%d",x);//转化为字符串
n=strlen(s);
//冒泡排序,从小到大
for(int i=n-1;i>0;--i)
{
flag=0;
for(int j=1;j<=i;++j)
{
if(s[j-1]>s[j])
{
temp=s[j];
s[j]=s[j-1];
s[j-1]=temp;
flag=1;
}
}
if(flag==0)
break;
}
sscanf(s,"%d",&b);//转化为整数
for(int i=0;i<n/2;i++)
{
char t=s[i];
s[i]=s[n-1-i];
s[n-1-i]=t;
}
sscanf(s,"%d",&a);
return a-b;
}
int num[2000],count;
int main()
{
scanf("%d",&num[0]);
printf("%d",num[0]);
count=1;
for(;;)
{
num[count]=get_next(num[count-1]);
printf("->%d",num[count]);
int found=0;
for(int i=0;i<count;i++)
{
if(num[count]==num[i]){
found=1;break;
}
}
if(found)break;
count++;
}
return 0;
}