远古的Pascal人也使用阿拉伯数字来进行计数,但是他们又不喜欢使用7,因为他们认为7是一个不吉祥的数字,所以Pascal数字8其实表示的是自然数中的7,18表示的是自然数中的16。下面计算一下,在正整数n范围以内包含有多少个Pascal数字。
第一行为正整数t,接下来t行,每行一个正整数n(≤2^32-1)。
输入的是Pascal数字
输出格式:对于每个正整数n,输出n以内的Pascal数的个数。
输入样例#1:
2 10 20
输出样例#1:
9 18
作者: zhm411821 更新时间: 2016-03-14 20:26#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>usingnamespacestd; longlong ans=0,n,m,x,y,k;char s[100];intmain(){ cin>>k; for(int z=1;z<=k;z++){ cin>>s; m=strlen(s); for(int i=0;i<m;i++) if(s[i]=='7'){//从高位开始判断输入数据中是否含有7 s[i]--; for(int j=i+1;j<m;j++)//如果有,则把7变成6,把7之后的变为9 s[j]='9'; break; } n=s[0]-'0';//由于数据不大,所以可以存入long long中 for(int i=1;i<m;i++) n=n*10+s[i]-'0'; y=n; for(longlong i=6;i<=n;i++){//从6循环,找有没有7,找到了就给这个读入的数的Pascal数的数量-1,一直循环。 int p=i; while(p>0){ if(p%10==7){ y--; break; } p=p/10; }} cout<<y<<endl;//输出 } return0; }
作者: xvhuanlin 更新时间: 2015-03-15 19:07
把给定数字当做9进制,转换成10进制输出。
当给定数字中有大于7的数字,减一之后在转换。
要注意的是,如果给定数字中有7怎么办??
可以发现,xx...xx700...00到xx...xx799...99的数字都是无意义的,因为这段范围之内一定没有符合要求的数字。
所以在开始转换之前,从给定数字的高位开始,寻找第一个等于7的数字,将该位变为6,该位以后的数字全部变为9,然后按照之前的方法转换就可以了。
作者: 渣羊er 更新时间: 2016-10-01 12:18//这题看上去复杂,其实读懂了题目很容易 #include<cstdio>#include<cmath>usingnamespacestd;intmain(){ int g,n; scanf("%d",&g);//输入次数 for(int i=1;i<=g;i++) { scanf("%d",&n);//输入范围 int p=n;//范围内有多少数 for(int i=1;i<=n;i++)//考虑每个数是否满足条件 { for(int j=0;j<=15;j++)//不会超过15位 { int r=pow(10,j); if(i/r%10==7)//!关键!枚举每一位上的数,如果含7,此数不符合,总数减一(题中说含有7的数不符) {p--; break;} } } printf("%d\n",p);//输出有多少符合条件的数 } return0;}
作者: 刘昊是神 更新时间: 2016-04-25 12:27var j,n,i,a,o,b:longint; st:string;begin readln(n); for i:=1to n do//循环begin readln(st);//不能没有字符串。for j:=1to length(st)do//九进制转换。begin val(st[j],o);//模拟进制过程if o>7then dec(o);//由于无7和逢九进一的原因,所以>7要减一。 a:=a*9+o;//十进制累加end; writeln(a);a:=0; //输出,清零。end;end.
作者: guobaipeng0 更新时间: 2016-04-22 14:06//pascal做法var n,i,j,t,k:longint;begin readln(n); //输入for i:=1to n do//循环n次,输入要找的pascal数字begin readln(t); //输入pascal数字for j:=7to t do//找出十进制数begin k:=j; //要进行拆解,用k把十进制数存起来while k<>0do//开始进行拆解beginif k mod10=7thenbegin dec(t); break; end; //拆解最高位,如果是7,就减1,不用再循环了 k:=k div10; //因为找过最高位了,所以删除最高位,进行下一次循环end; end; writeln(t); //输出十进制数end;end.谢谢大家!
作者: PTC06 更新时间: 2016-04-21 14:03var n,i,j,k,k1,t:longint; s:string;begin readln(n); //输入for i:=1to n do//循环begin k1:=0; //每次的pascal数字数量不一,要清零 readln(t); for j:=7to t do//从7开始循环,7以下的就不用了,因为不可能不是pascal数字begin str(j,s); //转化为字符串for k:=1to length(s) doif s[k]='7'then//如果这个数中有一位是7就增加不是Pascal数字的数量begin inc(k1); //这里增加 break; //增加了就不用继续循环了end; end; writeln(t-k1); //输出end;end.