题意:有一种很奇怪的计数法,它的数里面没有4,现在用这种计数法给定一个数字n,把它换算成通用的十进制。
思路:一开始自己按照模拟的思路(计算比n小的所有正整数中含有4的数字的个数res,然后输出n-res即可)写的,调了比较长的时间。后来看到正确的思路是采用9进制。把各个位上的大于4的数都减一, 例如:15变成14,67变成56.然后把这个数字当成是9进制。
模拟的思路:
#include <stdio.h> #include <string.h> int s[11]; int n; void init(){ int i,a,b; a = b = 1; for(i = 0;i<=8;i++){ s[i] = a-b; a*=10; b*=9; } } int main(){ freopen("a.txt","r",stdin); init(); while(scanf("%d",&n) && n){ int i,j,m,res=0; int a,b=0,k = 1; m = n; for(i = 0;n;i++){ a = n%10; if(a>=4){ res += k; a--; } res += a*s[i]; k *= 10; n /= 10; } printf("%d: %d\n",m,m-res); } return 0; }
#include <stdio.h> int ch[10]; int main(){ int x,i,sum,k,tmp; for (i=0;i<=3;i++) ch[i]=i; for (i=4;i<=9;i++) ch[i]=i-1; while (scanf("%d",&x),x>0){ tmp=x; for ( k=1, sum=0 ; x>0 ; k*=9 , x/=10 ) sum+=(ch[x%10])*k; printf("%d: %d\n",tmp,sum); } }