POJ1016 Numbers That Count 不难,但要注意细节

题意是将一串数字转换成另一种形式。比如5553141转换成2个1,1个3,1个4,3个5,即21131435。1000000000000转换成12011。数字的个数是可能超过9个的。n个m,m是从小到大排序。

输出的结果又四种情况,建议判断的时候就按照题目的顺序进行判断,否则可能出错。第一种情况是进行一次变换后和原来的数字相同;第二种是进行j次后和原来数字相同;第三种是变换过程中形成了循环,比如70:
      

70是2循环,又最后3组数字可判断出;第四种情况是超过15次变换仍然找不出规律。

#include <iostream>
#include <cstdio>
#include <cstring>
#define MAX 85
using namespace std;

char n[MAX];
int a[10];

int main()
{
    freopen("in.txt","r",stdin);
    while(1)
    {
        char str[16][MAX]= {0}; //先全部变换,将原始数字和变换后的都保存下来
        memset(n,0,sizeof(n)); //初始化
        scanf("%s",n);
        if(n[0]==‘-‘)
            break;
        strcpy(str[0],n);
        for(int i=0; i<15; i++) //15次变换
        {
            memset(a,0,sizeof(a)); //初始化
            for(int j=0; j<10; j++) //查找0~9每个数字,并保存至数字a[j]
                for(int k=0; k<strlen(str[i]); k++)
                {
                    if(str[i][k]==j+‘0‘)
                        a[j]++;
                }
            for(int j=0,k=0; j<10; j++)
                if(a[j]>=10) //这里的细节需要注意一下,个数大于或等于10,需要保存三位数
                {
                    str[i+1][k]=a[j]/10+‘0‘;
                    str[i+1][k+1]=a[j]%10+‘0‘;
                    str[i+1][k+2]=j+‘0‘;
                    k+=3;
                }
                else if(a[j]>0 && a[j]<10)
                {
                    str[i+1][k]=a[j]+‘0‘;
                    str[i+1][k+1]=j+‘0‘;
                    k+=2;
                }
        }
        bool flag=true;
        if(strcmp(str[0],str[1])==0)
        {
            printf("%s is self-inventorying\n",str[0]);
            flag=false;
        }
        if(flag)
            for(int i=1; i<=15; i++)
                if(strcmp(str[i],str[i+1])==0)
                {
                    printf("%s is self-inventorying after %d steps\n",str[0],i);
                    flag=false;
                    break;
                }
        if(flag)
            for(int i=13; i>=0; i--)
                if(strcmp(str[15],str[i])==0)
                {
                    printf("%s enters an inventory loop of length %d\n",str[0],15-i);
                    flag=false;
                    break;
                }
        if(flag)
            printf("%s can not be classified after 15 iterations\n",str[0]);
    }
    return 0;
}
时间: 2024-07-31 22:21:28

POJ1016 Numbers That Count 不难,但要注意细节的相关文章

POJ 1016 Numbers That Count 模拟题目

Description "Kronecker's Knumbers" is a little company that manufactures plastic digits for use in signs (theater marquees, gas station price displays, and so on). The owner and sole employee, Klyde Kronecker, keeps track of how many digits of e

B - Numbers That Count

Description "Kronecker's Knumbers" is a little company that manufactures plastic digits for use in signs (theater marquees, gas station price displays, and so on). The owner and sole employee, Klyde Kronecker, keeps track of how many digits of e

oj--poj1016:Numbers That Count

分解还有问题,未完待续. #include<cstdio> #include<string> #include<cstring> int digitnum[10]; char strnum[35]; string s; int fenjie(int n){ sprintf(strnum,"%d",n); for(int i=0;i<strlen(strnum);i++){ digitnum[strnum[i]-'0']++; } int j=0

H - Ones

Description Given any integer 0 <= n <= 10000 not divisible by 2 or 5, some multiple of n is a number which in decimal notation is a sequence of 1's. How many digits are in the smallest such a multiple of n? Input Each line contains a number n. Outp

cJSON序列化工具解读一(结构剖析)

cJSON简介 JSON基本信息 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式.易于人阅读和编写.同时易于机器解析和生成.是一种很好地数据交换语言. 官方信息解读简介 JSON构建:基于两种结构 “名称/值”对 的集合. 值得有序列表. JSON具体结构表示 对象:一个”名称/值"对的集合  {名称:值,名称:值} 数组:值得有序集合[值,值] 值:str,num,true,false,null,object,array.可嵌套 字符串:由双引号包围

剑指offer(26-30)编程题

二叉搜索树与双向链表 字符串的排列 数组中出现次数超过一半的数字 最小的K个数 连续子数组的最大和 26.输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向 class Solution { public: //0:left 1: right TreeNode* doConvert(TreeNode* pRootOfTree, int leftOrRight) { if (pRootOfTree == nullptr) return

数据库的增删改查

elect * from Fruit添加insert into Fruit values('K008','柿子',3.0,'山西',90,'')insert into Fruit values('K009','火龙果',5.0,'福建',110,'')insert into Fruit(Ids,Name,Price,Source,Numbers) values('K010','苹果',3.0,'高青',90) 查询select distinct Numbers from Fruit       

java中的null注意事件总结

对于Java程序员来说,null是令人头痛的东西.时常会受到空指针异常(NPE)的骚扰.连Java的发明者都承认这是他的一项巨大失误.Java为什么要保留null呢?null出现有一段时间了,并且我认为Java发明者知道null与它解决的问题相比带来了更多的麻烦,但是null仍然陪伴着Java. 我越发感到惊奇,因为java的设计原理是为了简化事情,那就是为什么没有浪费时间在指针.操作符重载.多继承实现的原因,null却与此正好相反.好吧,我真的不知道这个问题的答案,我知道的是不管null被Ja

自己写的计算器(加减乘除)代码

首先是Calculator计算器类 package test; public class Calculator { public int addition(int number1, int number2) { return number1+number2; } public int subtraction(int number1, int number2) { return number1-number2; } public int multiplication(int number1, in