c语言题目求解答~~~~~

问题描述

c语言题目求解答~~~~~
自然数列1,2,3,4,5,......大家都很熟悉,现将自然数列写成一排,数字中间不留空格等任何分隔符号就成了如下这样
123456789101112131415161718192021......
这是一个很长很长的串,现要求在这个串中找到一个最先出现给定子串的位置。例如给定子串1112,这该子串最先出现在串中第12个字符位置
为了能简化处理,我们保证评判时给定的子串在串中一定出现,且位置不大于10000.

输入格式

给定的子串(一行由数字字符构成的字符串,不超过80个字符),请使用scanf(""%s""........)读取
输出格式

最先出现子串的位置
输入样例

1112
输出样例

12

解决方案

http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html

解决方案二:
假定是子串是四个字符,从输入结果第一个开始,每次读取四个字符,与之比较

解决方案三:
#include
int main()
{
char s[80];
int l a[10000] i k = 9 b[10000] j o c[10000] f = 0 q x;
scanf(""%s"" s);
for(i = 0 q = 0; s[i] != ''; i++ q++)
{
c[i] = s[i] - '0';
// printf(""%d"" c[i]);
}
// printf(""%d"" q);
for(i = 0; i < 10000; i++)
{
l = i+1;
if(l > 9)
{
j = 0;
while(l)
{
b[j++] = l % 10;
l /= 10;
}
x = j - 1;
for(j = x; j >= 0; j--)
{
a[k++] = b[j];
// printf(""%d"" a[k-1]);
}
}
else
{
a[i] = l;
// printf(""%d"" a[i]);
}
j = 0;
for(o = 0; a[o] != ''; o++)
{
if(a[o] == c[j])
{
f++;
j++;
if(c[j] == '')
break;
}
else if(a[o] == c[0])
{
f = 1;
j = 1;
}
else
{
f = 0;
j = 0;
}
}
if(f == q)
{
printf(""%d"" i+1);
break;
}
f = 0;
}
return 0;
}

这是我自己的写的代码,不知道哪里错了,求大神解答

解决方案四:
#include
int main()
{
char s[80];//要找的子串
int l a[10000] i k = 9 b[10000] j o c[10000] f = 0 q x;
scanf(""%s"" s);
for(i = 0 q = 0; s[i] != ''; i++ q++)//q为子串个数
{
c[i] = s[i] - '0';//将char型数组转换为整型数组存放
}
for(i = 0; i < 10000; i++)
{
l = i+1;//从1开始到10000存进数组a中以便比较
if(l > 9)
{
j = 0;
while(l)
{
b[j++] = l % 10;
l /= 10;
}
x = j - 1;
for(j = x; j >= 0; j--)
{
a[k++] = b[j];//i>=10开始存放在b数组中,再逆序存放在a数组中,k是从9开始的
}
}
else
{
a[i] = l;//小于10的直接存放在a数组中
}
j = 0;
for(o = 0; a[o] != ''; o++)//将当前a数组与给定子串一一比较
{
if(a[o] == c[j])
{
f++;//若有相同的数组f自增,f是记录共有多少个数字相同了
j++;//比较完当前的再比较下一个
if(c[j] == '')
break;
}
else if(a[o] == c[0])//如果不同,则看下跟第一个数字相同不,相同就从第二个数字开始比了
{
f = 1;
j = 1;
}
else
{
f = 0;//不同f清零
j = 0;
}
}
if(f == q)//如果连续相同的个数f和给定子串长度q相同输出当前位置i+1
{
printf(""%d"" i+1);
break;
}
f = 0;
}
return 0;
}

解决方案五:
给你一个思路吧,自己去设计代码。

首先,这个题的原型是:
12345678910111213....这个字符串
给你一个整数N,比如1000,求这个数在这个字符串中的位置。
这样子,你是不是基本上有思路了?
注意:
1位数 9个
2位数 90个
3位数 900个
4位数 9000个
...

其次,看这个题,是不是可以转化成上述的问题呢?
答案肯定是可以的。
首先位置不大于10000,说明最大也就4位数。
只要知道所给字符串的第一个数字是多少就行了。
从1位到4位,首先判断成功的,即最先出现。

注意,所给字符串的第一个数字可能已经被分割了。
被分割的情况,就是分别往后跳1-3个字符,再按正常情况判定。
最后算出结果的时候,再将结果位置往前跳回去。

解决方案六:
KMP看毛片算法。。。

解决方案七:
#include
#include
int main()
{
char s[80];
int a[80] b[100000] d[10] k = 0 t i j = 0 l q f = 0 p;
scanf(""%s"" &s);
p = strlen(s);
for(i = 0; i < p; i++)
a[i] = s[i] - '0';
for(i = 0; i < 10000; i++)
{
l = i+1;
k = 0;
if(l > 9)
{
while(l)
{
d[k++] = l % 10;
l /= 10;
}
k = k-1;
for(; k >= 0; j++ k--)
b[j] = d[k];
}
else
b[j++] = l;
q = 0;
f = 0;
for(t = 0; t < j; t++)
{
if(b[t] == a[q])
{
q++;
f++;
}
else if(b[t] == a[0])
{
f = 1;
q = 1;
}
else
{
q = 0;
f = 0;
}
if(q == p)
break;
}
if(f == p)
{
printf(""%d"" i+1);
break;
}
}
return 0;
}
我自己改进了下,自己测试数据是对的,虽然没通过。。郁闷

时间: 2025-01-04 07:13:19

c语言题目求解答~~~~~的相关文章

c语言-数据结构C语言版10道实习题目求解答!!

问题描述 数据结构C语言版10道实习题目求解答!! 除有特别说明外,每个题目请以自然语言.形式化表述(伪码.流程图等).程序代码三种方式描述. 顺序结构线性表LA与LB的节点关键字为整数.LA与LB的元素按非递减有序,线性表空间足够大.试给出一种高效算法,将LB中的元素合并到LA中,使新的LA元素仍保持非递减有序.高效是指最大限度的避免移动元素. 请写一个算法将线性表(a1,a2,-,an)逆置为(an,an-1,-,a1). 在一个递增有序的线性表中,有数值相同的元素存在.若存储方式为单链表,

c语言题目求帮助--快排

问题描述 c语言题目求帮助--快排 文档下载"> 解决方案 你的cmp函数定义不对,修改为 int cmp(const void * a, const void * b) { return abs(*(int *)b) - abs(*(int *)a); }

c语言题目求指导~~初学数组 谢谢

问题描述 c语言题目求指导~~初学数组 谢谢 #include int main() { int a[9]={1,2,3,4,6,9,12,23,45},b[10],i,j,n; scanf("%d",&n); for(i=0,j=0;i {if(a[i] if(a[i]>n) b[j]=n; printf("%d ",b[j]); break;} for(i,j=j+1;i<9,j<10;i++,j++) {b[j]=a[i]; prin

c语言编程-求解答这两个的区别!(前两张图片),还有为什么不执行了(最后一张

问题描述 求解答这两个的区别!(前两张图片),还有为什么不执行了(最后一张 解决方案 左边的翻译一下就是如果....如果.....,两个if语句都会执行的,右边的翻译一下就是如果......不然.....,在不满足if时,才会判断else if. 下面的那个如果year不满足if中的条件的话就不会执行,if后面括号中的是用来判断的,只有符合条件才会执行大括号中的方法体 解决方案二: 右边的程序,只有当第一个条件不满足,才会判断第二个条件.左边不管第一个条件,都会判断第二个. 下面程序,不知道ye

一道简单的Map题目求解答

问题描述 packageMap;importjava.util.HashMap;importjava.util.Map;classDog{Stringname;Dog(Stringname){this.name=name;}@Overridepublicbooleanequals(Objectarg0){//TODOAuto-generatedmethodstubif((arg0instanceofDog)&&(((Dog)arg0).name==name)){System.out.pri

一道c语言的题目,求解答

问题描述 一道c语言的题目,求解答 有函数原型为void f(int,int *);主函数中有变量定义:int a,*p=&a,b[10];则下列几种调用错误的是: A·f(a,p) B·f(*p,b) C·f(b,&a) D·f(*p,p) 我的想法是:子函数要接收一个整形变量,一个指针变量,那么B选项中b不是指针常量么? 求助大神们解答!谢谢! 答案是C 解决方案 C B中 b 是数组名,可以看作 const 的指针 C中第一个参数是b,但实际参数是 int 解决方案二: B 选项中的

c语言-一道acmC语言题目,求大神解答

问题描述 一道acmC语言题目,求大神解答 描述国庆前每日一弹其中一道题是一个递推公式:f(n)=f(n-1)+f(n-2).现在已知f(1)=1f(2)=1.现在请你设计一个程序计算第n项对520取余的值(%520). 输入多组输入:对于每组输入:只有一行,一个n(0<n≤10^9),表示第n项.输出输出f(n)%520的值.样例输入 解决方案 如果有a = b+c,那么有a%520 = (b%520 + c%520)%520,可以照这样递推上去吧.不会溢出,就是不知道时间会不会超时. 解决方

c语言-C语言的一个小问题 求解答

问题描述 C语言的一个小问题 求解答 计算机问题求解答">如题 我的代码是这样 #includeint main(){ double xy; printf(""输入数据:""); scanf(""%lf""&x); if(x<1) y=x;else if(x>=1&&x<=10) y=2*x-1;else if(x>10) y=3*x-11;printf(&quo

printf-c语言中阶乘的一个小问题,求解答

问题描述 c语言中阶乘的一个小问题,求解答 #include #include #include #include int main() { const int MODE=1000000; int s=0; int i,j,n; scanf("%d",&n); for(i=1;i<=n;i++) { int factorial=1; for(j=1;j<=i;j++) factorial=(factorial*j%MODE); s=(s+factorial)%MOD