自测-4 Have Fun with Numbers

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 kk 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 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:

Yes
2469135798

说明:最开始使用的思路是大数计算的方式,存入字符串数组,然后运算后与原数组进行对比,但存在wa点,现在没找到。先放置于此:
#include <stdio.h>
#include<string.h>
int main()
{
    // N为长度,M为进位
    int N = 0,M = 0, i = 0, num = 0,loop = 0, j = 0;
    char str[100];
    char tmp[100];
    scanf("%s",str);
    N = strlen(str);

    for(i = N - 1; i >= 0; i--){
        num = (str[i] - '0')*2 + M;
        M = 0;
        if(num > 9){
            num = num % 10;
            M++;
        }
        tmp[i] = num + '0';
    }
    for(i = 0; i < N; i++){
        for(j = 0; j < N; j++){
            if(tmp[i] == str[j]){
                str[j] = 'a';
                break;
            }
        }
    }
    for(i = 0; i < N; i++){
        if(str[i] != 'a'){
            loop = 1;
            break;
        }
    }
    if(M == 1){
        printf("No\n1");
        for(i = 0; i < N; i++){
            printf("%d",tmp[i] - '0');
        }
        return 0;
    }
    if(loop == 1){
        for(i = 0; i < N; i++){
            printf("%d",tmp[i] - '0');
        }
    }else{
        printf("Yes\n");
        for(i = 0; i < N; i++){
            printf("%d",tmp[i] - '0');
        }
    }
    return 0;
}

后改变思路,只记录0~9十个数组出现的次数,仅需要两个长度为10的一维数组即可。使用别人写的C++代码,引用链接在最后

 1 #include <cstdio>  
 2 #include <string>  
 3 #include <iostream>  
 4 using namespace std;  
 5 int cnt1[10] = { 0 }, cnt2[10] = {0};  
 6   
 7 int main(){  
 8     string s;  
 9     cin >> s;  
10     string s2 = s;  
11     for (int i = 0; i < s.size(); i++){  
12         cnt1[s[i] - '0']++;  
13     }  
14     int carry = 0;  
15     for (int i = s.size() - 1; i >= 0; i--){  
16         s2[i] = ((s[i] - '0') * 2 + carry )% 10 + '0';  
17         carry = ((s[i] - '0') * 2 + carry) / 10;  
18     }  
19     if (carry){  
20         char c = carry + '0';  
21         s2 = c + s2;  
22         cout << "No\n" << s2 << endl;  
23         return 0;  
24     }  
25     for (int i = 0; i < s2.size(); i++){  
26         cnt2[s2[i] - '0']++;  
27     }  
28     bool flag = true;  
29     for (int i = 0; i < 10; i++){  
30         if (cnt1[i] != cnt2[i]){  
31             flag = false;  
32             break;  
33         }  
34     }  
35     if (flag) cout << "Yes" << "\n" << s2 << endl;  
36     else cout << "No\n" << s2;  
37     return 0;  
38 }  

http://blog.csdn.net/xtzmm1215/article/details/38837203

posted @ 2017-07-10 19:36  白常福  阅读(603)  评论(0编辑  收藏  举报