LOFTER for ipad —— 让兴趣,更有趣

点击下载 关闭
Luogu P1590 失踪的7

题目描述

远古的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.


推荐文章
评论(0)
分享到
转载我的主页