POJ 1350 Cabric Number Problem(水~)

470 篇文章 3 订阅

Description
输入一个数(各个数位不全相同,且数字的长度为4),将它的各位从大到小排得的数maxnum和各位从小到大排的数minnum相减,反复循环直至值为0或者6147。且如果开头有0那么0不参与排序
Input
多组输入,每组一个数,以-1结束输入
Output
对于每组用例,若满足题目所给条件则按样例输出,否则输出No!!
Solution
注意:若不是四位数,直接输出No!!
Code

#include <iostream>  
#include <string>  
using namespace std;  
bool same(string s)//判断s是否由同一元素组成 
{  
    bool f=true;  
    for (int i=1;i<s.length();i++)  
        if(s[i]!=s[0]) 
            f=false;  
    return f;      
}  
int trans(string s)//将s转化为整型 
{  
    int t=0;  
    for(int i=0;i<s.length();i++)  
        t=t*10+s[i]-'0';  
    return t;  
}  
string sort1(string s)//将s降序排得到s对应四位数最大值 
{  
    for(int i=0;i<s.length()-1;i++)  
        for(int j=i+1;j<s.length();j++)  
            if(s[i]<s[j]) 
                swap(s[i],s[j]);  
    return s;          
}  
string sort2(string s)//将s升序排得到s对应四位数最小值  
{  
    for(int i=0;i<s.length()-1;i++)  
        for(int j=i+1;j<s.length();j++)  
            if(s[i]>s[j]) 
                swap(s[i],s[j]);  
    return s;          
}      
string tostring(int t)//将t转化为string型 
{  
    string s="",s1="";  
    if(t==0) 
        return "0";  
    while(t) 
    {  
        int r=t%10;  
        s+=(char)(r+48);  
        t/=10;  
    }  
    for(int i=s.length()-1;i>=0;i--)  
        s1+=s[i];  
    return s1;  
}  
int main() 
{  
    string s;  
    while (cin>>s&&s!="-1") 
    {  
        cout<<"N="<<s<<":"<<endl;//按格式输出 
        if(same(s)||s.length()!=4)//不是四位数直接输出No!! 
            cout<<"No!!"<<endl;  
        else 
        {  
            int t=0;  
            while(1)//循环操作 
            {  
                if(s=="0"|| s=="6174")//满足条件,退出循环 
                    break;  
                t++;//操作数加一 
                int a=trans(sort1(s));//得到maxnum  
                int b=trans(sort2(s));//得到minnum  
                cout<<a<<"-"<<b<<"="<<a-b<<endl;//按格式输出  
                s=tostring(a-b);//更新值  
            }  
            cout<<"Ok!! "<<t<<" times"<<endl;//按格式输出  
        }  
    }   
    return 0;  
}                 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值