把数字1到n连接起来就构成了第n个Smarandache consecutive number。Smarandache的前17个数如下:
1
12
123
1234
12345
123456
1234567
12345678
123456789
12345678910
1234567891011
123456789101112
12345678910111213
1234567891011121314
123456789101112131415
12345678910111213141516
1234567891011121314151617
给定一个正整数n,问[1,n]之间含有多少个Smarandache consecutive number?
输入
多行数据组成。
每行一个整数n,n大于1并且小于第1000个Smarandache consecutive number。
输出
对于每一行的数据n,输出一行,即[1,n]之间Smarandache consecutive number的个数。
有点晕
这个应该是根据给出的n的值做判断吧,有点类似于排序思想,找出小于n的最大Smarandache consecutive number,然后你就知道有多少个这样的数了
抱歉。。。初入CSDN。。。不知道会出现这样的情况。。。我把代码上图吧。。。
思路大概如2L所说,3L用的暴力打表的方法,我这里提供一个非暴力打表的(如果表打好了,实际上暴力打表会快很多,我这里提供的实际上也是比较
暴力的比较):
#include
#include
int solve(char *);
int level(char *);
int comp(int,char *);
int change(char *);
void up(int,char *);
int main()
{
const int SIZE = 1*9 + 2 *90 + 3*900;
char n[SIZE + 1];
while(~scanf("%s",n) && *n >'0'){
printf("%d\n",solve(n));
}
return 0;
}
int solve(char * n)
{
int lv = level(n);
return comp(lv,n);
}
int level(char * n)
{
if(strlen(n) - 9 <= 0) return 1;
if(strlen(n) - (9 + 2 * 90) <= 0) return 2;
return 3;
}
int comp(int lv,char * n)
{
char num[3][4] = {{'1','\0'},{'1','0','\0'},{'1','0','0','\0'}};
char * p = n;
int i,j;
int base = 1;
for(i=0;i<lv;++i){
for(j=0;j<9*base;++j){
if(strncmp(num[i],p,i+1) > 0)
return change(num[i]) - 1;
if(j<9*base - 1){
up(i+1,num[i]);
p += i+1;
}
}
base *= 10;
}
return change(num[i]);
}
int change(char * n)
{
int ans = 0;
int l = strlen(n);
int base = 1;
for(int i=l-1;i>=0;--i,base*=10)
ans += base*(n[i] - '0');
return ans;
}
void up(int l,char * n)
{
int flag = 0;
if(l==0) return ;
else if((n[l-1] += 1) > '9') { n[l-1] = '0'; flag = 1;}
if(flag) return up(l-1,n);
else return ;
}
int counts=0;
char n[1000*1000]={0};
char outs[1000*1000]={0};
scanf("%s",n);
while((strlen(outs)<=strlen(n))&&(strcmp(outs,n)<0))
{
sprintf(outs+strlen(outs),"%d",++count);
}
printf("%d",count);
核心部分的代码
char cNum[10000] = {0};
int nCount = 0;
for (int i = 1;i < 10; i++)
{
cNum[nCount++] = i;
}
for (int i = 10;i < 99; i++)
{
cNum[nCount ++] = i / 10;
cNum[nCount ++] = i % 10;
}
for (int i = 100;i < 999; i++)
{
int n = i / 100;
int m = (i - n * 100) / 10;
cNum[nCount ++] = n;
cNum[nCount ++] = m;
cNum[nCount ++] = i % 100;
}
一个简单的算法。。。