首页 > 试题广场 >

小乐乐与二段数

[编程题]小乐乐与二段数
  • 热度指数: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
原来不只我一个人超时,那我就放心了。。题解真让人头秃
发表于 2021-02-19 15:46:59 回复(0)
家人们,我发现我语文白学了

发表于 2021-10-17 16:45:43 回复(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)
//自测是可以的,但是这环境跑不出来,可能超时了。。。
import java.io.*;
import java.lang.*;
import java.util.*;
public class Main{
    public static void main(String [] args)throws IOException{
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        String str=null;
        while((str=br.readLine())!=null){
            int n=Integer.parseInt(str);
            if(n>=1&&n<=99999){
                long result=0;
                for(int i=1;i<=2000000;i++){
                    result =(long)i*n;
                    if(bnum(result)){
                        System.out.println(n+": "+result);
                        break;
                    }
                }
            }else{
                break;
            }
        }
    }
    public static boolean bnum(long num){
        String s=""+num;
        char [] c=s.toCharArray();
        int isNum=0;
        for(int i=1;i<c.length;i++){
            if(c[i]!=c[i-1]){
                isNum++;
            }
        }
        if(isNum==1){
            return true;
        }else{
            return false;
        }
    }
}


发表于 2020-07-07 09:26:02 回复(2)
#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 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)
排行榜上一群面向结果编程的大佬
发表于 2025-05-26 11:42:35 回复(0)
//一来想的是从首位而不是末位开始判断,让代码变复杂了算得也很慢完全超时,但至少是对的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)
进行二段数判断时可以用队列,但是依然无法解决问题
bool Judge(long long num)
{
    string tmp;
    tmp = to_string(num);
    queue<char> q;
    q.push(tmp.at(0));
    char pre = tmp.at(0);
    for (int i = 1; i < tmp.length(); i++)
    {
        char cur = tmp.at(i);
        q.push(cur);
        if (cur == pre)
        {
            q.pop();
        }
        pre = cur;
    }
    return q.size() == 2 ? true : false;
}


发表于 2023-01-20 13:51:40 回复(0)
终于做出来了,就是思路混乱的乱七八糟
#include<stdio.h>
int main()
{
    int n = 0;  
    int i = 0;
    int j = 0; 
    int m = 0;
    int temp = 0; 
    int sum = 0;
    int a[10] = { 0 };
    int b[1000] = { 0 };
    while(scanf("%d", &n)!=EOF)
    {
        if (n == 0) break;
        else
        {
            for (i = n + 1;; i++)
            {
                if (i % n == 0)
                {
                    int temp1 = i;
                    while (temp1)
                    {
                        temp = temp1 % 10;
                        a[temp]++;
                        temp1 = temp1 / 10;
                    }
                    for (j = 0; j < 10; j++)
                    {
                        if (a[j])
                        {
                            sum++;
                           
                         }

                    }
                    
                    if (sum ==2)
                    {
                        int temp2 = i;
                        while (temp2)
                        {
                            b[m++] = temp2 % 10;
                            temp2 = temp2 / 10;
                        }
                        
                        for (j = m - 1; j >= 0; j--)
                            printf("%d", b[j]);

                        sum = 0;
                        m = 0;
                        for (j = 0; j < 10; j++)
                            a[j] = 0;
                        for (j = 0; j < m; j++)
                            b[j] = 0;

                        break;
                    }
                    sum = 0;
                    for (j = 0; j < 10; j++)
                        a[j] = 0;
                }
            }
        }
    }
    return 0;
}
发表于 2022-05-23 13:56:41 回复(0)
我发现我语文白学了
发表于 2022-04-30 15:36:54 回复(0)
题目有问题,基本上我想不出不遍历的解法,但一遍历就超时,这个解法自测是可用的,当然放上去就是超时
while True:
    try:
        list=int(input())
        if list!=0:
            for n in range(2,10000):
                test=n*list
                str_test=str(test)
                s=str_test[0:1]
                t=str_test[-1:]
                if s==t&nbs***bsp;s==0:
                    continue
                set_test=set()
                for letter in str_test:
                    set_test.add(letter)
                if len(set_test)==2:
                    list_test=[]
                    flag=True
                    st=s+t
                    cnt=str_test.count(st)
                    if cnt>1:
                        flag=False
                    if flag==True:
                        print("{}:{}".format(list,test))
                        break
        else:
            break
    except:
        break

发表于 2022-03-12 14:36:52 回复(0)
应该用一个数组来存放结果,不然结果就过大,显示不出来
发表于 2022-03-09 11:09:33 回复(0)
假定输入的数字为2019:
1%2019=1;
11%2019=11;
111%2019=111;
1111%2019=1111;
——————————
现在看好了!
令a =11111%2019=(1111\*10+1)%2019=(1111%2019\*10+1)%2019
则:
b=111111%2019=(11111%2019*10+1)%2019=(a*10+1)%2019
c=1111111%2019=(111111%2019*10+1)%2019=(b*10+1)%2019
。。。。。。
b简化后的式子,充分利用了a计算的结果,需要明白a小于输入的数字2019,这样就将一个6位数的除法降位为5位数的除法,秒啊!!!!!
后续的欢迎大家来我的CSDN,指正批评啊!https://blog.csdn.net/weixin_42269028/article/details/120229499
发表于 2022-02-25 18:14:10 回复(0)
超时了。。。
while True:
    n=int(input())
    if(n==0):
        break
    flag=0
    if n<=50:
        for i in range(2,100):
            num=n*i
            if num>=10:
                print("%d: %d"%(n,num))
                break
    else:
        for w in range(len(str(n*2)),100):
            if flag:
                break
            for i in range(1,10):
                if flag:
                    break
                for j in range(0,10):
                    if flag:
                        break
                    if i!=j:
                        for ws in range(1,w):
                            s=[]
                            for aw in range(0,ws):
                                s.append(i)
                            for bw in range(0,w-ws):
                                s.append(j)
                            num=int("".join(map(str,s)))
                            if (num%n==0)&(num>n):
                                print("%d: %d"%(n,num))
                                flag=1
                                break

发表于 2022-02-21 09:12:24 回复(0)
超时了。。。
#include <iostream>
using namespace std;
bool isTwiceNum(long long num){
    int more = 0, less = 0;
    while(num >= 10){
        if(num%10 > num/10%10)
            less++;
        if(num%10 < num/10%10)
            more++;
        num/=10;
    }
    if(less==1 && more==0 || less==0 && more==1)
        return true;
    return false;
}
int main(){
    ios::sync_with_stdio(0);//而这段语句可以来打消iostream的输入 输出缓存,可以节省许多时间
    long long n;
    while(cin>>n){
        if(n==0)
            break;
        long long num = n;
        for(long long i = 2; !isTwiceNum(num) || num == n; i++){
            num = n * i;
        }
        cout<<n<<": "<<num<<endl;
    }
    return 0;
}


发表于 2022-02-20 15:59:33 回复(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)

问题信息

上传者:牛客309119号
难度:
57条回答 5871浏览

热门推荐

通过挑战的用户

查看代码
小乐乐与二段数