首页 > 试题广场 >

小乐乐与二段数

[编程题]小乐乐与二段数
  • 热度指数:8046 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解

小乐乐从老师口中听到了二段数这个名词,想更深入的了解二段数。

二段数是这样的正整数:恰好包含两种不同的十进制数字sts不是0,并且s的所有出现均排列在所有的t的前面。例如,44444411是二段数(s4t1),41100000005555556也是。但444411444444都不是二段数。

这时老师问小乐乐:给你一个任意的正整数n,你能求出比n大并且是n的倍数的最小二段数吗?请你帮助小乐乐解答这个问题。


输入描述:
多组输入,每组输入包含一个正整数n (1 ≤ n ≤ 99999)

题目保证测试数据总数不超过500组,当输入n=0时程序结束。


输出描述:
对于每组测试用例,输出正整数n,后面紧跟“: ”,输出答案并换行,即比n大且是n的倍数的最小二段数。
示例1

输入

1
2019
0

输出

1: 10
2019: 9999999993
//一来想的是从首位而不是末位开始判断,让代码变复杂了算得也很慢完全超时,但至少是对的T T
//总之记录一下

#include <stdio.h>

//算总位数,x=接收的数
int Num(long long x) {
    if (x < 10)
        return 1;
    else
        return Num(x / 10) + 1;
}

//算乘方,x=底数,n=幂
long long Mut(int x, int n) {
    int turn = 0;
    long long ret = 1;
    for (turn = 0; turn < n; turn++) {
        ret *= x;
    }
    return ret;
}

//第几位是几,x=接收的数,n=要求的位数
int Figure(long long x, int n) {
    int num = Num(x);
    return (x % Mut(10, num - n + 1)) / Mut(10, num - n);
}

int main() {
    int x = 0;//输入的数,1~99999
    while (scanf("%d", &x) == 1 && x != 0) {
        printf("%d: ", x);
        long long n = x;//x的倍数,输出的数
        long long mut = 1;//n是x的多少倍
        for (;; mut++, n = x * mut) {
            if (n < 10)
                continue;

            int num = Num(n);//n的位数,两位数以内
            int turn = 0;//进行的轮数,不会超过位数
            int n1 = n / Mut(10, num - 1); //二段数第一个
            int n2 = 0;//二段数第二个

            for (turn = 0; turn < num;turn++) //从第一位开始检测直到遇到不同的数。
            {
                if (num - 2 <= 0) {
                    turn++;
                    break;
                }
                if (Figure(n, turn + 2) == n1)
                    continue;
                else {
                    turn++;
                    break;
                }
            }

            if (num - 2 > 0)
                n2 = Figure(n, turn + 1);

            for (; turn < num;turn++)//从遇到不同的数开始检测直到再次遇到不同的数。
             {
                if (num - 3 < 0) {
                    turn++;
                    break;
                }
                if (Figure(n, turn + 2) == n2)
                    continue;
                else {
                    turn++;
                    break;
                }
            }

            if (turn == num && n != x) {
                printf("%lld\n", n);
                break;
            }
        }
    }
    return 0;
}
发表于 2025-02-15 17:25:27 回复(0)
#include <stdio.h>
//自测无误,应该是目前时间最短和内存最少的代码,可惜提交超时
int main() {
    int n;

    while (~scanf("%d", &n)) {
        long long i = 1;//每次扫描后重新定义i;i值可能很大,用longlong
        while (n) {//只要n不为0就运行
            i++;
            long long sum = n * i;
            if (sum < 10)
                continue;

            int count = 0;
            while (sum /= 10) {
                if ((sum % 10) != (sum / 10 % 10))//末尾两数进行比较
                    count++;
                if (count > 1)
                    break;
            }

            if (count == 1) {
                sum = n * i;
                printf("%d: %lld\n", n, sum);
                break;
            }
        }
    }
    return 0;
}
发表于 2024-03-22 23:20:54 回复(0)
/*
现在的能力只能这样了,以后能力提升后再来

超时了,而且long long也放不下那么大的数
现在的版本只能找出范围在long long以内的数
*/
#include <stdio.h>

int IsTwoNumber(long long x)
{
	int count = 0;

	while (x)
	{
		if (x < 10)
		{
			break;
		}
		//判断是否变段
		if (x % 10 != (x / 10) % 10)
		{
			count++;
		}
		x /= 10;
	}
	//二段数会且只会变段 1 次
	if (count == 1)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}

int main()
{
	int n = 0;
	int i = 0;
	long long sum = 0;

	while (scanf("%d", &n), n != 0)
	{
		i = 1;

		while (++i)
		{
			sum = i * n;
			if (IsTwoNumber(sum))
			{
				printf("%d:%lld\n", n, sum);
				break;
			}
		}
	}

	return 0;
}

编辑于 2024-03-20 19:43:16 回复(0)
#include <stdio.h>

int BinaryNumJudge(long long x)
{
    long long a = x % 10;//得到x最右边的数
    int flag = 0;
    while (x /= 10)//从右向左依次对比数是否发生变化
    {
        if (a != x % 10)
        {
            a = x % 10;
            flag++;//flag可以检测位数上的值变化了多少次
        }
        if (flag > 1)
        {
            break;
        }
    }
    if (flag == 1)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}

int main()
{
    int n = 0;
    while (scanf("%d", &n) != EOF)
    {
        if (n == 0)
            break;
        long long i = 0;
        for (i = 2 * n; ; i += n)
        {
            int ret = BinaryNumJudge(i);//判断i是不是二段数,是返回1,不是返回0
            if (ret)
            {
                printf("%d: %lld\n", n, i);
                break;
            }
        }
    }
    
    return 0;
}

发表于 2022-06-10 16:58:23 回复(0)

#include<stdio.h>
int main()
{
    int n;
    int arr[20]={0};
    long long times=0,conpy;
    int i=0,j=0,k,d=0;
    while(~scanf("%d",&n))
    {
        if(n==0)
            break;
        for(i=2;i<10000000;i++)
        {
            times=i*n;
            j=0;
            conpy=times;
            while(times>0)
            {
                arr[j]=times%10;
                j++;
                times=times/10;
            }
            d=0;
            for(k=0;k<j-1;k++)
            {
                if(arr[k]!=arr[k+1])
                    d++;
            }
            if(d==1)
                {printf("%d: %lld\n",n,conpy);break;}
        }
    }
    return 0;
}

87231: 555555555555555555555555555555555555555555555555555555555555555555555888888888

这个用例真的不知道该怎么搞

发表于 2022-02-03 11:12:14 回复(0)
#include<stdio.h>
int two(long long m)
{
    int x=m%10;
    long long y=m/10;
    int i=0;
    while(y!=0)
    {
        if(y%10==x)
            y=y/10;
        else
        {
            x=y%10;
            y=y/10;
            i++;
        }
    }
    if(i==1)
        return 1;
    else
        return 0;
}
int main()
{
    long long n=0;
    int i=2;
    long long m=0;
    while(scanf("%lld",&n)!=EOF)
    {
        if(n==0)
            break;
        else
        {
            do
            {
                m=n*i;
                if(two(m)==1)
                {
                    printf("%lld: %lld\n",n,m);
                    i=2;
                }
                else
                    i++;
            }while(i>2);
        }
    }
    return 0;
}

注意示例中给的提示,2019: 9999999993其中9999999993的大小已经超出了int型的范围,这里需要使用long long


发表于 2021-12-25 19:38:07 回复(0)
自测没问题,就是超时
#include<stdio.h>
int main()
{
    int m=10,count=0;
    long long i,tmp,answer,n;
    while(scanf("%lld",&n)!=0)
    {
        for(i=2;;i++)
        {
            tmp=n*i;
            answer=tmp;
            count=0;
            m=10;
            while(tmp)
            {
                if(tmp%10!=m)
                {
                    count++;
                    m=tmp%10;
                }
                tmp/=10;
            }
            if(count==2)
            {
             printf("%lld:%lld\n",n,answer);
             break;
            }
        }
    }
    return 0;
}
发表于 2021-09-25 16:47:56 回复(0)
#include<stdio.h>

long fun(long);

int main()
{
    long n,sum;
    while (scanf("%ld", &n) != EOF) 
    {
        sum = fun(n);
        if(sum == -1)
        {
            continue;
        }
        printf("%ld: %ld\n",n,sum);
    }
    return 0;
}

long fun(long n)
{
    long index,sum;
    int count = 0;
    int flag1,flag2,i;
    if(n == 0)
    {
        return -1;
    }
    else
    {
        index = n * 2;
        i = 2;
        while(1)
        {
            sum = index;
            flag1 = index % 10;
            while(index)
            {
                flag2 = index % 10;
                if(flag2 != flag1)
                {
                    count++;
                    flag1 = flag2;
                }
                index /= 10;
            }
            if(count == 1 && sum > 9)
            {
                return sum;
            }
            else
            {
                count = 0;
                i++;
                index = n * i;
            }
        }
    }
}
大数据超时

发表于 2021-09-07 10:28:18 回复(0)

问题信息

上传者:牛客309119号
难度:
14条回答 5872浏览

热门推荐

通过挑战的用户

查看代码
小乐乐与二段数