描述
给定两个数L和R,求L到R之间(包括L和R)有多少个数是“优雅”的。
称一个数是优雅的,当且仅当把这个数看成一个长度为n的字符串(没有前导零),n个字符中 n-1 个字符全相同,有且仅有一个字符不同。
例如,33323、110都是优雅的,而9779、55555都不是优雅的。
输入描述
一行两个数L和R。
输出描述
一行一个数,表示L到R之间有多少个数是优雅的。
用例输入 1
110 133
用例输出 1
13、
样例解释:13个数是110、112、113、114、115、116、117、118、119、121、122、131、133.
数据范围:
对于50%数据: 100≤L≤R≤106
对于100%数据: 100≤L≤R≤1016
我的代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
char a[100],b[100];
cin>>a>>b;
int d=0,e=1,count=0;
int c=strlen(a);
int y=strlen(b);
for(int i=0;i<c;i++)
{
for(int j=c-i-1;j>=1;j--)
{
e=10*e;
}
d=d+(int(a[i])-48)*e;
e=1;
}
int n=1,l=0,i=0,j;
for(i=0;i<y;i++)
{
for(j=y-i-1;j>=1;j--)
{
n=10*n;
}
l=l+(int(b[i])-48)*n;//b为l
n=1;
}
if(d>=l)
{
for(int f=l;f<=d;f++)
{
int nb,abc,zh=0,qi=0,ling=1233,abcde=0;
nb=f;
abc=nb%10;
nb/=10;
while(nb>0)
{
if(nb%10!=abc)
{
ling=nb%10;
break;
}
nb/=10;
}
int wc=f;
while(wc>0)
{
if(wc%10!=ling and wc%10!=abc)
{
abcde=1;
}
if(wc%10==abc)
{
zh++;
}
if(wc%10==ling)
{
qi++;
}
wc/=10;
}
if(abcde==1)
{
continue;
}
if(zh==1 or qi==1)
{
count=count+1;
}
}
cout<<count;
}
if(d<l)
{
for(int f=d;f<=l;f++)
{
int nb,abc,zh=0,qi=0,ling=1233,abcde=0;
nb=f;
abc=nb%10;
nb/=10;
while(nb>0)
{
if(nb%10!=abc)
{
ling=nb%10;
break;
}
nb/=10;
}
int wc=f;
while(wc>0)
{
if(wc%10!=ling and wc%10!=abc)
{
abcde=1;
}
if(wc%10==abc)
{
zh++;
}
if(wc%10==ling)
{
qi++;
}
wc/=10;
}
if(abcde==1)
{
continue;
}
if(zh==1 or qi==1)
{
count=count+1;
}
}
cout<<count;
}
}
10个测试点,对了6个
#include <stdio.h>
#include <string.h>
int main()
{
int l, r, i, j, k, len, count = 0;
scanf("%d %d", &l, &r);
for (i = l; i <= r; i++)
{
int a[20] = {0};
int num = i;
len = 0;
while (num > 0)
{
a[len++] = num % 10;
num /= 10;
}
// 判断是否优雅
int flag = 1;
for (j = 0; j < len - 1; j++)
{
if (a[j] != a[j + 1])
{
flag = 0;
break;
}
}
if (flag == 1)
{
count++;
}
}
printf("%d", count);
return 0;
}