首页 > 试题广场 >

无限长正整数排列字符串

[编程题]无限长正整数排列字符串
  • 热度指数:8483 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
\hspace{15pt}定义无限字符串 S=\texttt{,即将所有正整数依次拼接得到。
\hspace{15pt}珂朵莉想知道该字符串的第 n 个字符是什么。

输入描述:
\hspace{15pt}在一行中输入一个整数 n \left(1 \leqq n \leqq 1000\right)


输出描述:
\hspace{15pt}输出一个数字,表示字符串 S 的第 n 个字符。
示例1

输入

3

输出

3

说明

n=3 时,S=\texttt{,其第 3 个字符为 \texttt{'3'}
示例2

输入

11

输出

0

说明

n=11 时,S=\texttt{,其第 11 个字符为 \texttt{'0'}

备注:

#include <stdio.h>
#include <string.h>
int main()
{
    int n=0;
    scanf("%d",&n);
    char num1[2000]="";
    char num2[1000]={0};
    for(int i=1;strlen(num1)<n;i++)
    {
        sprintf(num2,"%d",i);
        strcat(num1,num2);
    }
    printf("%c",num1[n-1]);
    return 0;
}
楼主太菜了,改了好几次。第一个是要注意他的拼接方式,一开始楼主理解为只是那个给出的15个字符无线循环最后肯定错了,他是1   2  ……11  12  13 这么拼接的;第二个,将整数转化为字符的形势需要用sprintf这个函数;第三,最后输出结果那块,之前直接写在了循环里面,if(strlen(num1)==n),忽视了他拼接后很有可能超出n这个情况,最后把printf放在外面,直接输出解决(还是条件理解的不深刻)
希望写的这些有所帮助。
发表于 2025-12-09 09:39:46 回复(1)
#include <stdio.h>

int main() {
    int n=0;
    scanf("%d",&n);
    if(n<=9)
    {
        printf("%d",n);
    }
    else if(n<=189)    //在两位区间
    {
        int pos=n-9;
        int num=10+(pos-1)/2; //数字的序号
        int ret=(pos-1)%2;    //在一个数字中的位置,为0就是最高位,1第二位
        if(ret==0)
            printf("%d",num/10);
        else 
            printf("%d",num%10);
    }
    else {              //在三位区间
        int pos=n-189;
        int num=100+(pos-1)/3;
        int ret=(pos-1)%3;
        if(ret==0)
            printf("%d",num/100);
        else if(ret==1)
            printf("%d",num/10%10);
        else
            printf("%d",num%10);
    }
    return 0;
}

发表于 2025-11-29 15:06:32 回复(1)