给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
#include<stdio.h>
#include<string.h>
#define SIZE 10
int main(void)
{
//输入一个目标字符串
char a[SIZE]="zaqwsxxz";
//创建一个数组b用于接收子字符串长度
int b[SIZE];
int i,j,k;
for(i=0 ; a[i]!='\0'; i++){
//子字符串最短为一个字母,所以初始化b[i]=1 。每进行完一次循环没有break说明当前字符的前面没有与之相等的,b[i]++
for(b[i]=1,j=i+1 ; a[j]!='\0' ; j++ , b[i]++){
// 当前字符为第k个,从第i个字符开始往后比较
for(k=i ; k<j ; k++){
if(a[k] == a[j]){
break;//如果相等,则退出循环
}
}
if(k<j){
break;//k<j说明上面个循环没有进行完(break了),所以就遇到了相等的字符,则以第i个字符开头的子字符串到达了最长,返回最外层循环
}
}
}
int max=b[0];
for(i=0 ; i<strlen(a) ; i++){
if(b[i]>max)
max=b[i];
}
printf("%d\n",max);
return 0;
}
寻找两个有序数组的中位数
#include<stdio.h>
double find(int* nums1, int nums1Size, int* nums2, int nums2Size) {
int numSize = nums1Size+nums2Size;
int s[numSize];
int i,l=0,r=0;
for (i = 0; i <= (numSize/2);)
{
if (l == nums1Size){
while (i <= (numSize/2)){
s[i++] = nums2[r++];
}
} else if (r == nums2Size){
while (i <= (numSize/2)){
s[i++] = nums1[l++];
}
} else{
if(nums1[l] < nums2[r]){
s[i++] = nums1[l++];
} else{
s[i++] = nums2[r++];
}
}
if(numSize%2==1){
return s[i-1] ;
}else{
return ((s[i-2]+s[i-1]) / 2.0);
}
}
int main(void)
{
int a[2]={1,2};
int b[2]={3,4};
printf("%.1f",find(a,2,b,2));
return 0;
}
输出最长的回文字符串的数字
#include<stdio.h>// 输出最长的回文字符串的数字
int Long(const char *s, int n)
{
int i,max=0,c,j;
if(s==0||n<1)
return 0;
for(i=0;i<n;i++)// 枚举中心位置,然后再在该位置上用扩展法
{
for(j=0;(i-j)>=0&&(i+j<n);j++) //奇数
{
if(s[i-j]!=s[i+j])
break;
c=j*2+1;
}
if(c>max)
max=c;
for (j = 0; (i - j >= 0) && (i + j + 1 < n); ++j)
{ //偶数
if (s[i - j] != s[i + j + 1])
break;
c = j * 2 + 2;
}
if (c > max)
max = c;
}
return max;
}
int main(void)
{
char a[101];
gets(a);
int n;
scanf("%d",n);
printf("%d",Long(a,n));
}
孪生素数
我的思路
#include<stdio.h>
#include<math.h>
#include<string.h>
int twin(int a, int b);
int main(void)
{
int a,b;
scanf("%d%d",&a,&b);
while(a>=1&&b>=a&&b<=100000)
{
if(b-a<2)
printf("0");
else
printf("%d\n",twin(a,b));
return 0;
}
}
int twin(int a, int b)
{
int i,j,n[100001],l=0,flag;
memset(n,0,sizeof(n));
for(i=a;i<=b;i++)
{
flag=0;
for(j=2;j<i;j++)
{
if(i%j==0||i==1)
{
flag=1;
break;
}
}
if(flag==0)
{
n[l++]=i;
}
}//判断素数将其传入数组
int h=0;
for(i=0;i<=l;i++)
{
if(n[i+1]-n[i]==2||n[i+2]-n[i]==2)
{
h++;
}//判断距离
}
return h-1;
}
网上更优思路
#include<stdio.h>
#define q 1000011
int a[q];
int main()
{
printf("please input c,d(c>2):\n");
int i;
int j;
a[1]=a[0]=1;
for(i=2;i<q;i++)
{
if(!a[i])
{
for(j=2*i;j<q;j+=i)
a[j]=1;
}//从2开始把每个数的倍数下标的数组设置成值为1
}//这样一轮循环下来值为0的数组元素,下标值就是素数
int m,n;
scanf("%d,%d",&n,&m);
int x=n;
int y=m;
int z;
z=0;
if(m<=2)
printf("0\n");
else
{for(i=x+2;i<=y;i++)
{
if(!a[i]&&!a[i-2])//判断距离是否为2;
{printf("(%ld,%ld)\n",i-2,i);
z++;
}
}
printf("total=%d\n",z);
}
}
**我们哥德巴赫老哥曾经说过: 任何大于6的偶数都可以分解成两个素数(素数对)的和.但是有些偶数可以分解成多种 素数对的和,比如 14=3+11=7+7(1不是素数哈,我相信很多人都忘记了)所以14有两个素数对 **
input:任意大于6的正偶数(整形数据)
output:求出这个偶数有多少个素数对
#include<stdio.h>
#include<math.h>
#include<string.h>
int twin(int b);
int main(void)
{
int b;
scanf("%d",&b);
while(b>6)
{
printf("%d\n",twin(b));
return 0;
}
}
int twin(int b)
{
int i,j,n[100001],l=0,flag;
memset(n,0,sizeof(n));
for(i=2;i<=b;i++)
{
flag=0;
for(j=2;j<i;j++)
{
if(i%j==0)
{
flag=1;
break;
}
}
if(flag==0)
{
n[l++]=i;
}
}//判断素数将其传入数组
int h=0;
for(i=0;i<=l;i++)
{
for(j=0;j<=i;j++)
{
if(n[i]+n[j]==b)
{
h++;
// printf("%d %d ",n[i],n[j]);
break;
}
}
}
return h;
}
杭电oj 1097
您应输出a ^ b的最后一位数字。
#include<stdio.h>
int main(void)
{
int a,b,c;
printf("-->:");
while(~scanf("%d%d",&a,&b))
{
b%=4;//通过找规律发现0~9最多连乘4次就会回到自身数值
a%=10;//中心思想:只需b对4取余,再进行循环就能得到结果
c=a;
if(b==0)
b=4;
while(--b)
c=c*a%10;
printf("%d\n",c);
}
}