1023. Have Fun with Numbers (20)

来源:互联网 发布:软件应届生求职怎么样 编辑:程序博客网 时间:2024/06/07 22:44

1023. Have Fun with Numbers (20)

时间限制
400 ms
内存限制
65536 kB
代码长度限制
16000 B
判题程序
Standard
作者
CHEN, Yue

Notice that the number 123456789 is a 9-digit number consisting exactly the numbers from 1 to 9, with no duplication. Double it we will obtain 246913578, which happens to be another 9-digit number consisting exactly the numbers from 1 to 9, only in a different permutation. Check to see the result if we double it again!

Now you are suppose to check if there are more numbers with this property. That is, double a given number with k digits, you are to tell if the resulting number consists of only a permutation of the digits in the original number.

Input Specification:

Each input file contains one test case. Each case contains one positive integer with no more than 20 digits.

Output Specification:

For each test case, first print in a line "Yes" if doubling the input number gives a number that consists of only a permutation of the digits in the original number, or "No" if not. Then in the next line, print the doubled number.

Sample Input:
1234567899
Sample Output:
Yes2469135798
-----------------------------------------------------------------------------

题目大意:输入一个数(20位以内),然后乘以2得到一个新的数 。 问新数和原数是否仅仅满足with no duplication关系(即仅仅只是数字排列不同,如1243和1234就满足这个关系)

刚看到题目时候,想法hin单纯。不就是俩数,用两个long long存好,然后用sprintf函数把整数转化成字符串,然后依次比较不就好了。

浇上去发现只过了前4个点,回头意识到long long的最大值是9223372036854775807(19位),不够存 。

于是新思路:

直接用字符串接收输入,然后根据乘法运算法则把新数逐位压入栈中。并用book[]记录原数和新数的字符个数,后一次进行比较,最后通过栈输出新数。


#include <iostream>#include <algorithm>#include <cstdio>#include <cstdlib>#include <cstring>#include <string>#include <vector>#include <queue>#include <stack>using namespace std;int book0[20]={0};//原数的bookint book[20]={0};//新数的bookint main(){    string s;    stack<int> sta;    int i;    int flag=0;//当做进1缓存区使用    cin>>s;    int len = s.length();    for(i=len-1;i>=0;i--)    {        char tc=s[i];        int t=tc-'0';        book0[t]++;    }    for(i=len-1;i>=0;i--)    {        char tc=s[i];        int t=tc-'0';        t=t*2+flag;//将缓存区的进数读出        if(t>=10)            flag=1;        else            flag=0;        sta.push(t%10);        book[t%10]++;    }    if(flag==1)    {        sta.push(1);        book[1]++;    }    for(i=0;i<=9;i++)    {        if(book0[i]!=book[i])            break;    }    if(i==10)        printf("Yes\n");    else        printf("No\n");    while(!sta.empty())    {        printf("%d",sta.top());        sta.pop();    }    return 0;}





原创粉丝点击