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^๑)۶
一年多之前 回复
qq_36747897
qq_36747897 那一堆数据是怎么写出来的? sprintf 那段没有看懂。 。。列表
一年多之前 回复
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 捂脸,楼主,我错啦,这个答案是错的!
一年多之前 回复
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币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
10个经典C语言算法—零基础小白必学
C语言中有有许多经典的算法,这些算法都是许多人的智慧结晶,也是编程中常用的算法,这里面包含了众多算法思想,掌握这些算法,对于学习更高级的、更难的算法都会有很大的帮助,会为自己的算法学习打下坚实的基础。接下来我们先来看10道:(1) 输出9*9乘法口诀运行结果:(2) 打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个“水仙花数”,因为153=...
C语言经典例题简单算法
又一个经典C语言例题,摘自C语言网。 题目: 一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高? 1.程序分析: 见下面注释 2.程序源代码: main() { float sn=100.0,hn=sn/2; int n; for(n=2;n { sn=sn+2*hn;/*第n次落地时共经过的米数*/
C语言笔试算法题
C语言笔试算法题
C语言经典最基础算法题(从小白到大神)
我会把我学习C语言碰到的经典的算法题目全都归类到这个帖子中,希望对和我一样学习编程的小白有帮助!但求精简,以最少的时间入门C语言。 1.输入n个数,输出其中最大的一个数。 #include int main() { int n,i,s=0; //s为最大的数 int a[100]; //存储的数组 printf("请输入你要比较的个数:"); sc
hdu 2072 找单词 很不错的一道题 模拟 and STL 2种做法
单词数 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 16105    Accepted Submission(s): 4187 Problem Description lily的好朋友xiaoou333最近很空,他想了
C语言编写的星座小程序
C语言编写的星座小程序,能查到自己的星座和该星座的较多配对信息~
一个经典C语言编程题的算法解析(等分正三角形后共得多少三角形)
经典C语言编程题解析 将一个正三角形的各边都n等分,过各分点作其它两边的平行线,一共可产生多少个三角形(包括原来的三角形在内)? 解析:不妨设正△ABC的边长为n,首先考虑“头朝上”的三角形,即平行于水平线的那条边在其对角顶点下方的三角形. 边长为1的“头朝上”的三角形有 1+2+…+n = (n(n + 1) / 2)个. 边长为2的“头朝上”的三角形有 1+2+…+(n-1)
五十道编程小题目,大家有时间也做做啊,一起交流算法与心得
注:题目为转载,程序为原创 今天在黑马论坛上,看到了50道编程小题目,看了一下挺好的,就留下来,大家有时间也做做啊,做好把代码和心得贴在自己博客,大家一块交流啊,别小看这些小题目,做大的系统也是把一个大系统不断的分成一个个小模块做啊,我觉得这个很能锻炼逻辑思维能力,和对面向对象的理解,从题目中抽象出来类,并思考类中字段,方法,这个过程可以收获很多,好了废话不说了,题目如下: 【程序1】
C语言经典算法100例(一)
C语言中有有许多经典的算法,这些算法都是许多人的智慧结晶,也是编程中常用的算法,这里面包含了众多算法思想,掌握这些算法,对于学习更高级的、更难的算法都会有很大的帮助,会为自己的算法学习打下坚实的基础。   接下来我们先来看10道:   (1)输出9*9乘法口诀。  //9*9乘法口诀表 void Table99() { int i,j; for(i = 1; i <= 9; i+
赛码网,简单计算,用C语言自己实现的一个程序,仅供参考
简单计算 题目描述 小赛所在的小组主要负责WEB应用的开发工作,这次他所在的小组正在开发一个WEB版的财务软件。为方便用户使用,他 们打算为用户提供一个简单计算功能,用户输入数学算式,就可以得到计算结果。其中涉及的计算包括:”+”、”-”、 ”*”、”/”、”^”、”(”、”)”,分别表示加减乘除和指数,其中括号用于调整计算的顺序。合法的表达式如下: x+y+z x+(y+z) x*(y+z)+a-b-c^d 小赛对此不太精通,因此请你帮忙编写这个程序。