程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> POJ1016 Numbers That Count 不難,但要注意細節,poj1016numbers

POJ1016 Numbers That Count 不難,但要注意細節,poj1016numbers

編輯:C++入門知識

POJ1016 Numbers That Count 不難,但要注意細節,poj1016numbers


題意是將一串數字轉換成另一種形式。比如5553141轉換成2個1,1個3,1個4,3個5,即21131435。1000000000000轉換成12011。數字的個數是可能超過9個的。n個m,m是從小到大排序。

輸出的結果又四種情況,建議判斷的時候就按照題目的順序進行判斷,否則可能出錯。第一種情況是進行一次變換後和原來的數字相同;第二種是進行j次後和原來數字相同;第三種是變換過程中形成了循環,比如70:
#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; }

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved