2 qq 36747897 qq_36747897 于 2017.01.05 20:05 提问

C语言的一个小算法题(想了好久好久)

把数字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的个数。

有点晕

8个回答

surongle123
surongle123   2017.01.05 22:57

图片说明

surongle123
surongle123 用来生成smarandche序列的,然后用来和输入的数n做比较,从而判断是第几个smarandche数,也就判断出1到n,有多少个smarandche数了,希望给发,٩(๑^o^๑)۶
11 个月之前 回复
qq_36747897
qq_36747897 那一堆数据是怎么写出来的? sprintf 那段没有看懂。 。。列表
11 个月之前 回复
huangchijun11
huangchijun11   2017.01.05 20:58

这个应该是根据给出的n的值做判断吧,有点类似于排序思想,找出小于n的最大Smarandache consecutive number,然后你就知道有多少个这样的数了

surongle123
surongle123   2017.01.05 22:10

图片说明

Zindow
Zindow   2017.01.06 03:30

思路大概如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 ;

}

Zindow
Zindow   2017.01.06 03:30

抱歉。。。初入CSDN。。。不知道会出现这样的情况。。。我把代码上图吧。。。
图片说明

Zindow
Zindow 捂脸,楼主,我错啦,这个答案是错的!
11 个月之前 回复
xianfajushi
xianfajushi   2017.01.06 10:52

这个应该用字符串进行连接即可,用数字行?

u011889952
u011889952   2017.01.08 16:05

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);

核心部分的代码

shen_wei
shen_wei   Ds   Rxr 2017.01.12 17:02
    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;
    }

一个简单的算法。。。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!