给你这么个数列
112123123412345123456123456712345678123456789123456789101234567891011...
看出规律了吗 这个数列是由下列数列串合而成:
1
12
123
1234
12345
123456
1234567
12345678
123456789
12345678910
1234567891011
12345678910...
...
现在问题是给定1 <=i <=2147483647
要求此数列的第i位
程序1 求中间值:
#include<iostream>
using namespace std;
int main()
{
unsigned long i=2147483647;
unsigned long k=0;
unsigned long all=0;
unsigned long las=1;
for(;k<9&&all<=i;k++)
{
all+=las;
las++;
}
for(;k<99&&all<=i;k++)
{
all+=las+1;
las+=2;
}
for(;k<999&&all<=i;k++)
{
all+=las+2;
las+=3;
}
for(;k<9999&&all<=i;k++)
{
all+=las+3;
las+=3;
}
for(;k<99999&&all<=i;k++)
{
all+=las+4;
las+=4;
}
cout<<k;
cout<<all;
cout<<las;
return 0;
}
程序2 主程序 但是哈希表没写...太麻烦1--35009的连续数:
#include<iostream>
#include<vector>
using namespace std;
int main()
{
typedef unsigned long ul;
vector<short> ful_lis;//2 complex 2 initialize this hash table
ul end;
ul k;
ul all;
ul las;
short add;
cin>>end;
if(end<45)
{
k=0;
all=0;
las=0;
add=0;
}
else if(end<9045)
{
k=9;
all=45;
las=9;
add=1;
}
else if(end<1395495)
{
k=99;
all=9045;
las=189;
add=2;
}
else if(end<148918995)
{
k=999;
all=1395495;
las=2889;
add=3;
}
else if(end<2147483647)
{
k=9999;
all=148918995;
las=29889;
add=4;
}
for(;all<end;k++)
{
all+=las+add;
las+=add;
}
cout<<ful_lis[end-all];
return 0;
}