c++幸运数字问题,求助

chenxiangling 2013-07-15 10:41:08
我们认为只包含4和7的数字为幸运字,比如4,7,44,47,74,……。
现在对于给定的N,请你求出第N个幸运数字。
...全文
2730 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
cxiaoln 2013-07-22
  • 打赏
  • 举报
回复
#include <cstdio>
#include <iostream>

inline bool IsOne(int &side, unsigned int &number)
{
    return ((1 << side) & number) > 0;       
}

void Funs(unsigned int n)
{
    if (n <= 0)
    {
        printf("error\n");      
        return ;
    }     
    ++n;
    char chrResult[33];
    int iSide, iCount;
    iSide = 31;
    iCount = 0;
    while (iSide >= 0 && !IsOne(iSide, n)) --iSide;--iSide;
    while (iSide >= 0)
    {
        if(IsOne(iSide, n))
        {
            chrResult[iCount++] = '7';                
        }      
        else
        {
            chrResult[iCount++] = '4';    
        }
        --iSide;
    }
    chrResult[iCount] = 0;
    printf("%s\n", chrResult);
    return;
}

int main()
{
    unsigned int n;
    while (scanf("%u", &n) != EOF)
    {
        Funs(n);      
    }    
    
    return 0;
}
艾薇儿More 2013-07-20
  • 打赏
  • 举报
回复
感觉像排列组合问题。。。。
阿麦 2013-07-18
  • 打赏
  • 举报
回复
引用 14 楼 nice_cxf 的回复:
哦,看明白是怎样去掉的了,1是先pop,2是用递归,当=1时直接return
二进制的方法实现起来还是很方便的。 下面这段代码可以返回具体数值

#include <iostream>
using namespace std;

int Lucky(int M)
{
	return M > 1 ? Lucky(M >> 1) * 10 + 4 + (M & 1) * 3 : 0;
}

int LuckyNumber(int N)
{
	return N > 0 ? Lucky(N + 1) : 0;
}

int main()
{
	for (int N = 0; N < 20; ++N)
	{
		printf_s("N=%d, V=%d\n", N, LuckyNumber(N));
	}

	system("pause");
	return 0;
}
nice_cxf 2013-07-18
  • 打赏
  • 举报
回复
哦,看明白是怎样去掉的了,1是先pop,2是用递归,当=1时直接return
nice_cxf 2013-07-18
  • 打赏
  • 举报
回复
引用 11 楼 amoyman 的回复:
有人说我的办法好,也有的说不好。 不想多说什么,上代码:

#include <iostream>
#include <stack>
using namespace std;


static const int N = 7;

int main()
{
	stack<int> Result;
	int V[2] = {4, 7};
	int M = N + 1;
	while (M > 0)
	{
		Result.push(V[M & 1]);
		M >>= 1;
	}
	Result.pop();
	while (!Result.empty())
	{
		cout << Result.top() << " ";
		Result.pop();
	}
	cout << endl;

	system("pause");
	return 0;
}
没说你的做法不好,只是说你要去掉首位的1,用计算机处理稍微麻烦点,不如先算出长度然后按二进制输出简洁,从你代码里面也没看到是怎样去掉首位的1
阿麦 2013-07-18
  • 打赏
  • 举报
回复
或许这样会更好看

#include <iostream>
using namespace std;

void Lucky(int M)
{
	if (M > 1)
	{
		Lucky(M >> 1);
		printf_s("%d", (M & 1) == 0 ? 4 : 7);
	}
}

void LuckyNumber(int N)
{
	printf_s("%3d:", N);
	if (N > 0)
	{
		Lucky(N + 1);
		printf_s("\n");
	}
	else
	{
		printf_s("Invalid\n");
	}
}

int main()
{
	for (int N = 0; N < 20; ++N)
	{
		LuckyNumber(N);
	}
	system("pause");
	return 0;
}
阿麦 2013-07-17
  • 打赏
  • 举报
回复
有人说我的办法好,也有的说不好。 不想多说什么,上代码:

#include <iostream>
#include <stack>
using namespace std;


static const int N = 7;

int main()
{
	stack<int> Result;
	int V[2] = {4, 7};
	int M = N + 1;
	while (M > 0)
	{
		Result.push(V[M & 1]);
		M >>= 1;
	}
	Result.pop();
	while (!Result.empty())
	{
		cout << Result.top() << " ";
		Result.pop();
	}
	cout << endl;

	system("pause");
	return 0;
}
nice_cxf 2013-07-16
  • 打赏
  • 举报
回复
引用 2 楼 amoyman 的回复:
记M=N+1,把数M转换为二进制,0对应4,1对应7,去掉第一位 简单吗? 比如,N=7,M=8 转换为二进制 1000 ,去掉第一位,为000 所以,这个数为 444
心算的话是个好办法,不过写程序的话,这样可能复杂度反而高,其实直接计算有多少位,然后在按照二进制输出每位应该是比较简单的做法
www_adintr_com 2013-07-16
  • 打赏
  • 举报
回复
引用 2 楼 amoyman 的回复:
记M=N+1,把数M转换为二进制,0对应4,1对应7,去掉第一位 简单吗? 比如,N=7,M=8 转换为二进制 1000 ,去掉第一位,为000 所以,这个数为 444
帅气, 我看出和二进制相似, 但没想到去加 1 后去掉最高位.
mofoyiyeshu 2013-07-16
  • 打赏
  • 举报
回复
#include <iostream> #include <stdlib.h> using namespace std; /*函数名: num*/ /*参数: int nbit: 位数*/ /*返回值: 这个位数之前(包含这个位数)的所有幸运数字.比如1,返回2.一位数一共含有两个幸运数字。*/ int num(int nbit) { int tbit=1;//从一位数开始 int tnum=1;//运算暂时总数 int lnum=0;//总数 int ibit=1;//暂时变量 for(tbit=1;tbit<nbit+1;tbit++) { for(ibit=1;ibit<tbit+1;ibit++) { tnum=tnum*2; } lnum=lnum+tnum; tnum=1; } return lnum; } /*函数名:luckynum*/ /*参数:int N*/ /*返回值:返回第N个luckynum的位数*/ int luckybit(int N) { int tbit=1; int lnum=0; for(tbit=1;;tbit++) { lnum=num(tbit); if(N<lnum || N==lnum) { break; } } return (tbit); } int main() { int luckynum=0; int N=0; int wbit=0; cin>>N; wbit=luckybit(N); //cout<<"位数是"<<wbit<<endl; if(wbit==1) { if(N==1) { luckynum=1; cout<<luckynum<<endl; return 0; } if(N==2) { luckynum=2; cout<<luckynum<<endl; return 0; } } int prebit=N-num(wbit-1)-1; //cout<<"weishu:"<<wbit<<endl; //cout<<"qianshu:"<<prebit<<endl; //cout<<wbit<<endl; //cout<<luckybit(wbit-1)<<endl; //cout<<N<<endl; //cout<<num(wbit-1)<<"差几个"<<prebit<<endl; char *anum=new char[wbit]; //char *linnum=new char[wbit]; char *bnum=new char[wbit]; memset(anum,'4',wbit); memset(bnum,'0',wbit); itoa(prebit,bnum,2); int x=0; //// //int u=0; //for(;u<wbit;u++) //{ // cout<<bnum[u]<<" hua"<<endl; //} //// if(bnum[wbit-1]!='1') { // cout<<" *"<<endl; for(x=0;x<wbit;x++) { bnum[wbit-x-1]=bnum[wbit-x-2]; // cout<<bnum[wbit-x-1]<<endl; } bnum[0]='0'; } //// //u=0; //for(;u<wbit;u++) //{ // cout<<bnum[u]<<"hua"<<endl; //} //// //cout<<"2::"<<bnum<<endl; //cout<<"初始数字符"<<anum<<endl; for(x=0;x<wbit;x++) { if(bnum[x]=='1') { anum[x]='7'; } } //cout<<"后数字符"<<anum<<endl; x=0; int *znum=new int[wbit]; for(;x<wbit;x++) { znum[x]=1; //cout<<"初始数数组"<<znum[x]<<" "; } //cout<<endl; x=0; int y=0; int tnum=1; for(;x<wbit-1;x++) { tnum=1; for(y=0;y<x+1;y++) { tnum=tnum*10; znum[wbit-x-2]=tnum; } } x=0; //cout<<endl; int *lunum=new int[wbit]; x=0; y=0; for(;x<wbit;x++) { lunum[x]=anum[x]-'0'; } for(;y<wbit;y++) { lunum[y]=lunum[y]*znum[y]; } x=0; for(;x<wbit;x++) { luckynum=luckynum+lunum[x]; } cout<<luckynum<<endl; return 0; }
不会再变le 2013-07-16
  • 打赏
  • 举报
回复
引用 3 楼 a419635259 的回复:
呵呵,楼主请尝试二进制,将0变为4,1变为7看看
忘了补充下,往后写的时候,0,00,000...也都得算上
不会再变le 2013-07-16
  • 打赏
  • 举报
回复
呵呵,楼主请尝试二进制,将0变为4,1变为7看看
阿麦 2013-07-16
  • 打赏
  • 举报
回复
记M=N+1,把数M转换为二进制,0对应4,1对应7,去掉第一位 简单吗? 比如,N=7,M=8 转换为二进制 1000 ,去掉第一位,为000 所以,这个数为 444
nice_cxf 2013-07-16
  • 打赏
  • 举报
回复
长度1的有2个,长度2的有4个,长度3的有8个,看出规律了么?而在同样长度的数据中,前边一半是以4开头,后边一半是以7开头 对于给定n,先求出总长度,然后用递归依次求出首数字,
nice_cxf 2013-07-16
  • 打赏
  • 举报
回复
简单写了个:

int main(void)  
{  
	int pow32[32];
	pow32[0]=1;
	for (int i =1 ;i<32;i++)
	{
		pow32[i]=2*pow32[i-1];
	}

	while (1)
	{
		int n=0;
		printf("please input a number: ");  
		scanf("%d",&n);
		if (n<=0)
			break;
		n--; //start from 0
		int total_number =0;
		int remain =0;
		char szNumber[32]={0};
		for (int i =0 ;i< 32;i++)
		{
			if (pow32[i] >n+2)
			{
				total_number=i-1;
				remain = n-(pow32[total_number]-2);
				break;
			}
		}
		for (int i =0;i<total_number;i++)
		{
			if (remain & pow32[total_number -i-1])
				szNumber[i]='7';
			else
				szNumber[i]='4';

		}
		printf("output =%s\n",szNumber);

		
	} 
	return 0;
}
lsw603 2013-07-16
  • 打赏
  • 举报
回复
#include "stdafx.h" #include <iostream> using namespace std; int finddata(int m,int ibegin,int iend) { int it,icount,itemp; bool flag; icount=0; for(ibegin;ibegin<=iend;ibegin++) { itemp=ibegin; flag=true; while(itemp!=0) { it=itemp%10; itemp=itemp/10; if ((it!=4)&(it!=7)) { flag=false; break; } } if(flag==true) { icount++; if(m==icount) { return ibegin; } } else { if(ibegin==iend) { return finddata(m-icount,ibegin,iend*10); } } } } int _tmain(int argc, _TCHAR* argv[]) { int n; int ib,id; ib=1; id=10; cin>>n; cout<<"幸运数目是:"<<finddata(n,ib,id); getchar(); getchar(); return 0; }
hzs032 2013-07-16
  • 打赏
  • 举报
回复
关注,还有人做答不?

64,649

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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