编程问题_一个编程问题
问题补充:
在l到r之间有多少个数存在长度至少为2的回文子串?r的位数不大于1000
补充:用什么语言写都可以。补充:比如110就满足条件,因为包含回文子串11;但是102不满足。补充:答案还要mod 1000000007补充:实在不行就做R不大于10^6的或者10^9的补充:请用C/C++/Pascal写最佳答案
给你个参考:
#include <stdio.h>
#include <string.h>
char s[1001];
int ct=0;
void find(int m,int n)
{
int i;
while(m<=n)
{
if (s[m]!=s[n]) return;
m++; n--;
}
ct++;
ct%=1000000007;
}
////至少为2的回文子串
int main()
{
int i,j,k,len;
gets(s);
len=strlen(s);
for (k=2;k<=len;++k)
for (i=0;i<=len-k;++i)
find(i,i+k-1);
printf("%d\n",ct);
return 0;
}
追问:
这个是给出一个串之后求至少为2的回文子串吗,跟这题的难度差了好几个等级 追答:
这个你测试下结果就知道了,例样输入 110输出1输入111输出3输入aabaabaabaa输出19你看下哪个测试不符合你的要求?
追问:
程序输入的是两个整数l和r,查询l到r之间有多少个数满足这个条件 追答:
看错题了......C的话,可以用大数运算(有现成的库,也可以自己写函数的)但这个我肯定要用java来写JAVA有Biginteger的,用它写很简单的,稍后写给你
追问:
请用C/C++/Pascal写,我只能看懂这些。。。
追问:
实在不行就做R不大于10^6的或者10^9的 追答:
若是R不大于10^6的或者10^9的,这个就简单了在我原程序的main中加 int i, j, k, len; ///原来的 int l, r; scanf("%d%d", &l, &r); while(l <= r) { itoa(l, s, 10); len=strlen(s); //原来的..... }其它不变,就可以了,只为int最大就是10^9而JAVA的,我也做好了,只是程序类似,无法上传(若你需要,重新开贴,可用图片方式传给你,图只能在新贴中)
追问:
时间限制是1秒啊 追答:
有时间限制,就有难度了,要改进算法
追问:
对啊对啊
追问:
还有itoa事什么鬼,编译都过不去 追答:
itoa将数字转为字符串的函数(gcc等都支持的),这个要加头文件stdlib.h的另外,1S对10^9要求高了些,不是一般的算法可以做到的,特别是输入为1 99999999时,大循环就相当耗时了(这种考核绝对对算法理论有相当的要求,我是实际做开发的,很久没研究算法了,因为实际应用中根本用不到的)
追问:
编译过了,但是l=100;r=1000的时候有错误,输出273,而应该是253
我看下,算法应该没有问题,要么是要去重的,如111我的算法是11 11 111算3个的,其中两个11是重复的你的标准答案可能只算2个
最佳答案由网友 whoami1978 提供
其他回答
其它网友回答:
这个用任何语言都可完成,可以用循环语句完成