从1开始,逢4不要,5000之后是多少吗?

csu27 2005-02-26 05:30:47
求程序:从1开始,逢4不要,5000之后是多少吗?怎么求。
...全文
802 45 打赏 收藏 转发到动态 举报
写回复
用AI写文章
45 条回复
切换为时间正序
请发表友善的回复…
发表回复
xialin168 2005-03-13
  • 打赏
  • 举报
回复
pcboyxhy(-273.15℃) 绝好的算法!
不过我还没搞懂!
能否详细解说一下!
xialin168 2005-03-13
  • 打赏
  • 举报
回复
up
ltc_mouse 2005-03-13
  • 打赏
  • 举报
回复
pcboyxhy(-273.15℃) 的排列组合知识用的太神了!
好算法!
僵哥 2005-03-13
  • 打赏
  • 举报
回复
上面发的有误,同时使用了CBuilder特有的类型AnsiString现更正:
------------------------------------------------------------
//在一个数元单位10^x当中不为某数字f的自然数是9^x个
unsigned __int64 Maxx( __int64 mm,int f)
//求第mm个不为f的数
{

int Max;
int Num;
char Buffer[20];
memset(Buffer,0,20);
itoa(mm,Buffer,10);
int iLen=strlen(Buffer);
Max=pow(9,iLen-1);
if(iLen==1)
{
if(!f)return mm; //数是从1开始,一位数里面零的个数为0
return mm+(mm>=f?1:0); //个位不小于所求数字则+1返回
}
if(mm/Max>f) //大于f则需往上追加M(iLen)*pow(10,iLen-1)个
{
if(mm/Max/9<1) //是否Max为最接近的9的乘方
{
Num=mm/Max;
if(Num>=f&&f>0)Num++; //不小于f往上加10^(iLen-1)位,且f不为零
return (Num)*pow(10,iLen-1)+Maxx(mm%Max,f);
}
Max=pow(9,iLen); //调整至最接近9的乘方
if(Max>mm) //该乘方数大于mm,则
//F(M,f)=10^iLen-F(9^iLen-M,f)
return pow(10,iLen)-Maxx(Max-mm,f);
Num=mm/Max;
if(Num>=f&&f>0)Num++; //不小于f往上加10^iLen位,且f不为零
//F(M,f)=M(x)*F(9^iLen,f)+F(M%9^iLen,f);
return (Num)*pow(10,iLen)+Maxx(mm%Max,f);
}
Num=mm/Max;
if(Num==f&&f>0)Num++;////不小于f往上加10^iLen位,且f不为零
return (Num)*pow(10,iLen-1)+Maxx(mm%Max,f);
}
僵哥 2005-03-13
  • 打赏
  • 举报
回复
ShowMessage(Maxx(5000,4));
僵哥 2005-03-13
  • 打赏
  • 举报
回复
//在一个数元单位10^x当中不为某数字f的自然数是9^x个
unsigned __int64 Maxx( __int64 mm,int f)
//求第mm个不为f的数
{

int Max;
int Num;
AnsiString s=IntToStr(mm);
int iLen=s.Length();
Max=pow(9,iLen-1);
if(iLen==1)
{
if(!f)return mm; //数是从1开始,一位数里面零的个数为0
return mm+(mm>=f?1:0); //个位不小于所求数字则+1返回
}
if(mm/Max>f) //大于f则需往上追加M(iLen)*pow(10,iLen-1)个
{
if(mm/Max/9<1) //是否Max为最接近的9的乘方
{
Num=mm/Max;
if(Num>=f&&f>0)Num++; //不小于f往上加10^(iLen-1)位,且f不为零
return (Num)*pow(10,iLen-1)+Maxx(mm%Max,f);
}
Max=pow(9,iLen); //调整至最接近9的乘方
if(Max>mm) //该乘方数大于mm,则
//F(M,f)=10^iLen-F(9^iLen-M,f)
return pow(10,iLen)-Maxx(Max-mm,f);
Num=mm/Max;
if(Num>=f&&f>0)Num++; //不小于f往上加10^iLen位,且f不为零
//F(M,f)=M(x)*F(9^iLen,f)+F(M%9^iLen,f);
return (Num)*pow(10,iLen)+Maxx(mm%Max,f);
}
Num=mm/Max;
if(Num=f&&f>0)Num++;////不小于f往上加10^iLen位,且f不为零
return (Num)*pow(10,iLen-1)+Maxx(mm%Max,f);
}
僵哥 2005-03-13
  • 打赏
  • 举报
回复
mark
reg9 2005-03-13
  • 打赏
  • 举报
回复

#include <iostream>
using namespace std;


int _tmain()
{
// TODO: Please replace the sample code below with your own.

int n=10000;
int f[100];
while (cin>>n,n)
{

int f4=1;
int f10=1;
int i=0;

f[0]=0;
int sum=0;
while (f[i]<n)
{
i++;
f10*=10;
f[i] = f10-1-f4;
f4 = f4*9+f10;
}
i--;
f[0] = 0;
int r=n;
while (i>=0)
{
int num = r/(f[i]+1);
r -= num*(f[i]+1);
i--;
if (num>=4) num++;
cout<<num;
}
cout<<endl;


}

return 0;
}
zzxenjoy 2005-03-11
  • 打赏
  • 举报
回复
晕倒 太简单了吧
Kelvin_Chen 2005-03-10
  • 打赏
  • 举报
回复
stonesstar 2005-03-05
  • 打赏
  • 举报
回复
sorry,看错了
stonesstar 2005-03-05
  • 打赏
  • 举报
回复
Henry0(西山下的狼|(sytu)) 的算法我算出来是1446,不知和7876那个正确
stonesstar 2005-03-05
  • 打赏
  • 举报
回复
HEROWANG(让你望见影子的墙)所说的情况不可能出现,int型不都32位吗,绝对不会益处
languagec 2005-03-04
  • 打赏
  • 举报
回复
楼主恐怕是来问效率的吧,如果用穷举记数的话,上面的都是了 .

很明显这个题目是有规律可寻的,如果是第500000个数,那是多少呢? 第50000000个数又是多少呢?

mzkbin 2005-02-27
  • 打赏
  • 举报
回复
Herry绝对是最直接的解,当然有更好的算法.我用我的VC得出的结果是7876,所以不存在上溢的问题,用int足够。
lovexin 2005-02-27
  • 打赏
  • 举报
回复
QQ群:新开的.希望大家可以在此群中交流.

`````````````````````````````````````
WEB.c/c++群号:7729848
lovexin 2005-02-27
  • 打赏
  • 举报
回复
QQ群:新开的.希望大家可以在此群中交流.

`````````````````````````````````````
WEB.c/c++群号:7729848
JackyRao 2005-02-27
  • 打赏
  • 举报
回复
#include "iostream"
#include "string"
using namespace std;

int main()
{

bool IsHave4(long lNum);
int nCount = 0;
int nNum =0;
do {
nNum++;
if (!IsHave4(nNum))
nCount++;



} while(nCount<=5000);
cout<<nNum<<endl;

system("pause");
return 0;
}

bool IsHave4(long lNum)
{
char cstr[1000];
ltoa(lNum, cstr, 10);
if (strrchr(cstr, '4')!=0)
{
return true;
}

return false;
}
Leo 2005-02-27
  • 打赏
  • 举报
回复
lxhbysn(白衣少年)的方法独辟蹊径,好!!!是块编程的料
lxhbysn 2005-02-27
  • 打赏
  • 举报
回复
没那么复杂吧,
int i=1;
int num=0;
while(i<=5000)
{
num++;
if((num.ToString()).IndexOf('4')==-1)
i++;
}
这是我用C#写的,输出num的值就行了,结果为7876,运行时间为100毫妙,方法就是查找字符4就行了,c中可以转换为字符数组然后查找是否有4这个字符。
这是我的第一个回复,呵呵,我是新手,请多多关照
加载更多回复(25)

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧